如何获取NLTK Semcor中Tree的Lemma及树类型?
搞定NLTK Semcor的两个实用需求
嘿,这两个需求我熟!先把基础的加载代码放出来,确保我们在同一个频道上:
import nltk nltk.download('semcor') from nltk.corpus import semcor
1. 获取包含Lemma的Tree节点
你要的Tree(Lemma('group.n.01.group'))这种结构,其实就是semcor.tagged_sents(tag="sem")返回的句子中的Tree元素。这里给你两种方法:
通用遍历法:如果你不确定目标节点的位置,可以遍历句子找到带Lemma的Tree:
first_sent = semcor.tagged_sents(tag="sem")[0] lemma_tree = None for item in first_sent: # 判断是否为含Lemma的Tree if hasattr(item, 'label') and isinstance(item.label(), nltk.corpus.reader.wordnet.Lemma): lemma_tree = item break print(lemma_tree) # >>> Tree(Lemma('group.n.01.group'), [Tree('NE', ['Fulton', 'County', 'Grand', 'Jury'])])直接索引法:要是你已经知道目标节点的位置(比如你示例里的第2个元素),直接索引更高效:
lemma_tree = semcor.tagged_sents(tag="sem")[0][1] print(lemma_tree) # >>> Tree(Lemma('group.n.01.group'), [Tree('NE', ['Fulton', 'County', 'Grand', 'Jury'])])
2. 获取子树的类型(比如'NE')
拿到上面的Lemma Tree后,它的子节点就是带类型标签的Tree。要获取标签(比如'NE'),只需要调用子Tree的.label()方法:
# 从Lemma Tree中取出子树 ne_tree = lemma_tree[0] # 获取树的类型 tree_type = ne_tree.label() print(tree_type) # >>> 'NE'
或者直接用索引链一步到位:
tree_type = semcor.tagged_sents(tag="sem")[0][1][0].label() print(tree_type) # >>> 'NE'
内容的提问来源于stack exchange,提问作者Emil
相关产品推荐
相关产品推荐

