gpt4 book ai didi

带有 nltk.wordnet.synsets 的 Python IF 语句

转载 作者:行者123 更新时间:2023-11-28 22:00:10 25 4
gpt4 key购买 nike

import nltk
from nltk import *
from nltk.corpus import wordnet as wn

output=[]
wordlist=[]

entries = nltk.corpus.cmudict.entries()

for entry in entries[:200]: #create a list of words, without the pronounciation since.pos_tag only works with a list
wordlist.append(entry[0])

for word in nltk.pos_tag(wordlist): #create a list of nouns
if(word[1]=='NN'):
output.append(word[0])

for word in output:
x = wn.synsets(word) #remove all words which does not have synsets (this is the problem)
if len(x)<1:
output.remove(word)

for word in output[:200]:
print (word," ",len(wn.synsets(word)))

我试图删除所有没有同义词集的单词,但由于某种原因它不起作用。运行该程序后,我发现即使据说某个单词具有 len(wn.synsets(word)) = 0,它也不会从我的列表中删除。谁能告诉我哪里出了问题?

最佳答案

您不能在遍历列表的同时删除当前项目。这是一个演示问题的玩具示例:

In [73]: output = range(10)

In [74]: for item in output:
....: output.remove(item)

您可能希望删除 output 中的所有项目。但是其中一半仍然存在:

In [75]: output
Out[75]: [1, 3, 5, 7, 9]

为什么不能同时循环和删除:

想象一下 Python 使用一个内部计数器来记住当前项目在 for-loop 中的索引。

当计数器等于0时(第一次通过循环),Python执行

output.remove(item)

很好。 output 中现在少了一项。但随后 Python 将计数器递增到 1。因此 word 的下一个值是 output[1],这是原始列​​表中的第三个​​项。

0  <-- first item removed
1 <-- the new output[0] ** THIS ONE GETS SKIPPED **
2 <-- the new output[1] -- gets removed on the next iteration

(解决方法)解决方案:

相反,要么遍历 output 的副本,要么构建一个新列表。在这种情况下,我认为建立一个新列表更高效:

new_output = []
for word in output:
x = wn.synsets(word)
if len(x)>=1:
new_output.append(word)

关于带有 nltk.wordnet.synsets 的 Python IF 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15366924/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com