-
2020-11-11 14:24:22
NER(中文实体命名识别)
光健字: 中文命名实体识别 NER BILSTM CRF IDCNN BERT
摘要:对中文命名实体识别一直处于知道却未曾真正实践过的状态,此次主要是想了解和实践一些主流的中文命名实体识别的神经网络算法。通过对网上博客的阅读了解,中文命名实体识别比较主流的方法是BILSTM+CRF、IDCNN+CRF、BERT+BILSTM+CRF这几种神经网络算法,这个demo也用Keras实现了这几个算法,并且采用几个比较通用的数据集进行训练测试。这个demo是以了解和学习为目的的,所以未得出任何结论
注意:由于算力和时间的问题,对神经网络的参数未进行太多调试,所以模型现在的参数并不是最佳参数
主要库的版本
本项目是基于keras(Using TensorFlow backend)以下是主要库的版本
python = 3.6.8
keras == 2.2.4
keras_contrib == 0.0.2
keras_bert == 0.80.0
tensorflow == 1.14.0
项目目录结构
data 数据目录
具体请查看数据目录文件夹下的README文件
DataProcess 数据处理文件夹
具体请查看数据处理文件夹下的README文件
Pubilc 公共工具
path 定义文件(文件夹)的路径
utils 工具
创建log
keras的callback调类
Model 模型(总共定义了5个模型,具体结构请查看Model文件夹下的README文件)
BERT+BILST+CRF
BILSTM+Attention+CRF
BILSTM+CRF
IDCNN+CRF(1)
IDCNN+CRF(2)
log 记录数据
运行项目
注意:需要用到bert网络的需要提前下载BERT预训练模型解压到data文件夹下
直接在IDE里运行项目
直接运行 train.py文件
命令行
python train.py
运行结果
运行GPU: GeForceRTX2080Ti(GPU显存 10.0G, 算力7.5)
训练周期为15个周期,提前停止条件:2个周期验证集准确率没有提升。
BERT采用batch_size=32 因为值为64的时候所使用GPU内存不够
以下数据基于MSRA数据集,以8:2的拆分(训练集:测试集)。测试结果
模型
准确率
F1
召回率
IDCNN_CRF
0.988
0.860
0.871
IDCNN_CRF_2
0.990
0.872
0.897
BILSTM_Attention_CRF
0.987
0.850
0.848
BILSTMCRF
0.989
0.870
0.863
BERT_BILSTM_CRF
0.996
0.954
0.950
很显然BERT+BILIST+CRF的组合效果会好很多
提示:log文件夹里有每个训练周期记录的数据
更多相关内容 -
双向LSTM+CRF中文命名实体识别工具
2018-06-04 15:09:15双向LSTM+CRF中文命名实体识别工具,可以使用自己的语料进行训练,欢迎大家交流学习。训练数据需要自己进行获取 -
中文命名实体识别工具(NER)比较
2020-12-03 18:46:31既然中文分词、词性标注已经有了,那下一步很自然想到的是命名实体识别(NER,Named-entity recognition)工具了,不过根据我目前了解到的情况,开源的中文命名实体工具并不多,这里主要指的是一些成熟的自然语言处理...既然中文分词、词性标注已经有了,那下一步很自然想到的是命名实体识别(NER,Named-entity recognition)工具了,不过根据我目前了解到的情况,开源的中文命名实体工具并不多,这里主要指的是一些成熟的自然语言处理开源工具,不是github上一些学习性质的代码。目前明确有NER标记的包括斯坦福大学的NLP组的Stanza,百度的Paddle Lac,哈工大的LTP,而其他这些测试过的开源NLP基础工具,需要从词性标注结果中提取相对应的专有名词,也算是一种折中方案。
在之前这些可测的工具中,除了斯坦福大学的Stanza和CoreNLP有一套词性标记外,LTP使用的是863词性标注集,其他包括Jieba,SnowNLP,PKUSeg,Thulac,HanLP,FoolNLTK,百度Lac等基础工具的词性标注集主要是以人民日报标注语料中的北京大学词性标注集(40+tags)为蓝本:
代码
名称
帮助记忆的诠释
Ag
形语素
形容词性语素。 形容词代码为 a ,语素代码 g 前面置以 A。
a
形容词
取英语形容词 adjective 的第 1 个字母。
ad
副形词
直接作状语的形容词。 形容词代码 a 和副词代码 d 并在一起。
an
名形词
具有名词功能的形容词。 形容词代码 a 和名词代码 n 并在一起。
b
区别词
取汉字“别”的声母。
c
连词
取英语连词 conjunction 的第 1 个字母。
Dg
副语素
副词性语素。 副词代码为 d ,语素代码 g 前面置以 D。
d
副词
取 adverb 的第 2 个字母 ,因其第 1 个字母已用于形容词。
e
叹词
取英语叹词 exclamation 的第 1 个字母。
f
方位词
取汉字“方” 的声母。
g
语素
绝大多数语素都能作为合成词的“词根”,取汉字“根”的声母。 由于实际标注时 ,一定
标注其子类 ,所以从来没有用到过 g。
h
前接成分
取英语 head 的第 1 个字母。
i
成语
取英语成语 idiom 的第 1 个字母。
j
简称略语
取汉字“简”的声母。
k
后接成分
l
习用语
习用语尚未成为成语 ,有点“临时性”,取“临”的声母。
m
数词
取英语 numeral 的第 3 个字母 ,n ,u 已有他用。
Ng
名语素
名词性语素。 名词代码为 n ,语素代码 g 前面置以 N。
n
名词
取英语名词 noun 的第 1 个字母。
nr
人名
名词代码 n 和“人(ren) ”的声母并在一起。
ns
地名
名词代码 n 和处所词代码 s 并在一起。
nt
机构团体
“团”的声母为 t,名词代码 n 和 t 并在一起。
nx
非汉字串
nz
其他专名
“专”的声母的第 1 个字母为 z,名词代码 n 和 z 并在一起。
o
拟声词
取英语拟声词 onomatopoeia 的第 1 个字母。
p
介词
取英语介词 prepositional 的第 1 个字母。
q
量词
取英语 quantity 的第 1 个字母。
r
代词
取英语代词 pronoun 的第 2 个字母,因 p 已用于介词。
s
处所词
取英语 space 的第 1 个字母。
Tg
时语素
时间词性语素。时间词代码为 t,在语素的代码 g 前面置以 T。
t
时间词
取英语 time 的第 1 个字母。
u
助词
取英语助词 auxiliary 的第 2 个字母,因 a 已用于形容词。
Vg
动语素
动词性语素。动词代码为 v。在语素的代码 g 前面置以 V。
v
动词
取英语动词 verb 的第一个字母。
vd
副动词
直接作状语的动词。动词和副词的代码并在一起。
vn
名动词
指具有名词功能的动词。动词和名词的代码并在一起。
w
标点符号
x
非语素字
非语素字只是一个符号,字母 x 通常用于代表未知数、符号。
y
语气词
取汉字“语”的声母。
z
状态词
取汉字“状”的声母的前一个字母。
HanLP使用的HMM词性标注模型训练自2014年人民日报切分语料,随后增加了少量98年人民日报中独有的词语。所以,HanLP词性标注集兼容《ICTPOS3.0汉语词性标记集》,并且兼容《现代汉语语料库加工规范——词语切分与词性标注》。
另外百度词法分析工具Lac使用的词性标注集中特别加了一套强相关的专名类别标签:
词性和专名类别标签集合如下表,其中词性标签24个(小写字母),专名类别标签4个(大写字母)。这里需要说明的是,人名、地名、机名和时间四个类别,在上表中存在两套标签(PER / LOC / ORG / TIME 和 nr / ns / nt / t),被标注为第二套标签的词,是模型判断为低置信度的人名、地名、机构名和时间词。开发者可以基于这两套标签,在四个类别的准确、召回之间做出自己的权衡。
哈工大LTP的命名实体标注集没有提取“时间”,具体参考如下:
NE识别模块的标注结果采用O-S-B-I-E标注形式,其含义为
标记
含义
O
这个词不是NE
S
这个词单独构成一个NE
B
这个词为一个NE的开始
I
这个词为一个NE的中间
E
这个词位一个NE的结尾
LTP中的NE 模块识别三种NE,分别如下:
标记
含义
Nh
人名
Ni
机构名
Ns
地名
基于上述观察,我决定采用这种方案做中文命名实体工具测试接口:对于斯坦福Stanza的NER结果直接保留,对于 Baidu Lac 结果则保留强置信度的人名(PER)、地名(LOC)、机构名(ORG)、时间(TIME)提取结果,对于哈工大LTP的NER结果做个人名(Nh=>PER)、地名(Ns=>LOC)和机构名(Ni=>ORG)的映射,对于其他几个工具,去除斯坦福的老NLP工具CoreNLP,其他NLP工具则保留nr、ns、nt、t、nz这几个提取工具,并做了标记映射人名(nr=>PER),地名(ns=>LOC),机构名(nt=>ORG),时间(t=>TIME)以及其他专名(nz=>OTHER)。下面是几组测试结果,欢迎关注AINLP公众号试用,结果仅供参考,毕竟除了斯坦福Stanza、Baidu Lac以及哈工大LTP外,其他几个工具的“NER命名实体识别”功能是“强加”的,在实际使用中,可以根据需求采用:
-
CRF+词典方法的中文命名实体识别工具
2014-06-08 21:30:37是依靠条件随机场和字典方法的中文命名实体识别的小工具,需要安装java虚拟机。解压后直接使用!! -
中文实体命名识别工具使用汇总:Stanza、LAC、Ltp、Hanlp、foolnltk、NLTK、BosonNLP
2021-01-16 20:09:44二、java版本使用三、python版本使用NLTK 命名实体识别一、简介:二、搭建环境三、nltk使用1、英文实体命名初体验2、使用nltk来处理中文资料结巴分词使用foolnltk 命名实体识别一、简介二、python版本使用Ltp 实体...实体命名识别
相关知识
信息抽取:从数据库中抽取信息是容易的,但对于从自然文本中抽取信息则不那么直观。通常信息抽取的流程如下图:
分块是实体识别(NER)使用的基本技术,词性标注是分块所需的最主要信息。下面以名词短语(NP)为例,展示如何分块。类似的还可以对动词短语,介词短语等进行分块。
命名实体识别(Named Entity Recognition,简称NER)用于识别文本中具有特定意义的实体。需要识别的实体可以分为三大类(实体类、时间类和数字类)和七小类(人名、机构名、地名、时间、日期、货币和百分比)。
Stanford CoreNLP 命名实体识别
一、简介:
CoreNLP是Java自然语言处理的一站式服务!CoreNLP使用户能够导出文本的语言注释,包括标记和句子边界、词性、命名实体、数值和时间值、依赖和选区解析、共指、情感、引用属性和关系。CoreNLP的核心是管道。管道接收原始文本,对文本运行一系列NLP注释器,并生成最终的注释集。管道产生核心文档,包含所有注释信息的数据对象,可以通过简单的API访问,并且可以序列化到Google协议缓冲区。
中文语料模型包中有一个默认的配置文件
StanfordCoreNLP-chinese.properties
指定pipeline的操作步骤以及对应的语料文件的位置,可以自定义配置文件,再引入代码中。实际上我们可能用不到所有的步骤,或者要使用不同的语料库,因此可以自定义配置文件,然后再引入。那在我的项目中,我就直接读取了该properties文件。(有时候我们只想使用ner功能,但不想使用其他功能,想去掉。然而,Stanford CoreNLP有一些局限,就是在ner执行之前,一定需要tokenize, ssplit, pos, lemma 的引入,大大增加了耗时。)
更多用法参见官网。
二、java版本使用
idea+maven搭建工程
1、在pom.xml 添加依赖:
<properties> <corenlp.version>3.9.1</corenlp.version> </properties> <dependencies> <!--CoreNLP的算法包--> <dependency> <groupId>edu.stanford.nlp</groupId> <artifactId>stanford-corenlp</artifactId> <version>${corenlp.version}</version> </dependency> <!--英文语料包--> <dependency> <groupId>edu.stanford.nlp</groupId> <artifactId>stanford-corenlp</artifactId> <version>3.9.1</version> <classifier>models</classifier> </dependency> <!--中文预料包--> <dependency> <groupId>edu.stanford.nlp</groupId> <artifactId>stanford-corenlp</artifactId> <version>${corenlp.version}</version> <classifier>models-chinese</classifier> </dependency> </dependencies>
2、编写java程序
package com; import java.util.List; import java.util.Map; import java.util.Properties; import edu.stanford.nlp.coref.CorefCoreAnnotations; import edu.stanford.nlp.coref.data.CorefChain; import edu.stanford.nlp.ling.CoreAnnotations; import edu.stanford.nlp.ling.CoreLabel; import edu.stanford.nlp.pipeline.Annotation; import edu.stanford.nlp.pipeline.StanfordCoreNLP; import edu.stanford.nlp.semgraph.SemanticGraph; import edu.stanford.nlp.semgraph.SemanticGraphCoreAnnotations; import edu.stanford.nlp.trees.Tree; import edu.stanford.nlp.trees.TreeCoreAnnotations; import edu.stanford.nlp.util.CoreMap; /** 代码思想: 将text字符串交给Stanford CoreNLP处理, StanfordCoreNLP的各个组件(annotator)按“tokenize(分词), ssplit(断句), pos(词性标注), lemma(词元化), ner(命名实体识别), parse(语法分析), dcoref(同义词分辨)”顺序进行处理。 处理完后 List<CoreMap> sentences = document.get(SentencesAnnotation.class); 中包含了所有分析结果,遍历即可获知结果。 **/ public class StanfordChineseNlpExample2 { public static void main(String[] args) throws Exception { StanfordChineseNlpExample2 nlp=new StanfordChineseNlpExample2(); nlp.test(); } public void test() throws Exception { //构造一个StanfordCoreNLP对象,配置NLP的功能,如lemma是词干化,ner是命名实体识别等 StanfordCoreNLP pipeline = new StanfordCoreNLP("StanfordCoreNLP-chinese.properties"); String text = "袁隆平是中国科学院的院士,他于2009年10月到中国山东省东营市东营区永乐机场附近承包了一千亩盐碱地,"; long startTime = System.currentTimeMillis(); // 创造一个空的Annotation对象 Annotation document = new Annotation(text); // 对文本进行分析 pipeline.annotate(document); //获取文本处理结果 List<CoreMap> sentences = document.get(CoreAnnotations.SentencesAnnotation.class); for (CoreMap sentence : sentences) { // traversing the words in the current sentence // a CoreLabel is a CoreMap with additional token-specific methods for (CoreLabel token : sentence.get(CoreAnnotations.TokensAnnotation.class)) { // 获取句子的token(可以是作为分词后的词语) String word = token.get(CoreAnnotations.TextAnnotation.class); System.out.println(word); //词性标注 String pos = token.get(CoreAnnotations.PartOfSpeechAnnotation.class); System.out.println(pos); // 命名实体识别 String ne = token.get(CoreAnnotations.NormalizedNamedEntityTagAnnotation.class); String ner = token.get(CoreAnnotations.NamedEntityTagAnnotation.class); System.out.println(word + " | analysis : { original : " + ner + "," + " normalized : " + ne + "}"); //词干化处理 String lema = token.get(CoreAnnotations.LemmaAnnotation.class); System.out.println(lema); } // 句子的解析树 Tree tree = sentence.get(TreeCoreAnnotations.TreeAnnotation.class); System.out.println("句子的解析树:"); tree.pennPrint(); // 句子的依赖图 SemanticGraph graph = sentence.get(SemanticGraphCoreAnnotations.CollapsedCCProcessedDependenciesAnnotation.class); System.out.println("句子的依赖图"); System.out.println(graph.toString(SemanticGraph.OutputFormat.LIST)); } long endTime = System.currentTimeMillis(); long time = endTime - startTime; System.out.println("The analysis lasts " + time + " seconds * 1000"); // 指代词链 // 每条链保存指代的集合 // 句子和偏移量都从1开始 Map<Integer, CorefChain> corefChains = document.get(CorefCoreAnnotations.CorefChainAnnotation.class); if (corefChains == null) { return; } for (Map.Entry<Integer, CorefChain> entry : corefChains.entrySet()) { System.out.println("Chain " + entry.getKey() + " "); for (CorefChain.CorefMention m : entry.getValue().getMentionsInTextualOrder()) { // We need to subtract one since the indices count from 1 but the Lists start from 0 List<CoreLabel> tokens = sentences.get(m.sentNum - 1).get(CoreAnnotations.TokensAnnotation.class); // We subtract two for end: one for 0-based indexing, and one because we want last token of mention // not one following. System.out.println( " " + m + ", i.e., 0-based character offsets [" + tokens.get(m.startIndex - 1).beginPosition() + ", " + tokens.get(m.endIndex - 2).endPosition() + ")"); } } } }
实体识别结果:
袁隆平 | analysis : { original : PERSON, normalized : null} 是 | analysis : { original : O, normalized : null} 中国 | analysis : { original : ORGANIZATION, normalized : null} 科学院 | analysis : { original : ORGANIZATION, normalized : null} 的 | analysis : { original : O, normalized : null} 院士 | analysis : { original : TITLE, normalized : null} , | analysis : { original : O, normalized : null} 他 | analysis : { original : O, normalized : null} 于 | analysis : { original : O, normalized : null} 2009年 | analysis : { original : DATE, normalized : 2009-10-XX} 10月 | analysis : { original : DATE, normalized : 2009-10-XX} 到 | analysis : { original : O, normalized : null} 中国 | analysis : { original : COUNTRY, normalized : null} 山东省 | analysis : { original : STATE_OR_PROVINCE, normalized : null} 东营市 | analysis : { original : CITY, normalized : null} 东营区 | analysis : { original : FACILITY, normalized : null} 永乐 | analysis : { original : FACILITY, normalized : null} 机场 | analysis : { original : FACILITY, normalized : null} 附近 | analysis : { original : O, normalized : null} 承包 | analysis : { original : O, normalized : null} 了 | analysis : { original : O, normalized : null} 一千 | analysis : { original : NUMBER, normalized : 1000} 亩 | analysis : { original : O, normalized : null} 盐 | analysis : { original : O, normalized : null} 碱地 | analysis : { original : O, normalized : null} , | analysis : { original : O, normalized : null} The analysis lasts 989 seconds * 1000
大概可以识别到的类型有:人person、数字number、组织organization、头衔title、省/市/区/位置province/city/facility/location、日期/时间date/time
实时在线演示:https://corenlp.run/
三、python版本使用
- 安装斯坦福大学NLP组的Stanza 。(要求:Python3.6及以上的版本)
pip install stanza
- 下载中文模型打包文件
import stanza stanza.download('zh')
出现问题:
[WinError 10054] 远程主机强迫关闭了一个现有的连接
。
解决方法:用梯子- 使用
# coding utf-8 import stanza # 可以通过pipeline预加载不同语言的模型,也可以通过pipeline选择不同的处理模块,还可以选择是否使用GPU: zh_nlp = stanza.Pipeline('zh', use_gpu=False) text = "马云在1998年7月31日出生于江苏省盐城市大丰区。" doc = zh_nlp(text) for sent in doc.sentences: print("Sentence:" + sent.text) # 断句 print("Tokenize:" + ' '.join(token.text for token in sent.tokens)) # 中文分词 print("UPOS: " + ' '.join(f'{word.text}/{word.upos}' for word in sent.words)) # 词性标注(UPOS) print("XPOS: " + ' '.join(f'{word.text}/{word.xpos}' for word in sent.words)) # 词性标注(XPOS) print("NER: " + ' '.join(f'{ent.text}/{ent.type}' for ent in sent.ents)) # 命名实体识别
Sentence:马云在1998年7月31日出生于江苏省盐城市大丰区。 Tokenize:马云 在 1998 年 7 月 31 日 出生 于 江苏 省 盐城 市 大丰 区 。 UPOS: 马云/PROPN 在/ADP 1998/NUM 年/NOUN 7/NUM 月/NOUN 31/NUM 日/NOUN 出生/VERB 于/ADP 江苏/PROPN 省/PART 盐城/PROPN 市/PART 大丰/PROPN 区/PART 。/PUNCT XPOS: 马云/NNP 在/IN 1998/CD 年/NNB 7/CD 月/NNB 31/CD 日/NNB 出生/VV 于/IN 江苏/NNP 省/SFN 盐城/NNP 市/SFN 大丰/NNP 区/SFN 。/. NER: 马云/PERSON 1998年7月31日/DATE 江苏/GPE 盐城/GPE 大丰/GPE
更多详细信息见:斯坦福大学NLP组Python深度学习自然语言处理工具Stanza试用
NLTK 命名实体识别
一、简介:
NLTK对于自然语言处理有很多开箱即用的API,本文主要介绍如何使用NLTK进行中文命名实体识别。由于NLTK不支持中文分词,所以本文使用了结巴分词。
二、搭建环境
环境:windows64+python3
前提:安装好python3,并且安装了numpy、matplotlib、pandas等一些常用的库
1、安装PyYAML模块和nltk模块
pip install pyyaml nltk
2、下载NLTK的数据包
方式一:界面下载
在pycharm中写一个python脚本,如下:
import nltk nltk.download()
运行脚本,出现如下界面,选择all,设置下载路径,点击下载:
下载时间很长,如果有个别数据包无法下载,可切换到All Packages
标签页,双击指定的包来进行下载。
方式二:命令行下载
创建名称为 nltk_data 的文件夹(比如我创建在了anacondas的目录下)
文件夹位置要求,程序会按照如下顺序去找该文件夹,所以,你创建的文件夹在以下目录即可:Searched in:
- ‘C:\Users\10840/nltk_data’
- ‘D:\develop\python\Anaconda3\nltk_data’
- ‘D:\develop\python\Anaconda3\share\nltk_data’
- ‘D:\develop\python\Anaconda3\lib\nltk_data’
- ‘C:\Users\10840\AppData\Roaming\nltk_data’
- ‘C:\nltk_data’
- ‘D:\nltk_data’
- ‘E:\nltk_data’
- ’ ’
- ‘D:\develop\python\Anaconda3\nltk_data’
cmd 进入 nltk_data 文件夹目录,执行命令 python -m nltk.downloader all
关于下载的问题:[win error 10054] 远程主机强迫关闭了一个现有的连接
解决方法:1.使用梯子 2.从国内别人上传的云盘下载(文末链接中有)3. 直接到官网下载数据包。
只要将下载的数据包复制到你的 Download Directory目录下即可
三、nltk使用
用NLTK来实现文本信息提取的方法,包含4步:分词,词性标注,(分块)命名实体识别,实体关系识别。
分块可以简单的基于经验,使用正则表达式来匹配,也可以使用基于统计的分类算法来实现,NLTK有提供基于正则的分块器。
nltk 不提供中文分词。
1、英文实体命名初体验
import sys import importlib importlib.reload(sys) import nltk article = "I came to Tsinghua University in Beijing" # 文章 tokens = nltk.word_tokenize(article) # 分词 print("tokens",tokens) ''' tokens ['I', 'came', 'to', 'Tsinghua', 'University', 'in', 'Beijing'] ''' tagged = nltk.pos_tag(tokens) # 词性标注 print("tagged",tagged) ''' tagged [('I', 'PRP'), ('came', 'VBD'), ('to', 'TO'), ('Tsinghua', 'NNP'), ('University', 'NNP'), ('in', 'IN'), ('Beijing', 'NNP')] ''' entities = nltk.chunk.ne_chunk(tagged) # 命名实体识别 print(entities) # 命名实体:确切的名词短语,指特定类型的个体,如日期、人、组织等 ''' (S I/PRP came/VBD to/TO (ORGANIZATION Tsinghua/NNP University/NNP) in/IN (GPE Beijing/NNP)) '''
NLTK 采用的是宾州中文树库标记:
2、使用nltk来处理中文资料
nltk 目前只能比较好的处理英文和其他的一些拉丁语系。由于中文汉字一个挨一个,nltk不支持。
所以可以采用其他分词工具对中文语料进行处理,再使用nltk对其进行实体识别。
分词工具有很多,这里使用 结巴分词。主页有详细介绍
结巴分词使用
1、安装
pip install jieba
2、使用:中文分词初体验
# encoding=utf-8 import jieba jieba.enable_paddle() # 启动paddle模式。 strs=["我来到北京清华大学","乒乓球拍卖完了","中国科学技术大学"] for str in strs: seg_list = jieba.cut(str,use_paddle=True) # 使用paddle模式 print("Paddle Mode: " + '/'.join(list(seg_list))) seg_list = jieba.cut("我来到北京清华大学", cut_all=True) print("【全模式】: " + "/ ".join(seg_list)) seg_list = jieba.cut("我来到北京清华大学", cut_all=False) print("【精确模式】: " + "/ ".join(seg_list)) seg_list = jieba.cut("他来到了网易杭研大厦") print("【新词识别】: "+", ".join(seg_list)) seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造") print("【搜索引擎模式】: "+", ".join(seg_list)) ''' Paddle Mode: 我/来到/北京清华大学 Paddle Mode: 乒乓球/拍卖/完/了 Paddle Mode: 中国科学技术大学 【全模式】: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学 【精确模式】: 我/ 来到/ 北京/ 清华大学 【新词识别】: 他, 来到, 了, 网易, 杭研, 大厦 【搜索引擎模式】: 小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, ,, 后, 在, 日本, 京都, 大学, 日本京都大学, 深造 '''
这样,把分词的结果输出到文件中,NLTK就可以拿来做实体识别了,比如下面:
# encoding=utf-8 import sys import importlib importlib.reload(sys) import nltk # 上中文 tokens = nltk.word_tokenize("我 来到 北京 清华大学") # 分词 print("tokens",tokens) tagged = nltk.pos_tag(tokens) # 词性标注 print("tagged",tagged) entities = nltk.chunk.ne_chunk(tagged) # 命名实体识别 print(entities) ''' tokens ['我', '来到', '北京', '清华大学'] tagged [('我', 'JJ'), ('来到', 'NNP'), ('北京', 'NNP'), ('清华大学', 'NN')] (S 我/JJ 来到/NNP 北京/NNP 清华大学/NN) '''
参考资料:
python的nltk中文使用和学习资料汇总帮你入门提高
NLTK学习之四:文本信息抽取foolnltk 命名实体识别
一、简介
foolnltk一个基于深度学习的中文分词工具,具有以下特点:
- 可能不是最快的开源中文分词,但很可能是最准的开源中文分词
- 基于 BiLSTM 模型训练而成
- 包含分词,词性标注,实体识别, 都有比较高的准确率
- 用户自定义词典
- 可以定制自己的模型
有python版本和java版本,详情请见
二、python版本使用
1、 安装
pip install foolnltk
2、 使用
#coding utf-8 import fool import os # 分词 text = "我来到北京清华大学" print(fool.cut(text)) ''' [['我', '来到', '北京', '清华大学']] ''' # 用户自定义词典 # 词典格式格式如下,词的权重越高,词的长度越长就越越可能出现, 权重值请大于 1 # 难受香菇 10 # 什么鬼 10 # 分词工具 10 # 北京 10 # 北京天安门 10 fool.load_userdict(os.getcwd()+'\\mydictionary') # 词性标注 print(fool.pos_cut(text)) ''' [[('我', 'r'), ('来到', 'v'), ('北京', 'ns'), ('清华大学', 'nt')]] ''' # 实体识别 words, ners = fool.analysis(text) print(ners) ''' [[(3, 9, 'org', '北京清华大学')]] '''
Ltp 实体命名识别
一、简介
哈工大的LTP,免费使用但限流量,需要给钱才行
LTP4文档,啊!其实官方文档里面已经写的清清楚楚了!
这个也能支持用户自定义词典
二、使用
1、安装
pip install ltp
2、使用
import os from ltp import LTP ltp = LTP() # 默认加载 Small 模型 # user_dict.txt 是词典文件, max_window是最大前向分词窗口 ltp.init_dict(path=os.getcwd()+'\\mydictionary', max_window=4) seg, hidden = ltp.seg(["马云在1996年11月29日来到杭州的阿里巴巴公司。"]) # 分词 print(seg) ''' [['马云', '在', '1996年', '11月', '29日', '来到', '杭州', '的', '阿里巴巴', '公司', '。']] ''' pos = ltp.pos(hidden) # 词性标注 print(pos) ''' [['nh', 'p', 'nt', 'nt', 'nt', 'v', 'ns', 'u', 'nz', 'n', 'wp']] ''' ner = ltp.ner(hidden) # 命名实体识别 tag, start, end = ner[0][0] print(ner) for tag, start, end in ner[0]: print(tag, ":", "".join(seg[0][start:end + 1])) ''' [[('Nh', 0, 0), ('Ns', 6, 6), ('Ni', 8, 9)]] Nh : 马云 Ns : 杭州 Ni : 阿里巴巴公司 '''
LTP 提供最基本的三种实体类型人名 Nh、地名 Ns、机构名 Ni 的识别。
LAC 实体命名
一、简介
LAC全称Lexical Analysis of Chinese,是百度自然语言处理部研发的一款联合的词法分析工具,实现中文分词、词性标注、专名识别等功能。该工具具有以下特点与优势:
- 效果好:通过深度学习模型联合学习分词、词性标注、专名识别任务,词语重要性,整体效果F1值超过0.91,词性标注F1值超过0.94,专名识别F1值超过0.85,效果业内领先。
- 效率高:精简模型参数,结合Paddle预测库的性能优化,CPU单线程性能达800QPS,效率业内领先。
- 可定制:实现简单可控的干预机制,精准匹配用户词典对模型进行干预。词典支持长片段形式,使得干预更为精准。
- 调用便捷:支持一键安装,同时提供了Python、Java和C++调用接口与调用示例,实现快速调用和集成。
- 支持移动端: 定制超轻量级模型,体积仅为2M,主流千元手机单线程性能达200QPS,满足大多数移动端应用的需求,同等体积量级效果业内领先。
二、python版本使用
1、安装
pip install lac
2、使用
from LAC import LAC # 装载LAC模型 lac = LAC(mode='lac') # 单个样本输入,输入为Unicode编码的字符串 text = u"马云来到北京清华大学" lac_result = lac.run(text) print(lac_result) ''' [['马云', '来到', '北京清华', '大学'], ['PER', 'v', 'ORG', 'n']] ''' # 批量样本输入, 输入为多个句子组成的list,平均速率更快 texts = [u"LAC是个优秀的分词工具", u"百度是一家高科技公司"] lac_result = lac.run(texts) print(lac_result) ''' [[['LAC', '是', '个', '优秀', '的', '分词', '工具'], ['nz', 'v', 'q', 'a', 'u', 'n', 'n']], [['百度', '是', '一家', '高科技', '公司'], ['ORG', 'v', 'm', 'n', 'n']]] '''
控制台输出以上内容,这个是初始化异常日志,不碍事,不喜欢的可以通过升级 paddlepaddle 版本到1.8以上 来关闭
pip install paddlepaddle==1.8
词性和专业名词类别:(专业名词只能识别4种:人物、地名、机构名、时间)
BosonNLP 实体识别
这个现在官方不给 SDK 的 tooken 了,所以不能用了,但是在线演示平台挺绚丽的。
一、简介
BosonNLP实体识别引擎基于自主研发的结构化信息抽取算法,F1分数达到81%,相比于StanfordNER高出7个百分点。通过对行业语料的进一步学习,可以达到更高的准确率。
二、python版本使用
1、安装
pip install bosonnlp
2、使用
from bosonnlp import BosonNLP import os nlp = BosonNLP(os.environ['BOSON_API_TOKEN']) nlp.ner('杨超越在1998年7月31日出生于江苏省盐城市大丰区。', sensitivity=2)
Hanlp 实体识别
一、简介
HanLP是一系列模型与算法组成的NLP工具包,目标是普及自然语言处理在生产环境中的应用。HanLP具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点。内部算法经过工业界和学术界考验。目前,基于深度学习的HanLP 2.0正处于alpha测试阶段,未来将实现知识图谱、问答系统、自动摘要、文本语义相似度、指代消解、三元组抽取、实体链接等功能。
我们介绍的Pyhanlp是HanLP1.x的Python接口,支持自动下载与升级HanLP1.x,兼容py2、py3。
二、python版本使用
1、安装
安装JDK
JDK官方下载地址
JDK的安装与环境变量配置
注意 保证JDK的位数、操作系统位数和Python位数一致。安装Pyhanlp
pip install pyhanlp
2、使用
# coding utf-8 import pyhanlp text = '杨超越在1998年7月31日出生于江苏省盐城市大丰区。' NLPTokenizer = pyhanlp.JClass('com.hankcs.hanlp.tokenizer.NLPTokenizer') # 加载模型 NER = NLPTokenizer.segment(text) # 命名实体识别 print(NER) ''' [杨超越/nr, 在/p, 1998年7月31日/t, 出生/v, 于/p, 江苏省盐城市/ns, 大丰区/ns, 。/w] '''
不像前面介绍的几个工具可以直接获得实体,hanlp需要从词性标注里面提取实体,
人名nr、地名ns、机名nt、时间t。 -
中文NLP命名实体识别序列标注工具YEDDA
2018-06-26 11:23:05中文NLP序列标注工具。利用CRF进行命名实体识别NER,自动标注数据集产生语料库,可以选择BIO或者BMES标注体系。 -
中文命名实体识别
2015-03-12 16:40:35命名实体识别是信息提取、问答系统、句法分析、机器翻译、面向Semantic Web的元数据标注等应用领域的重要基础工具,在自然语言处理技术走向实用化的过程中占有重要地位。一般来说,命名实体识别的任务就是识别出待... -
介绍几个专门面向中文的命名实体识别和关系抽取工具
2020-10-26 10:34:07现在已经有了很多相关的具体算法和模型,对于这些大家可以看顶会论文和技术分享,我们主要来介绍几个专门面向中文的命名实体识别和关系抽取的工具。 1. 中文分词 中文自然语言处理与其它语言比如英语的最大不同...知识图谱已经在人工智能的各个领域发挥越来越重要的作用,例如视觉问答、对话系统、推荐系统等。知识图谱构建是应用这些知识图谱的基础,而面对生活和企业中数据的爆发式增长,自动化知识图谱构建显得越来越重要。从非结构化文本中自动抽取三元组知识并构建知识图谱需要用到的核心技术就是命名实体识别和关系抽取,现在已经有了很多相关的具体算法和模型,对于这些大家可以看顶会论文和技术分享,我们主要来介绍几个专门面向中文的命名实体识别和关系抽取的工具。
1. 中文分词
中文自然语言处理与其它语言比如英语的最大不同之处在于英文中每个词直接由空格分隔开,但是中文是以字来分隔的,对于机器来说并不知道一句话中哪些字组成一个词。因此,在实现很多中文的自然语言处理功能时,需要先进行分词处理,将一句话中的中文词语分隔开。首先,我们来介绍一种最流行的中文分词工具jieba。
jieba的官方github地址:https://github.com/fxsjy/
ieba在官方对jieba(标星24.5k+)的介绍中,我们看到是这样说的:
“结巴”中文分词:做最好的 Python 中文分词组件
不是人自吹,jieba确实是目前最好的中文分词工具,我们来看看这个小东西都有什么特点。
- 支持全自动安装:
easy_install jieba 或者 pip install jieba / pip3 install jieba
2. 对于同一个句子,支持四种分词模式:
- 精确模式:试图将句子最精确地切开,适合文本分析。
- 全模式:把句子中所有的可以成词的词语都扫描出来, 速度非常快,但不能解决歧义。
- 搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
- paddle模式:利用PaddlePaddle深度学习框架,训练序列标注(双向GRU)网络模型实现分词。同时支持词性标注。paddle模式使用需安装paddlepaddle-tiny:
pip install paddlepaddle-tiny==1.6.1
3. 支持繁体分词
4. 支持自定义词典
5. 算法上,采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合。对于未登录词,采用了基于汉字成词能力的 HMM 模型,使用了 Viterbi 算法。具体的jieba和用法可以参考官方github文档。
2. 命名实体识别
目前较为成熟的中文命名实体识别(NER)工具包括LTP,PyHanlp,Lac等。
2.1 语言技术平台(LTP)
语言技术平台(LTP) 是哈工大社会计算与信息检索研究中心 11 年的持续研发和推广,LTP 已经成为国内外最具影响力的中文处理基础平台,曾获 CoNLL 2009七国语言句法语义分析评测 总成绩第一名,中文信息学会钱伟长一等奖等重要成绩和荣誉。LTP提供包括中文分词、词性标注、命名实体识别、依存句法分析、语义角色标注等丰富、高效、精准的自然语言处理技术。目前,LTP 已经被 500 多家国内外研究机构和企业使用,多家大企业和科研机构付费使用。
LTP官方地址:http://ltp.ai/
要想用LTP实现中文命名实体识别非常简单,首选,只需要一行指令便可自动安装部署LTP:
pip install ltp
接着,需要加载模型:
from ltp import LTltp = LTP() # 默认加载 Small 模型
这时,就可以愉快的使用命名实体识别了:
from ltp import LTP ltp = LTP() seg, hidden = ltp.seg(["杨超越在1998年7月31日出生于江苏省盐城市大丰区。"]) ner = ltp.ner(hidden)tag, start, end = ner[0][0]print(tag,":", "".join(seg[0][start:end + 1]))]
利用LTP官方提供的在线演示系统:http://ltp.ai/demo.html
可以通过可视化直接看到对“杨超越在1998年7月31日出生于江苏省盐城市大丰区。”这句话的命名实体识别的效果:
从上面的结果可以看到,LTP可以识别出“杨超越”为人名,“江苏省”为地名,但是无法识别出例如“1998年”这种时间类型的实体,同时对于“盐城市”和“大丰区”这类地名也无法识别。
2.2 Pyhanlp
HanLP是一系列模型与算法组成的NLP工具包,目标是普及自然语言处理在生产环境中的应用。HanLP具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点。内部算法经过工业界和学术界考验。目前,基于深度学习的HanLP 2.0正处于alpha测试阶段,未来将实现知识图谱、问答系统、自动摘要、文本语义相似度、指代消解、三元组抽取、实体链接等功能。
Pyhanlp的github项目官方地址:
https://github.com/hankcs/pyhanlp
这里我们介绍的Pyhanlp是HanLP1.x的Python接口,支持自动下载与升级HanLP1.x,兼容py2、py3。安装Pyhanlp的步骤比LTP稍微复杂一步,首先需要安装JDK,官方下载地址为:
https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
需要注意的是,这里需要保证JDK的位数、操作系统位数和Python位数一致。然后设置JAVA_HOME环境变量,接着,就可以根据如下指令安装Pyhanlp了:
conda-forge jpype1==0.7.0 # (可选)conda安装jpype1更方便pip install pyhanlp
然后,就可以使用Pyhanlp来进行命名实体识别了,仍然需要通过类似于LTP的流程,先加载模型,再执行命名实体识别:
import pyhanlp text = '杨超越在1998年7月31日出生于江苏省盐城市大丰区。' NLPTokenizer = pyhanlp.JClass('com.hankcs.hanlp.tokenizer.NLPTokenizer') NER = NLPTokenizer.segment(text) print(NER)
为了和LTP的命名实体识别的效果进行对比,使用Pyhanlp官方提供的在线演示系统:http://hanlp.hankcs.com/
并针对同样的一个实例“杨超越在1998年7月31日出生于江苏省盐城市大丰区。”,用Pyhanlp对这句话的命名实体识别的效果为:
2.3 BosonNLP
BosonNLP实体识别引擎基于自主研发的结构化信息抽取算法,F1分数达到81%,相比于StanfordNER高出7个百分点。通过对行业语料的进一步学习,可以达到更高的准确率。
BosonNLP项目官方地址:http://static.bosonnlp.com/
BosonNLP 是一个更加商业化的中文语义分析API,其中,对于命名实体识别任务,可以识别时间、地点、人名、组织名、公司名、产品名、职位这几类实体。
安装这个工具非常简便:
pip install bosonnlp
接着,就可以调用这个API进行命名实体识别的任务了:
from bosonnlp import BosonNLP import os nlp = BosonNLP(os.environ['BOSON_API_TOKEN']) nlp.ner('杨超越在1998年7月31日出生于江苏省盐城市大丰区。', sensitivity=2)
同样,为了和前两个工具LTP和Pyhanlp进行对比,针对同样的一个实例“杨超越在1998年7月31日出生于江苏省盐城市大丰区。”,使用BosonNLP官方提供的在线演示系统:http://static.bosonnlp.com/demo#overview-ner
用BosonNLP对这句话的命名实体识别的效果为:
可以看到,用BosonNLP这个工具,能够同时识别出这句话中的人名,时间和地名,相比前两个系统具有最好的命名实体识别的效果。
当然,除了前面介绍的这个三个命名实体识别的工具,还有很多开源的工具可以使用,包括:
- 百度的Lac:https://github.com/baidu/lac
- 复旦大学的fnlp:https://github.com/FudanNLP/fnlp
- 斯坦福的StanfordCoreNLP:https://stanfordnlp.github.io/CoreNLP/
3. 关系抽取
目前,专门面向中文的关系抽取工具并不多,泽宇搜集到的中文关系抽取工具有DeepKE,Jiagu和DeepDive。
3.1 DeepKE
DeepKE是浙江大学知识引擎实验室开发的中文关系抽取开源工具,项目官方地址是:
https://github.com/zjunlp/deepke
安装DeepKE,首先需要安装一些配置环境所需的依赖包:
- python >= 3.6
- torch >= 1.2
- hydra-core >= 0.11
- tensorboard >= 2.0
- matplotlib >= 3.1
- transformers >= 2.0
- jieba >= 0.39
相比于前面介绍的命名实体识别工具,DeepKE的封装性相对没有那么强,目前只能通过源码安装方式:
git clone https://github.com/zjunlp/deepke.gitcd deepke 再采用 pip install -r requirements.txt 安装上述的相关依赖包。
然后,对于我们自己的关系抽取任务,使用DeepKE提供的模型对我们的数据集进行训练,所有的训练数据需要存储在 data/origin 文件夹中。接着,就可以训练关系抽取的模型了,DeepKE提供了7种不同的关系抽取模型,包括:
- 基于 CNN 的关系抽取模型
- 基于 BiLSTM 的关系抽取模型
- 基于 PCNN 的远程监督关系抽取模型
- 基于 Capsule 的关系抽取模型
- 基于 Transformer 的关系抽取模型
- 基于 GCN 的关系抽取模型
- 基于 BERT 语言预训练模型的关系抽取模型
可以看到,DeepKE提供的所有模型都是基于深度学习的关系抽取模型,其中包括最新的基于Transformer、GCN和BERT的模型,具体的每种模型的使用可以参考官方提供的文档:
https://github.com/zjunlp/deepke/wiki
3.2 Jiagu
Jiagu使用大规模语料训练而成。将提供中文分词、词性标注、命名实体识别、情感分析、知识图谱关系抽取、关键词抽取、文本摘要、新词发现、情感分析、文本聚类等常用自然语言处理功能。
Jiagu是思知机器人公司开发的一个针对中文关系抽取的开源工具,Jiagu的项目官方地址是:
https://github.com/ownthink/Jiagu
安装Jiagu就非常方便,可以直接自动安装:
pip install -U jiagu
但是,Jiagu的关系抽取目前仅用于测试的功能,只能使用百科的描述进行测试。使用方法为:
import jiagu text = '姚明1980年9月12日出生于上海市徐汇区,祖籍江苏省苏州市吴江区震泽镇,前中国职业篮球运动员,司职中锋,现任中职联公司董事长兼总经理。' knowledge = jiagu.knowledge(text) print(knowledge)
3.3 DeepDive
deepdive是由斯坦福大学InfoLab实验室开发的一个开源知识抽取系统。它通过弱监督学习,从非结构化的文本中抽取结构化的关系数据 。
斯坦福开源的DeepDive原本只能支持英文的关系抽取,国内最大的知识图谱开放平台OPENKG修改了DeepDive中自然语言处理的model包,使它支持中文,并提供中文使用手册,后续将持续更新一些针对中文的优化。
支持中文的DeepDive项目的官方地址为:
http://www.openkg.cn/dataset/cn-deepdive
希望这几个非常实用的面向中文的命名实体识别和关系抽取工具能够帮助大家实现非结构化知识抽取,快速自动构建知识图谱,并赋能各种融入知识的人工智能项目中。
往期精选:
如果对文章感兴趣欢迎关注知乎专栏“人工智能遇上知识图谱“,也欢迎关注同名微信公众号“人工智能遇上知识图谱”,让我们一起学习并交流讨论人工智能与知识图谱技术。
- 支持全自动安装:
-
自然语言处理基于深度学习的中文命名实体识别实战
2021-06-15 21:57:42学习完本门课程,您将对自然语言处理技术有更深入的了解,彻底掌握中文命名实体识别技术。 适用人群: 自然语言处理从业者、深度学习爱好者 课程简介: 命名实体识别作为自然语言处理的基础技术之一,在自然语言处理... -
中文命名实体识别NER
2020-12-09 08:39:40NER(中文实体命名识别)光健字: 中文命名实体识别 NER BILSTM CRF IDCNN BERT摘要:对中文命名实体识别一直处于知道却未曾真正实践过的状态,此次主要是想了解和实践一些主流的中文命名实体识别的神经网络算法。... -
自然语言处理 中英文分词、词性标注与命名实体识别——文本和代码
2019-05-24 20:26:44中英文分词工具有很多,今天我们来使用Jieba、SnowNlp、nltk、thunlp、NLPIR、Stanford等六种工具来对给定中英文文本进行分词、词性标注与命名实体识别。 -
NLP之中文命名实体识别
2018-09-25 18:45:47在MUC-6中首次使用了命名实体(named entity)这一术语,由于当时关注的焦点是信息抽取(information extraction)问题,即从报章等非结构化文本中抽取关于公司...命名实体识别(Named EntitiesRecognition,NER),... -
命名实体识别 标注模式和常用工具下载
2021-01-04 16:01:38对于中文,token可以是一个词语(分词后的结果),也可以是单个汉字字符。 为便于说明,以下都将token试作等同于字符。 标签列表如下: B,即Begin,表示开始 I,即Intermediate,表示中间 E,即End,表示结尾 S,即... -
在线中文命名实体识别 ( NER ) 的工具
2019-11-23 14:03:34在线中文命名实体识别( NER )的工具 命名实体识别(Named Entity Recognition,简称NER),又称作“专名识别”,是指识别文本中具有特定意义的实体,主要包括人名、地名、机构名、专有名词等。 通常包括两部分:... -
命名实体:中文命名实体识别简介
2018-01-22 10:46:003、命名实体识别过程 (1)确定实体的边界,即确定哪些词属于实体。 (2)确定实体的类别,即确定实体属于人名或者机构名等。 4、命名实体识别难点 (1)各类命名实体没有严格的命名规范 -
斯坦福命名实体识别
2021-03-13 13:00:45包括分词器(Word Segmenter),词性标注工具(Part-Of-Speech Tagger),命名实体识别工具(Named Entity Recognizer),句法分析器(Parser)等,可喜的事,他们还为这些工具训练了相应的中文模型,支持中文文本处理。... -
中文命名实体识别---基于多特征融合嵌入
2021-11-22 23:26:15来源: AINLPer 微信公众号... 是中文命名实体识别呦。 NER存在的问题及解决方案 在统计机器学习算法之后,命名实体识别进入了神经网络时代。研究人员开始基于字符嵌入和词嵌入使用循环神经网络(RNN)来识别句子中的命. -
NLP实战-中文命名实体识别
2019-04-02 20:32:25本项目将通过pytorch作为主要工具实现不同的模型(包括HMM,CRF,Bi-LSTM,Bi-LSTM+CRF)来解决中文命名实体识别问题,文章不会涉及过多的数学推导,但会从直观上简单解释模型的原理,主要 的内容会集中在代码部分。... -
自然语言处理基于Bert的中文命名实体识别实战
2021-06-16 07:56:05学习完本门课程,您将对自然语言处理技术有更深入的了解,彻底掌握中文命名实体识别技术。 适用人群: 自然语言处理从业者、深度学习爱好者 课程简介: 命名实体识别作为自然语言处理的基础技术之一,在自然语言处理... -
命名实体识别的两种方法
2020-12-02 14:48:13什么是命名实体识别二.基于NLTK的命名实体识别三.基于Stanford的NER四.总结一 、什么是命名实体识别?命名实体识别(Named Entity Recognition,简称NER),又称作“专名识别”,是指识别文本中具有特定意义的实体... -
中文自然语言处理--jieba 进行命名实体识别和提取
2021-03-30 00:13:14通过简单的 jieba 分词然后根据词性获取实体对象 import jieba import jieba.analyse import jieba.posseg as posg # 使用 jieba 进行词性切分,allowPOS 指定允许的词性,这里选择名词 n 和地名 ns sentence = u''... -
NLP之中文命名实体识别(Named EntitiesRecognition--NER)
2018-08-02 22:11:12一、什么是命名实体识别 命名实体识别是识别一个句子中有特定意义的实体并将其区分为人名,机构名,日期,地名,时间等类别的工作。 命名实体识别本质上是一个模式识别任务, 即给定一个句子, 识别句子中实体的边界... -
中文命名实体识别NER详解
2019-09-21 14:58:06中文命名实体识别是在自然语言处理领域有着具足轻重的地位,因为在很多应用中,我们一定要提取出我们话术中的实体,所以说命名实体识别是非常重要的。一般来说,现在网上有很多NER的开源库,我们通过调用API就可以... -
使用Stanford NLP工具实现中文命名实体识别
2015-10-29 21:27:18四、 中文命名实体识别 新建Java项目,将data目录拷贝到项目根路径下,再把stanford-ner-2012-11-11-chinese解压的内容全部拷贝到classifiers文件夹下,将第三步中的三个Java包以及stanford NER和分词器的Java包... -
hmm的matlab代码-HanLP:自然语言处理中文分词词性标注命名实体识别依存句法分析新词发现关键词短语提取自动...
2021-05-19 20:48:43基于HMM角色标注的命名实体识别(速度快) 、、、、 基于线性模型的命名实体识别(精度高) 、 关键词提取 自动摘要 短语提取 多音字、声母、韵母、声调 简繁分歧词(简体、繁体、台湾正体、香港繁体) 语义推荐、... -
BilSTM 实体识别_NLP实战-中文命名实体识别
2020-11-22 11:21:43前言:本文章将通过pytorch作为主要工具实现不同的模型(包括HMM,CRF,Bi-LSTM,Bi-LSTM+CRF)来解决中文命名实体识别问题,文章不会涉及过多的数学推导,但会从直观上简单解释模型的原理,主要的内容会集中在代码... -
基于BERT预训练的中文命名实体识别TensorFlow实现
2019-01-03 11:58:25BERT-BiLSMT-CRF-NER Tensorflow solution of ...使用谷歌的BERT模型在BLSTM-CRF模型上进行预训练用于中文命名实体识别的Tensorflow代码’ 代码已经托管到GitHub 代码传送门 大家可以去clone 下来亲自体验一下! g...