# 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)
|