在Python中递归删除树中的项目
seen2 = set()
def eliminate_abs(d): ##remove all entries that connect to the abstraction node, type(d) = list
def rec(x):
if x not in seen2:
seen2.add(x)
a = x.hypernyms()
if len(a) != 0:
kk = a[0]
if re.search('abstraction',str(kk)):
syns.remove(ii)
else:
rec(kk)
for ii in d: ##type(ii) = <class 'nltk.corpus.reader.wordnet.Synset'>
rec(ii)
eliminate_abs(syns)
这个“syns”列表最后会变成一棵树,但我首先需要把所有最终连接到“abstraction”这个节点的项去掉。我希望这个函数能递归地检查“syns”中每个项的所有上位词,如果找到“abstraction”,就把原来的词从“syns”中删除。但不知为什么,这个函数只删除了一部分项。
2 个回答
0
我搞明白了。这个代码运行得很好,但在处理的过程中有很多重复的项,所以在第一个之后的那些都被跳过了。把这段代码去掉:
if not x in seen2:
seen2.add(x)
这样就能正常工作了。
2
因为你在遍历 syns
的时候还在修改它,所以你应该先复制一份 syns
的内容,然后再遍历这份复制的列表:
for ii in d[:]:
rec(ii)