为什么有时有时但不总是将货币符号包含在spacy MONEY实体中?

时间:2019-04-18 12:34:44

标签: spacy

在句子“我节省了600美元”。 spacy NER将“ 600美元”识别为金钱实体。
到目前为止,一切都很好。

但是在句子“我节省了600美元”。会将“ 600”识别为货币-没有美元符号!
这似乎不一致。我想念什么吗?

以下是要复制的代码:

import en_core_web_sm
nlp = en_core_web_sm.load()

def print_entities(txt):
    print("Entities for input: '{}'".format(txt))
    doc = nlp(txt)
    for entity in doc.ents:
        print('\t', entity.text, entity.label_)


print_entities("I saved $6 hundred.")
print_entities("I saved $600.")

这给出了输出:

Entities for input: 'I saved $6 hundred.'
     $6 hundred MONEY
Entities for input: 'I saved $600.'
     600 MONEY

我正在使用spacy版本2.1.3和en_core_web_sm版本2.1.0的全新python 3.6.8虚拟环境中进行此操作

2 个答案:

答案 0 :(得分:0)

我确认问题(1)仍然存在,(2)不依赖于货币符号,(3)仅在实体只是符号+数字(即,没有文字表达式)时出现,并且(4)符号未包含在跨度(您可以列出它,它不会出现)或entity.start_charentity.end_char中。

一个简单的技巧是测试文本是否以AND开头并以数字结尾,在这种情况下,您会在前后获得货币符号。例如,如果source是初始凭证,而entity是货币实体:

def complete_text(source, entity):
    t=entity.text
    try:
        float( t[0] + t[len(t)-1] )
    except:
        return t
    if entity[0].nbor(-1).is_currency:
        return entity[0].nbor(-1).text + t
    else:
        return t + entity[0].nbor(1).text

希望会有一些更整洁的建议!

答案 1 :(得分:0)

在开发出更令人满意的解决方案之前,另一种可能的解决方法:

def money_merger(doc):
    with doc.retokenize() as retokenizer:
        for money in [e for e in doc.ents if e.label_ == 'MONEY']:
            if doc[money.start - 1].is_currency:
                retokenizer.merge(doc[
                money.start-1:money.end])
return doc

nlp.add_pipe(money_merger, after='ner')