mirror of
https://git.freebsd.org/ports.git
synced 2025-04-28 09:36:41 -04:00
128 lines
3.2 KiB
Python
128 lines
3.2 KiB
Python
# some accessing of the semantic concordance data for wordnet 1.6
|
|
# by Des Berry, berry@ais.it
|
|
|
|
import string, os
|
|
from wordnet import binarySearchFile
|
|
|
|
# Sample entries in the 'taglist' file
|
|
# ordinary%1:18:01:: 1 br-a01:78,1;86,1;88,4
|
|
# ordered%5:00:00:organized:01 2 br-j23:6,14;13,32;66,12
|
|
# where the general form is:
|
|
# lemma%ss_type:lex_filenum:lex_id:head_word:head_id sense_number
|
|
[location_list]
|
|
# location_list: filename:sent_num,word_num[;sent_num,word_num...]
|
|
|
|
ss_type = ("NOUN", "VERB", "ADJECTIVE", "ADVERB", "ADJECTIVE SATELLITE")
|
|
|
|
# given a sentence number (and the contents of a semantic concordance file)
|
|
# return a string of words as the sentence
|
|
def find_sentence(snum, msg):
|
|
str = "<s snum=%s>" % snum
|
|
s = string.find(msg, str)
|
|
if s < 0:
|
|
return "<Unknown>"
|
|
s = s + len(str)
|
|
sentence = ""
|
|
tag = ""
|
|
while 1:
|
|
if msg[s] == '\n':
|
|
s = s + 1
|
|
n = string.find(msg, '<', s)
|
|
if n < 0:
|
|
break
|
|
if n - s != 0:
|
|
if tag == "w" and msg[s] != "'" and len(sentence) > 0: # word form
|
|
sentence = sentence + " "
|
|
sentence = sentence + msg[s:n]
|
|
e = string.find(msg, '>', n)
|
|
if e < 0:
|
|
break
|
|
tag = msg[n+1]
|
|
if tag == "/": #check for ending sentence
|
|
if msg[n+2] == 's':
|
|
#end of sentence
|
|
break
|
|
s = e + 1
|
|
return sentence
|
|
|
|
# given a taglist sense (one line of the tagfile) and where to find the tagfile (root)
|
|
# return a tuple of
|
|
# symset type ('1' .. '5')
|
|
# sense (numeric character string)
|
|
# list of sentences (constructed from the taglist)
|
|
def tagsentence(tag, root):
|
|
s = string.find(tag, '%')
|
|
sentence = []
|
|
type = tag[s+1]
|
|
c = s
|
|
for i in range(0,4):
|
|
c = string.find(tag, ':', c + 1)
|
|
c = string.find(tag, ' ', c + 1)
|
|
sense = tag[c+1]
|
|
c = c + 3
|
|
while 1:
|
|
d = string.find(tag, ' ', c) # file separator
|
|
if d < 0:
|
|
loclist = tag[c:]
|
|
else:
|
|
loclist = tag[c:d]
|
|
c = d + 1
|
|
|
|
e = string.find(loclist, ':')
|
|
filename = loclist[:e]
|
|
fh = open(root + filename, "rb")
|
|
msg = fh.read()
|
|
fh.close()
|
|
|
|
while 1:
|
|
e = e + 1
|
|
f = string.find(loclist, ';', e)
|
|
if f < 0:
|
|
sent_word = loclist[e:]
|
|
else:
|
|
sent_word = loclist[e:f]
|
|
e = f
|
|
|
|
g = string.find(sent_word, ',')
|
|
sent = sent_word[:g]
|
|
|
|
sentence.append(find_sentence(sent, msg))
|
|
|
|
if f < 0:
|
|
break
|
|
|
|
if d < 0:
|
|
break
|
|
return (type, sense, sentence)
|
|
|
|
# given a word to search for and where to find the files (root)
|
|
# displays the information
|
|
# This could be changed to display in different ways!
|
|
def sentences(word, root):
|
|
cache = {}
|
|
file = open(root + "taglist", "rb")
|
|
key = word + "%"
|
|
keylen = len(key)
|
|
binarySearchFile(file, key + " ", cache, 10)
|
|
print("Word '%s'" % word)
|
|
while 1:
|
|
line = file.readline()
|
|
if line[:keylen] != key:
|
|
break
|
|
type, sense, sentence = tagsentence(line, root + "tagfiles/")
|
|
print(ss_type[string.atoi(type) - 1], sense)
|
|
for sent in sentence:
|
|
print(sent)
|
|
|
|
|
|
def _test(word, corpus, base):
|
|
print(corpus)
|
|
sentences("ordinary", base + corpus + "/")
|
|
|
|
if __name__ == '__main__':
|
|
base = "C:/win16/dict/semcor/"
|
|
word = "ordinary"
|
|
_test(word, "brown1", base)
|
|
_test(word, "brown2", base)
|
|
_test(word, "brownv", base)
|
|
|