【问题标题】:Having both NER and RegexNER tags in StanfordCoreNLPServer output?StanfordCoreNLPServer 输出中同时包含 NER 和 RegexNER 标签?
【发布时间】:2016-06-17 13:36:19
【问题描述】:

我正在使用 StanfordCoreNLPServer 从文本中提取一些信息(例如表面、街道名称)

街道由经过专门训练的 NER 模型给出,表面由通过 RegexNER 的简单正则表达式给出。

它们每个都可以单独工作,但是当一起使用时,只有 NER 结果出现在输出中,位于ner 标签下。为什么没有regexner标签?有没有办法获得 RegexNER 结果?

信息:

  • StanfordCoreNLP v3.6.0

  • 使用的网址:

    'http://127.0.0.1:9000/'
    '?properties={"annotators":"tokenize,ssplit,pos,ner,regexner", '
    '"pos.model":"edu/stanford/nlp/models/pos-tagger/french/french.tagger",'
    '"tokenize.language":"fr",'
    '"ner.model":"ner-model.ser.gz", ' # custom NER model with STREET labels
    '"regexner.mapping":"rules.tsv", ' # SURFACE label
    '"outputFormat": "json"}'
    

    按照here 的建议,regexner 注释器ner 之后,但仍然...

  • 当前输出(摘录):

    {u'index': 4, u'word': u'dans', u'lemma': u'dans', u'pos': u'P', u'characterOffsetEnd': 12, u'characterOffsetBegin': 8, u'originalText': u'dans', u'ner': u'O'}
    {u'index': 5, u'word': u'la', u'lemma': u'la', u'pos': u'DET', u'characterOffsetEnd': 15, u'characterOffsetBegin': 13, u'originalText': u'la', u'ner': u'O'}
    {u'index': 6, u'word': u'rue', u'lemma': u'rue', u'pos': u'NC', u'characterOffsetEnd': 19, u'characterOffsetBegin': 16, u'originalText': u'rue', u'ner': u'STREET'}
    {u'index': 7, u'word': u'du', u'lemma': u'du', u'pos': u'P', u'characterOffsetEnd': 22, u'characterOffsetBegin': 20, u'originalText': u'du', u'ner': u'STREET'}
    [...]
    {u'index': 43, u'word': u'165', u'lemma': u'165', u'normalizedNER': u'165.0', u'pos': u'DET', u'characterOffsetEnd': 196, u'characterOffsetBegin': 193, u'originalText': u'165', u'ner': u'NUMBER'}
    {u'index': 44, u'word': u'm', u'lemma': u'm', u'pos': u'NC', u'characterOffsetEnd': 198, u'characterOffsetBegin': 197, u'originalText': u'm', u'ner': u'O'}
    {u'index': 45, u'word': u'2', u'lemma': u'2', u'normalizedNER': u'2.0', u'pos': u'ADJ', u'characterOffsetEnd': 199, u'characterOffsetBegin': 198, u'originalText': u'2', u'ner': u'NUMBER'}
    
  • 预期输出:我希望最后 3 个项目用SURFACE 标记,即RegexNER 结果。

如果需要更多详细信息,请告诉我。

【问题讨论】:

    标签: stanford-nlp stanford-nlp-server


    【解决方案1】:

    RegexNER documentation 对此是这么说的:

    RegexNER 不会覆盖现有的实体分配,除非您在第三个制表符分隔的列中授予它权限,其中包含可以覆盖的实体类型的逗号分隔列表。只有非实体 O 标签始终可以被覆盖,但您可以指定额外的实体标签,这些标签也始终可以被覆盖。

    (艺术|法律|科学|工程|神学)学士学位

    劳力定位人员

    劳工组织

    我不确定您的映射文件到底长什么样,但如果它只是将实体映射到标签,那么原始 NER 会将您的实体标记为 NUMBER,RegexNER 将无法覆盖它们。如果您在映射文件中明确声明某些 NUMBER 实体应被覆盖为 SURFACE,那么它应该可以工作。

    【讨论】:

      【解决方案2】:

      好的,如果我把 regexner 放在首位,事情似乎可以按我的意愿工作:

      "annotators":"regexner,tokenize,ssplit,pos,ner",
      

      似乎在流程的某个阶段存在排序问题?

      【讨论】:

      • 你确定上面的行没有错误吗?
      • 是的,它与问题中描述的设置有关。
      • 如果我使用您在答案中提到的注释器顺序运行代码,它会给出“注释器“regexner”需要注释器“tokenize””
      • 嗯,这很奇怪。我对Java的了解不够,无法解释这一点。可能和locals LC_*有关(我在法语系统上运行)?
      【解决方案3】:

      通过 python 更新 coreNLP 3.9.2 服务器:

      当通过 python 使用 coreNLP 3.9.2 服务器时,regexner 现在也可以作为 ner as per the docs 的一部分启动。例如:

      from pycorenlp import StanfordCoreNLP
      nlp = StanfordCoreNLP('http://localhost:9000')
      
      properties={"annotators":"tokenize,ssplit,pos,lemma,ner,coref,openie",
                  "outputFormat": "json",
                  "ner.fine.regexner.mapping":"rules.txt",}
      
      output = nlp.annotate(text,properties=properties)
      

      我无法通过直接调用 regexner 注释器来工作。我认为这是由于重新加载依赖项和/或用于将输出转换为 JSON 的方法e.g. this issue

      【讨论】:

        猜你喜欢
        • 2014-09-19
        • 1970-01-01
        • 1970-01-01
        • 2016-10-14
        • 1970-01-01
        • 2012-10-31
        • 2013-01-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多