gpt4 book ai didi

python - 从 nltk 树中获取单词的深度

转载 作者:太空宇宙 更新时间:2023-11-03 15:56:46 25 4
gpt4 key购买 nike

我正在开发一个 nlp 项目,我想根据单词在依赖树中的位置过滤掉单词。

为了绘制树,我使用了 post 中的代码:

def to_nltk_tree(node):

if node.n_lefts + node.n_rights > 0:
return Tree(node.orth_, [to_nltk_tree(child) for child in node.children])
else:
return node.orth_

示例句子:

“世界各地的一群人突然在精神上联系在一起”

我得到了这棵树:

enter image description here

从这棵树中,我想要得到的是包含单词及其在树中相应深度的元组列表:

[(linked,1),(are,2),(suddenly,2),(mentally,2),(group,2),(A,3),(of,3),(people,4)....]

对于这种情况,我对没有子项的单词不感兴趣:[are,suddenly,mentally,A,the]因此,到目前为止我所能做的就是仅获取有子项的单词列表,因此我使用以下代码:

def get_words(root,words):
children = list(root.children)
for child in children:
if list(child.children):
words.append(child)
get_words(child,words)
return list(set(words)

[to_nltk_tree(sent.root).pretty_print() for sent in doc.sents]
s_root = list(doc.sents)[0].root
words = []
words.append(s_root)
words = get_words(s_root,words)
words

[around, linked, world, of, people, group]

从中我如何获得所需的包含单词及其各自深度的元组?

最佳答案

您确定代码中存在 nltk Tree 吗? nltk 的 Tree 类没有 children 属性。使用 nltk Tree,您可以通过使用“treepositions”(树的路径)来完成您想要的操作。每条路径都是分支选择的元组。 “people”的树位置是(0, 2, 1, 0),正如你所看到的,节点的深度就是它的树位置的长度。

首先,我获取叶子的路径,以便排除它们:

t = nltk.Tree.fromstring("""(linked (are suddenly mentally 
(group A (of (people (around (world the)))))))""")
n_leaves = len(t.leaves())
leavepos = set(t.leaf_treeposition(n) for n in range(n_leaves))

现在可以轻松列出非终端节点及其深度:

>>> for pos in t.treepositions():
if pos not in leavepos:
print(t[pos].label(), len(pos))
linked 0
are 1
group 2
of 3
people 4
around 5
world 6

顺便说一句,nltk树有自己的显示方法。尝试 print(t)t.draw(),它会在弹出窗口中绘制树。

关于python - 从 nltk 树中获取单词的深度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40710664/

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