百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

5分钟NLP快速实现NER的3个预训练库总结

toyiye 2024-06-21 12:15 7 浏览 0 评论

在文本自动理解的NLP任务中,命名实体识别(NER)是首要的任务。NER模型的作用是识别文本语料库中的命名实体例如人名、组织、位置、语言等。

NER模型可以用来理解一个文本句子/短语的意思。它可以识别文本中可能代表who、what和whom的单词,以及文本数据所指的其他主要实体。

在本文中,我们将介绍对文本数据执行 NER 的 3 种技术。 这些技术将涉及预训练和定制训练的命名实体识别模型。

  • 基于 NLTK 的预训练 NER
  • 基于 Spacy 的预训练 NER
  • 基于 BERT 的自定义 NER

基于NLTK的预训练NER模型:

NLTK包提供了一个经过预先训练的NER模型的实现,它可以用几行Python代码实现NER功能。NLTK包提供了一个参数选项:要么识别所有命名实体,要么将命名实体识别为它们各自的类型,比如人、地点、位置等。

如果binary=True,那么模型只会在单词为命名实体(NE)或非命名实体(NE)时赋值,否则对于binary=False,所有单词都将被赋值一个标签。

entities = []
tags = []
sentence = nltk.sent_tokenize(text)
for sent in sentence:
for chunk in nltk.ne_chunk(nltk.pos_tag(nltk.word_tokenize(sent)), binary=False):
if hasattr(chunk,'label'):
entities.append(' '.join(c[0] for c in chunk))
tags.append(chunk.label())

entities_tags = list(set(zip(entities,tags)))
entities_df = pd.DataFrame(entities_tags)
entities_df.columns = ["Entities","Tags"]

输入示例文本:

结果如下:

基于 Spacy 的预训练 NER

Spacy 包提供预训练的深度学习 NER 模型,可用文本数据的 NER 任务。 Spacy 提供了 3 个经过训练的 NER 模型:en_core_web_sm、en_core_web_md、en_core_web_lg。

NER 模型可以使用 python -m spacy download en_core_web_sm 下载并使用 spacy.load(“en_core_web_sm”) 加载。

!python -m spacy download en_core_web_sm
import spacy 
from spacy import displacy
nlp = spacy.load("en_core_web_sm")
doc = nlp(text)
entities, labels, position_start, position_end = [], [], [], []
for ent in doc.ents:
entities.append(ent)
labels.append(ent.label_)
position_start.append(ent.start_char)
position_end.append(ent.end_char)

df = pd.DataFrame({'Entities':entities,'Labels':labels,'Position_Start':position_start, 'Position_End':position_end})

还是上面的文字,结果如下:

基于 BERT 的 NER

使用 NLTK 和 spacy 的 NER 模型的前两个实现是预先训练的,并且这些包提供了 API 以使用 Python 函数执行 NER。

对于某些自定义域,预训练模型可能表现不佳或可能未分配相关标签。 这时可以使用transformer训练基于 BERT 的自定义 NER 模型。

# Import necessary packages
import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from simpletransformers.ner import NERModel, NERArgs
# Read sample training NER data
data = pd.read_csv("sample_ner_dataset.csv", encoding="latin1")
data = data.fillna(method ="ffill")
# Label Encode
data["Sentence #"] = LabelEncoder().fit_transform(data["Sentence #"] )
data.rename(columns={"Sentence #":"sentence_id","Word":"words","Tag":"labels"}, inplace =True)
data["labels"] = data["labels"].str.upper()
# Train test split
X = data[["sentence_id","words"]]
Y = data["labels"]
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size =0.2)
# Building up train data and test data
train_data = pd.DataFrame({"sentence_id":x_train["sentence_id"],"words":x_train["words"],"labels":y_train})
test_data = pd.DataFrame({"sentence_id":x_test["sentence_id"],"words":x_test["words"],"labels":y_test})
# Initializing NER model configurations
label = data["labels"].unique().tolist()
args = NERArgs()
args.num_train_epochs = 1
args.learning_rate = 1e-4
args.overwrite_output_dir =True
args.train_batch_size = 32
args.eval_batch_size = 32
# Train BERT based NER model
model = NERModel('bert', 'bert-base-cased', labels=label, args=args)
model.train_model(train_data, eval_data=test_data, acc=accuracy_score)
# Evaluate the performance of NER model
result, model_outputs, preds_list = model.eval_model(test_data)
# Perform NER for inference text
inference_text = "What is the new name of Bangalore"
prediction, model_output = model.predict([inference_text])

结果如下:

总结

基于 Spacy 的预训练 NER 模型的性能似乎是最好的,其中预测的各种标签非常接近人类的实际理解。 Spacy NER 模型只需几行代码即可实现,并且易于使用。

基于 BERT 的自定义训练 NER 模型提供了类似的性能。 定制训练的 NER 模型也适用于特定领域的任务。

NER 模型还有其他各种实现,本文未讨论,例如斯坦福 NLP 的预训练的 NER 模型,有兴趣的可以看看。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码