当单词的同义词存在时,为什么代码在python中返回IndexError错误

时间:2013-03-31 08:39:15

标签: python-2.7 nltk wordnet

我不明白为什么我会收到此错误。请帮忙

>>> mylist = []
>>> file1 = open("medDict.txt", "r")
>>> for line in file1:
    from nltk.corpus import wordnet
    print line
    wordFromList2 = wordnet.synsets(line)[0]
    mylist.append(wordFromList2)


abnormal


Traceback (most recent call last):
  File "<pyshell#10>", line 4, in <module>
    wordFromList2 = wordnet.synsets(line)[0]
IndexError: list index out of range

medDict.txt包含以下单词

abnormal
acne
ache
diarrhea
fever

2 个答案:

答案 0 :(得分:1)

@Blender关于word.synsets()的空白敏感度是正确的。如果您需要使用自然语言访问空格的任何synsets,Wordnet将使用下划线 _而不是。例如。如果您想查找kick the bucket之类的内容,可以使用wn.synsets("kick_the_bucket")

从NLTK WN界面访问同义词集
>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('kick the bucket')
[]
>>> wn.synsets('kick_the_bucket')
[Synset('die.v.01')]

但请注意,有时WordNet会使用破折号而不是下划线编码某些synset。例如。可以访问9-11,但9_11不可访问。

>>> wn.synsets('9-11')
[Synset('9/11.n.01')]
>>> wn.synsets('9_11')
[]

现在解决您的代码问题。

1。当您逐行读取文件时,您还会读取该行中不可见但存在的\n。所以你需要改变这个:

>>> mylist = []
>>> file1 = open("medDict.txt", "r")

到此:

>>> words_from_file = [i.strip() for i in open("medDict.txt", "r")]

2。我不太确定你真的想要wordnet.synsets(word)[0],这意味着你只是采取第一感,请注意它可能不是Most Frequent Sense (MFS)。所以不要这样做:

>>> wordFromList2 = wordnet.synsets(line)[0]
>>> mylist.append(wordFromList2)

我认为更恰当的方法是使用set代替update集合

>>> list_of_synsets = set()
>>> for i in words_from_file:
>>>  list_of_synsets.update(wordnet.synsets(i))
>>> print list_of_synsets

答案 1 :(得分:0)

word.synsets()是空格敏感的:

>>> wordnet.synsets('abnormal')
    [Synset('abnormal.a.01'), Synset('abnormal.a.02'), Synset('abnormal.s.03')]
>>> wordnet.synsets(' abnormal')
    []

.strip()在你传入之前的行中的空格:

wordFromList2 = wordnet.synsets(line.strip())[0]