【问题标题】:Python NLTK NER tagger - won't return ngrams longer than 1Python NLTK NER 标记器 - 不会返回长于 1 的 ngram
【发布时间】:2015-06-25 22:29:43
【问题描述】:

我想从 utf-8 文本中提取实体,但似乎无法让 nltk.stanford.NERTagger 返回长于 1 的 ngram。

有人知道怎么做吗?

import nltk    
NER = nltk.stanford.NERTagger("/Library/Java/Extensions/NER/classifiers/english.all.3class.distsim.crf.ser.gz",
    "/Library/Java/Extensions/NER/stanford-ner.jar")

NER.tag('Game of Thrones by George R. R. Martin'.split()) 

输出是这样的:

[[(u'Game', u'O'),
  (u'of', u'O'),
  (u'Thrones', u'O'),
  (u'by', u'O'),
  (u'George', u'PERSON'),
  (u'R.', u'PERSON'),
  (u'R.', u'PERSON'),
  (u'Martin', u'PERSON')]]

我需要这样的东西:

[[(u'Game', u'O'),
  (u'of', u'O'),
  (u'Thrones', u'O'),
  (u'by', u'O'),
  (u'George R. R. Martin', u'PERSON')]]

我的一位同事在 Java 中调用了相同的 stanford NLP 算法,实体没有按单词分解。

谢谢!

===== 可能重复=====

Chunking Stanford Named Entity Recognizer (NER) outputs from NLTK format

【问题讨论】:

  • 代码示例中的小错误,应该是nltk.tag.stanford.StanfordNERTagger 对吧?

标签: python nltk stanford-nlp


【解决方案1】:

根据 this post 中的 alexis 的回答,Stanford 标注器没有公开区分两个相邻命名实体和占用多个令牌的单个命名实体的方法。

话虽如此,这里提到的解决方案是将标记为同一实体的相邻标记分块在一起通常是一种有效的启发式方法(尽管绝对不是万无一失的):

from itertools import groupby
from pprint import pprint

result = NER.tag('Game of Thrones by George R. R. Martin'.split())
chunked = []
for tag, chunk in groupby(result, lambda x:x[1]):
    if tag == "O":
        chunked.extend((w,t) for (w,t) in chunk)
    else:
        chunked.append((" ".join(w for (w,t) in chunk), tag))
pprint(chunked)

给出输出:

[(u'Game', u'O'),
 (u'of', u'O'),
 (u'Thrones', u'O'),
 (u'by', u'O'),
 (u'George R. R. Martin', u'PERSON')]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 2015-08-29
    相关资源
    最近更新 更多