Sal*_*lah 4 python nlp nltk pos-tagger
这是我的项目的一部分,我需要在短语检测之后表示输出 - (a,x,b)其中a,x,b是短语.我构造了代码并获得了如下输出:
(CLAUSE (NP Jack/NNP) (VP loved/VBD) (NP Peter/NNP))
(CLAUSE (NP Jack/NNP) (VP stayed/VBD) (NP in/IN London/NNP))
(CLAUSE (NP Tom/NNP) (VP is/VBZ) (NP in/IN Kolkata/NNP))
Run Code Online (Sandbox Code Playgroud)
我想让它像前面的表示一样,这意味着我必须删除'CLAUSE','NP','VP','VBD','NNP'等标签.
怎么做?
首先将其写入文本文件,标记化并使用list.remove('word').但这根本没有用.我要澄清一点.
(CLAUSE (NP Jack/NNP) (VP loved/VBD) (NP Peter/NNP))
(CLAUSE (NP Jack/NNP) (VP stayed/VBD) (NP in/IN London/NNP))
[杰克,爱,彼得],[杰克,留在伦敦]输出只是根据大括号而没有标签.
自从你标记了这个nltk,让我们使用NLTK的树解析器来处理你的树.我们将在每棵树上阅读,然后简单地打印出树叶.完成.
>>> text ="(CLAUSE (NP Jack/NNP) (VP stayed/VBD) (NP in/IN London/NNP))"
>>> tree = nltk.Tree.fromstring(text, read_leaf=lambda x: x.split("/")[0])
>>> print(tree.leaves())
['Jack', 'stayed', 'in', 'London']
Run Code Online (Sandbox Code Playgroud)
lambda形式拆分每一word/tag对并丢弃标签,只保留单词.
我知道,你会问我如何处理整个文件的价值这些树,其中一些需要不止一行.这是NLTK的工作BracketParseCorpusReader,但它希望终端的形式(POS word)而不是word/POS.我不会这样做,因为它更容易欺骗Tree.fromstring()读取所有树木,就像它们是一棵树的分支一样:
allmytext = """
(CLAUSE (NP Jack/NNP) (VP loved/VBD) (NP Peter/NNP))
(CLAUSE (NP Jack/NNP) (VP stayed/VBD) (NP in/IN London/NNP))
(CLAUSE (NP Tom/NNP) (VP is/VBZ) (NP in/IN Kolkata/NNP))
"""
wrapped = "(ROOT "+ allmytext + " )" # Add a "root" node at the top
trees = nltk.Tree.fromstring(wrapped, read_leaf=lambda x: x.split("/")[0])
for tree in trees:
print(tree.leaves())
Run Code Online (Sandbox Code Playgroud)
正如你看到的,唯一的区别是,我们增加"(ROOT "和" )"周围的文件内容,并使用一个for循环来生成输出.循环为我们提供了顶级节点的子节点,即实际的树.