我有一个单词列表。我在WordNet中查找每个单词并选择第一个synset。第一个synset在我的终端上正确显示(例如:Synset('prior.n.01'))。然后,我尝试在转换后的字符串上使用替换正则表达式。预期的输出是'prior.n.01'。但我得到的是那些带有数字的方框。由于我的终端可以在更换之前显示字符串,我猜测问题并非来自于此。那么,这个正则表达式有什么问题吗?是因为我在最初是列表元素的字符串上使用它吗?
这是我正在使用的代码:
import re
import nltk
from nltk.corpus import wordnet as wn
word_list = ['prior','indication','link','linked','administered','foobar']
for word in word_list:
synset_list = wn.synsets(word) #returns a list of all synsets for a word
if synset_list == []: #break if word in list isn't in dictionary (empty list)
break
else:
first_synset = str(synset_list[0]) #returns Synset('prior.n.01') as string
print first_synset
clean_synset = re.sub(r'Synset\((.+)\)',r'\1',first_synset) #expected output: 'prior.n.01'
print clean_synset
答案 0 :(得分:1)
实际上有Synset.name()
函数来提取同义词集名称:
>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('dog')[0].name()
u'dog.n.01'
还有一个Synset.unicode_repr()
,它可以避免任何编码/字节码问题。回到正则表达式:
>>> x = wn.synsets('dog')[0].unicode_repr()
>>> re.sub(r'Synset\((.+)\)','\1',x)
u'\x01'
>>> re.sub(r'Synset\((.+)\)','1',x)
u'1'
>>> re.sub(r'Synset\((.+)\)','\\1',x)
u"'dog.n.01'"
>>> re.sub(r"Synset\(\'(.+)\'\)",'\\1',x)
u'dog.n.01'