我正在使用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
结果。
如果需要更多详细信息,请与我们联系。
答案 0 :(得分:4)
好吧,如果我把regexner
放在第一位,事情似乎就像我想要的那样:
"annotators":"regexner,tokenize,ssplit,pos,ner",
似乎在流程的某个阶段存在排序问题?
答案 1 :(得分:4)
以下是RegexNER documentation对此的说法:
RegexNER不会覆盖现有的实体分配,除非您在第三个以制表符分隔的列中赋予它权限,该列包含可以覆盖的以逗号分隔的实体类型列表。只能覆盖非实体O标签,但您可以指定额外的实体标签,这些标签也可以一直被覆盖。
(艺术|法律|科学|工程|神学)学士学位
Lalor LOCATION PERSON
劳工组织
我不确定您的映射文件究竟是什么样子,但如果它只是将实体映射到标签,那么原始NER会将您的实体标记为NUMBER,而RegexNER将无法覆盖它们。如果您明确声明某些NUMBER实体应该在映射文件中被覆盖为SURFACE,那么它应该可以工作。
答案 2 :(得分:0)
当通过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
的方法