NLTK-将分块的树转换为列表(IOB标记)

pel*_*tor 0 nltk nltk-trainer

我需要执行命名实体识别/分类,并以IOB标签格式生成输出。

我正在使用NLTK-train库提供的NLTK块程序,但是会生成树,而不是IOB标签列表。

def chunk_iob(list_of_words):
    nltk_tagger = nltk.data.load("taggers/conll2002_aubt.pickle")
    nltk_chunker = nltk.data.load("chunkers/conll2002_NaiveBayes.pickle")

    t = nltk_tagger.tag(list_of_words)
    print(t)
    c = nltk_chunker.parse(t)
    print(c)
Run Code Online (Sandbox Code Playgroud)

然后我们将c作为树,例如:

(S
  (LOC Barcelona/NC)
  (PER Juan/NC :/Fd)
Run Code Online (Sandbox Code Playgroud)

...

但是我正在寻找类似的东西:

Barcelona - LOC
Juan - PER
...
Run Code Online (Sandbox Code Playgroud)

这是list_of_words参数的带有IOB标签的列表,其顺序与list_of_words相同。

如何从树中获取该标记列表?

bog*_*ogs 5

您正在寻找的是tree2conlltags它的反面conlltags2tree。运作方式如下:

from nltk import word_tokenize, pos_tag, ne_chunk
from nltk import conlltags2tree, tree2conlltags


tree = ne_chunk(pos_tag(word_tokenize("New York is my favorite city")))
print tree
# (S (GPE New/NNP York/NNP) is/VBZ my/PRP$ favorite/JJ city/NN)

iob_tags = tree2conlltags(tree)
print iob_tags
# [('New', 'NNP', u'B-GPE'), ('York', 'NNP', u'I-GPE'), ('is', 'VBZ', u'O'), ('my', 'PRP$', u'O'), ('favorite', 'JJ', u'O'), ('city', 'NN', u'O')]

tree = conlltags2tree(iob_tags)
print tree
# (S (GPE New/NNP York/NNP) is/VBZ my/PRP$ favorite/JJ city/NN)
Run Code Online (Sandbox Code Playgroud)

请注意,IOB标签以以下格式表示:B- {tag}开始,I- {tag}表示内部,O表示外部。