自然语言处理(NLP)是语言学的一个分支,专注于计算机理解文本或语音形式语言的能力。NLP的任务包括语音识别、情感分析和命名实体识别(NER)。本文将重点介绍NER及其在现实世界中的用例,并最终使用HuggingFace嵌入训练自定义模型。
NER,即命名实体识别,是NLP中用于识别和提取预定义(或预训练)类别实体的关键组成部分。这些实体可以是人名、地点、组织、国家、城市等,具体取决于训练模型的类别。例如,在给定的例子中,模型可以提取人名、组织和地点实体。
NER在现实世界中有多种应用,包括但不限于:
1) 高效的搜索算法:NER可以从搜索查询中提取相关实体,以获得更好的搜索结果。
2) 简历解析:在各种公司和跨国公司中,NER用于简历解析,通过提取候选人的相关信息来筛选出数千名申请者中的最佳候选人。
3) PII(个人身份信息)提取:保护用户的个人信息是每个公司都需要关注的重要任务。NER有助于提取PII实体,如姓名、出生日期、信用卡号、社会安全号码、电话号码等,以便进行掩码处理。
4) 聊天机器人:NER最常见的用途之一是聊天机器人。聊天机器人使用NER提取关键词以回答用户查询。
将使用Hugging Face(一个提供开源NLP技术的公司)的Flair嵌入来训练自己的NER模型。训练NER模型需要大量的数据,但不用担心,CoNLL-2003数据集可以提供帮助。CoNLL-2003包含大量注释和未注释的数据集,用于训练、测试和验证。
NER数据集应包含两列,由单个空格分隔。第一列包含一个单词,第二列包含命名实体标签。注意:第一列必须包含一个单词。CoNLL-03包含4列,第一列包含单个单词,第二列是词性标注,第三列是句法块标签,第四列是命名实体标签。在大多数情况下,第二列和第三列是可选的。
安装Flair:
pip install flair
导入所需的类和嵌入:
from flair.data import Corpus
from flair.datasets import CONLL_03
from flair.embeddings import WordEmbeddings, StackedEmbeddings, FlairEmbeddings
初始化所需的变量:
corpus: Corpus = CONLL_03()
tag_type = 'ner'
tag_dictionary = corpus.make_tag_dictionary(tag_type=tag_type)
初始化想要用于模型训练的嵌入。Huggingface提供了多种嵌入,每种嵌入都有其独特的用途。
embedding_types = [
# GloVe嵌入
WordEmbeddings('glove'),
# 上下文字符串嵌入,向前
FlairEmbeddings('news-forward'),
# 上下文字符串嵌入,向后
FlairEmbeddings('news-backward'),
]
使用StackedEmbeddings组合所有嵌入:
embeddings = StackedEmbeddings(embeddings=embedding_types)
from flair.models import SequenceTagger
tagger = SequenceTagger(hidden_size=256,
embeddings=embeddings,
tag_dictionary=tag_dictionary,
tag_type=tag_type)
from flair.trainers import ModelTrainer
trainer = ModelTrainer(tagger, corpus)
trainer.train('resources/taggers/ner-english',
train_with_dev=True,
max_epochs=150)
from flair.data import Sentence
from flair.models import SequenceTagger
model = SequenceTagger.load('resources/taggers/ner-english/final-model.pt')
sentence = Sentence("George Washington lives in Washington")
model.predict(sentence)
for entity in sentence.get_spans('ner'):
print(entity)