Iawen's Blog

我喜欢这样自由的随手涂鸦, 因为我喜欢风......

命名实体识别(Named Entity Recognition, NER)是NLP中一项非常基础的任务。NER是信息提取、问答系统、句法分析、机器翻译等众多NLP任务的重要基础工具。命名实体识别的准确度, 决定了下游任务的效果, 是NLP中非常重要的一个基础问题, 旨在将文本中的命名实体定位并分类为预先定义的类别, 如人员、组织、位置、时间表达式、数量、货币值、百分比等。

NER系统已经建立起来, 使用基于语言语法的技术以及统计模型, 如机器学习。手工制作的基于语法的系统通常可以获得更好的精度, 但代价是低召回并且需要经验丰富的计算语言学家数月工作才能实现。统计NER系统通常需要大量人工注释的训练数据。为了避免部分注释工作, 建议使用半监督方法。

0. Content

  • StanfordCoreNLP
  • Hanlp
  • FoolNLTK
  • LTP
  • Starpii
  • Baidu Lac
  • spaCy
  • bert-base-NER

1. StanfordCoreNLP

项目地址: https://github.com/stanfordnlp/stanfordnlp StanfordCoreNLP 是斯坦福大学发布的 NLP 处理工具, StanfordCoreNLP 的源码使用 Java 编写, 目前 Python 可以用两种方法进行调用, 一种是使用 StanfordCoreNLP 库, 是对 StanfordCoreNLP 进行了 Python 封装。而另一种方法是直接使用 Stanford 官方发布的 Python 版本 StanfordNLP。这里介绍第一种方式。

1.1 安装

# Bugfix: ~/.pyenv/versions/3.8.12/lib/python3.8/site-packages/stanfordnlp/models/common/beam.py
# prevK = (bestScoresId / numWords).long() 

# pip install stanfordcorenlp 
pip install --upgrade stanfordnlp -i https://mirror.baidu.com/pypi/simple
  • 首先 pip install stanfordcorenlp
  • 其次 由于其源码为 JAVA 编写, 所以需要 JDK1.8 及以上版本的支持, 下载安装 JDK1.8
  • 下载 StanfordCoreNLP 的相关文件 , 主要是 相关语言的 JAR 模型, 以及 CoreNLP 3.9.2
  • 解压下载好的 CoreNLP 文件, 并将 JAR 模型放在加压好的文件夹中

1.2 使用

from stanfordcorenlp import StanfordCoreNLP
 
# 加载模型
stanford_model = StanfordCoreNLP('E:/Learn/python/stanford-corenlp-full-2018-10-05', lang='zh')
res = stanford_model.ner("张三和李四在2019年3月23日在北京的腾讯技术有限公司一起开会。")
print(res)

 # stanfordnlp.download('zh')
nlp = stanfordnlp.Pipeline(lang='en')
doc = nlp("Barack Obama was born in Hawaii.  He was elected president in 2008.")
doc.sentences[0].print_dependencies()

2. Hanlp

Hanlp 的源码也是由 Java 编写, 所以这意味着你在使用 Hanlp 时, 也需要安装 JDK 1.8, 以及配置你的 Java 环境变量。

2.1 安装方法

  • 首先pip install pyhanlp
  • 首次使用时会自动下载 data 数据, 若下载过慢的话, 可以在 GitHub下的配置页面 进行手动配置, 自行下载 data 数据, 将其放在 pyhanlp 安装目录的 static 目录下面。

2.2 使用

from pyhanlp import *

ha_model = HanLP.newSegment()
text = "张三和李四在2019年3月23日在北京的腾讯技术有限公司一起开会。"
res = ha_model.seg(text)
print(res)

3. FoolNLTK

FoolNLTK 基于 Bi-LSTM 训练而成, 在调用时会依赖 TensorFlow, 在分词, 词性标注, 以及命名实体识别时都有较高的准确率。

3.1 安装方法

FoolNLTK 的安装也很方便, 只需要 pip install foolnltk, 依赖的 TensorFlow 会自动安装, 不需要配置其他环境以及下载其他模型。

3.2 调用方法

FoolNLTK 的调用也非常简单, 不需要预加载模型, 直接 import 后就可以进行预测, 第一次预测时会对模型进行加载, 会消耗一定的时间, 后续调用模型时的速度都很快。

import fool
text = "张三和李四在2019年3月23日在北京的腾讯技术有限公司一起开会。"
res = fool.analysis(text)
print(res)

4. LTP

