在句子“我节省了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虚拟环境中进行此操作
答案 0 :(得分:0)
我确认问题(1)仍然存在,(2)不依赖于货币符号,(3)仅在实体只是符号+数字(即,没有文字表达式)时出现,并且(4)符号未包含在跨度(您可以列出它,它不会出现)或entity.start_char
和entity.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')