如何使分词器识别日期

How to make the tokenizer to identify dates

我正在使用 en_core_web_lg ,我遇到过分词器没有正确分割日期的情况:

self._nlp = spacy.load("en_core_web_lg")       
self._nlp.tokenizer = spacy.tokenizer.Tokenizer(self._nlp.vocab)

文本='hi good thank you I am Chris July 6 1990'

代币是:

[('hi', 'hi', 'INTJ', 'UH', 'advmod', 'xx', True, False), 
('good', 'good', 'ADJ', 'JJ', 'ROOT', 'xxxx', True, False), 
('thank', 'thank', 'VERB', 'VBP', 'ROOT', 'xxxx', True, False), 
('you', '-PRON-', 'PRON', 'PRP', 'dobj', 'xxx', True, True), 
('I', '-PRON-', 'PRON', 'PRP', 'nsubj', 'X', True, True), 
('am', 'be', 'AUX', 'VBP', 'ROOT', 'xx', True, True), 
('Chris', 'Chris', 'PROPN', 'NNP', 'compound', 'Xxxx', True, False), 
('July', 'July', 'PROPN', 'NNP', 'attr', 'Xxxx', True, False), 
('6', '6', 'NUM', 'CD', 'nummod', 'd', False, False), 
('1982', '1990', 'NUM', 'CD', 'nummod', 'dddd', False, False)]

有没有办法让分词器做类似的事情:

[('hi', 'hi', 'INTJ', 'UH', 'advmod', 'xx', True, False), 
('good', 'good', 'ADJ', 'JJ', 'ROOT', 'xxxx', True, False), 
('thank', 'thank', 'VERB', 'VBP', 'ROOT', 'xxxx', True, False), 
('you', '-PRON-', 'PRON', 'PRP', 'dobj', 'xxx', True, True), 
('I', '-PRON-', 'PRON', 'PRP', 'nsubj', 'X', True, True), 
('am', 'be', 'AUX', 'VBP', 'ROOT', 'xx', True, True), 
('Chris', 'Chris', 'PROPN', 'NNP', 'compound', 'Xxxx', True, False), 
('July 6 1982', 'July 6 1982', '?????', '?????', '?????', '?????', True, False)]

请忽略 ????因为我不确定结果会是什么。

或者有没有一种方法(无需训练模型)让 NER 正确识别日期?

谢谢,

尼尔

该字符串已被 NER 组件标记为 DATE,即使在小型模型中也是如此。

import spacy

nlp = spacy.load("en_core_web_sm")

text = "hi good thank you I am Chris July 6 1990"

for ent in nlp(text).ents:
    print(ent.label_, ent, sep="\t")

输出:

PERSON  Chris
DATE    July 6 1990

如果您想将实体(如日期)合并为单个标记there is a pipeline function,那么您只需一行即可完成。