我正在研究一个关于简历数据集的命名实体识别,我们有一些实体,如日期,电话,电子邮件等。
我正在研究如何对这些实体进行预处理。我目前在每个标点符号后加一个空格,像这样。
DAVID B-Name
John I-Name
, O
IT O
Washington B-Address
, I-Address
DC I-Address
( B-Phone
107 I-Phone
) I-Phone
155
- I-Phone
4838 I-Phone
david B-Email
. I-Email
John I-Email
@ I-Email
gmail I-Email
. I-Email
com I-Email
但我开始质疑在推理过程中如何处理这些文本。我假设即使在推理时,我们也必须使用同样的流程对文本进行预处理,即在每个标点符号后加一个空格,是吗?
但这样就不那么可读了,对吗?
例如,在推理时,我必须提供输入文本,如 test @ example . com?
这是不可读的,不是吗?它只能预测这种格式的实体。
你要处理的问题是叫作 代币化. 为了处理你提出的格式化问题,通常框架会以保留原始文本的方式从底层文本中提取标记,例如跟踪每个标记的字符开始和结束。
比如说 SpaCy 在Python中返回一个存储所有这些信息的对象。
import spacy
from pprint import pprint
nlp = spacy.load("en_core_web_sm")
doc = nlp("DAVID John, IT\nWashington, DC (107) 155-4838 [email protected]")
pprint([(token.text, token.idx, token.idx + len(token.text)) for token in doc])
输出。
[('DAVID', 0, 5),
('John', 6, 10),
(',', 10, 11),
('IT', 12, 14),
('\n', 14, 15),
('Washington', 15, 25),
(',', 25, 26),
('DC', 27, 29),
('(', 30, 31),
('107', 31, 34),
(')', 34, 35),
('155', 36, 39),
('-', 39, 40),
('4838', 40, 44),
('[email protected]', 45, 65)]
你可以自己做同样的事情 (例如在添加空格时保持一个计数器),或者使用现有的 tokenizer (例如 SpaCy、CoreNLP、tensorflow 等) 。