LTP 为哈工大开发的中文 NLP 开源工具, 这里使用的也是 LTP 的 Python 封装版本 pyltp。 语言技术平台面向国内外大学、中科院各研究所以及个人研究者免费开放源代码, 但如上述机构和个人将该平台用于商业目的(如企业合作项目等)则需要付费。 除上述机构以外的企事业单位, 如申请使用该平台, 需付费。

4.1 安装方法

  • pip install pyltp
  • pip install --upgrade ltp -i https://mirror.baidu.com/pypi/simple
  • 在 LTP 的模型页面 下载模型, 这里要注意 pyltp 库版本需要和模型的版本对应。在 这里 查看版本的对应情况。当版本不对应时, 加载模型会出现报错。

4.2 调用方法

# https://github.com/HIT-SCIR/ltp
from ltp import LTP
ltp = LTP() # ltp = LTP(path = "base|small|tiny")
seg, hidden = ltp.seg(["他叫汤姆去拿外衣。"])
pos = ltp.pos(hidden)

from pyltp import Segmentor, Postagger, NamedEntityRecognizer
import os

LTP_DATA_DIR = r'C:/Users/1V994W2/PycharmProjects/ppt_ner/ltp_data_v3.4.0'

segmentor = Segmentor()
segmentor.load(os.path.join(LTP_DATA_DIR, "cws.model"))

postagger = Postagger()
postagger.load(os.path.join(LTP_DATA_DIR, "pos.model"))

recognizer = NamedEntityRecognizer()
recognizer.load(os.path.join(LTP_DATA_DIR, "ner.model"))


text = "张三和李四在2019年3月23日在北京的腾讯技术有限公司一起开会。"

words = segmentor.segment(text)
print(list(words))
postags = postagger.postag(words)
print(list(postags))
netags = recognizer.recognize(words, postags)
print(list(netags))

5. NLTK

NLTK是一个高效的Python构建的平台,用来处理人类自然语言数据。 Github地址: https://github.com/nltk/nltk 官网: http://www.nltk.org/

5.1 调用方法

# 安装: pip install nltk
# 国内源安装: pip install nltk  -i https://pypi.tuna.tsinghua.edu.cn/simple
import nltk
s = 'I love natural language processing technology!'
s_token = nltk.word_tokenize(s)
s_tagged = nltk.pos_tag(s_token)
s_ner = nltk.chunk.ne_chunk(s_tagged)
print(s_ner)

6. SpaCy

工业级的自然语言处理工具, 遗憾的是不支持中文。 Gihub地址: https://github.com/explosion/spaCy 官网: https://spacy.io/

开源协议: MIT License 项目主页: https://github.com/explosion/spaCy

6.1 安装

  • 安装: pip install spaCy
  • 国内源安装: pip install spaCy -i https://pypi.tuna.tsinghua.edu.cn/simple

6.7 使用

import spacy
nlp = spacy.load("zh_core_web_sm")
import zh_core_web_sm
nlp = zh_core_web_sm.load()
doc = nlp(u"快递可以发顺丰吗")
print([(w.text, w.pos_) for w in doc])

7. starpii

经过训练的 NER 模型, 用于检测代码数据集中的个人身份信息 (PII)。我们在注释的 PII 数据集上微调了 bigcode-encoder, 可在 bigcode-pii-dataset 上进行门控访问(有关确切的数据拆分, 请参阅 bigcode-pii-dataset-training)。我们在编码器模型之上添加了一个线性层作为令牌分类头, 具有 6 个目标类:名称、电子邮件、密钥、密码、IP 地址和用户名。

没有使用到中文语料来训练

from transformers import pipeline

classifier = pipeline("token-classification", model = "E:\Learn\models\starpii", aggregation_strategy="simple")
classifier("Hello I'm John and my IP address is 196.780.89.78")

8. Baidu Lac

LAC全称Lexical Analysis of Chinese, 是百度自然语言处理部研发的一款联合的词法分析工具, 实现中文分词、词性标注、专名识别等功能。

from LAC import LAC

lac = LAC(mode='lac')
print(lac.run("快递可以发顺丰吗"))

9. bert-base-NER

from transformers import AutoTokenizer, AutoModelForTokenClassification
from transformers import pipeline

tokenizer = AutoTokenizer.from_pretrained("E:\\Learn\\models\\bert-base-NER")
model = AutoModelForTokenClassification.from_pretrained("E:\\Learn\\models\\bert-base-NER")

nlp = pipeline("ner", model=model, tokenizer=tokenizer)
example = "My name is Wolfgang and I live in Berlin"

ner_results = nlp(example)
print(ner_results)

(隐马尔可夫模型(HMM)实现命名实体识别(NER))[https://blog.csdn.net/qq_45556665/article/details/127257452]