赵走x博客
网站访问量:151880
首页
书籍
软件
工具
古诗词
搜索
登录
16、算法部分源码解析
15、系统总体流程与词典结构
14、中文分词
13、词汇与分词技术
12、三个平面中的语义研究
11、汉语的发展
10、字形的流变
9、六书及其他
8、文字符号的起源
7、整合语义角色标注模块
6、整合句法解析模块
5、整合命名实体识别模块
4、整合词性标注模块
3、整合中文分词模块
2、现代自然语言系统简介
1、中文语言的机器处理:历史回顾
5、整合命名实体识别模块
资源编号:76116
NLP汉语自然语言处理原理与实践
自然语言处理
热度:141
命名实体识别用于识别文本中具有特定意义的实体,常见的实体主要包括人名、地名、机构名及其他专有名词等。本书将命名实体识别划分在语义范畴的原因是,命名实体识别不仅需要标注词的语法信息(名词),更重要的是要指示词的语义信息(人名还是组织机构名等)。这里所需要识别的命名实体一般不是指已知名词(词典中的登录词),而是指新词(或称未登录词)。
命名实体识别用于识别文本中具有特定意义的实体,常见的实体主要包括人名、地名、机构名及其他专有名词等。本书将命名实体识别划分在语义范畴的原因是,命名实体识别不仅需要标注词的语法信息(名词),更重要的是要指示词的语义信息(人名还是组织机构名等)。这里所需要识别的命名实体一般不是指已知名词(词典中的登录词),而是指新词(或称未登录词)。 文本中新词的涌现反映了人类词汇的能产性。所谓能产性指基本词(字)能够构成其他新词,但是这些新词的产生并非没有规律性。应该讲,不同的义类具有不同的规律:构成中国人名的统计规律,显然区别于外文译名,或其他专有名词。新词构成的概率分布按照其义类的不同而有所不同。这是命名实体构成的普遍规律。 更具体的命名实体识别任务还要识别出文本中三大类(实体类、时间类和数字类)、七小类(人名、机构名、地名、时间、日期、货币和百分比)命名实体。 本章继续使用1.4节介绍的两个系统——Ltp 3.3和StanfordNLP中的命名实体识别模块,但在例句上做了一些变化,使用了含有专名—地名的句子。 # 1、Ltp 3.3命名实体识别 继续使用Ltp 3.3中文命名实体识别模块。图1.7列出的语言包列表中,命名实体识别模块的文件名为ner.model。这里使用新的已分词例句。 执行程序如下。 ``` # -*- coding: utf-8 -*- from pyltp import * sent = "欧洲 东部 的 罗马尼亚 , 首都 是 布加勒斯特 , 也 是 一 座 世界性 的 城市 。" words = sent.split(" ") postagger = Postagger() postagger.load("/Volumes/UP/data/ltp_data_v3.4.0/pos.model") # 导入词性标注模块 postags = postagger.postag(words) recognizer = NamedEntityRecognizer() recognizer.load("/Volumes/UP/data/ltp_data_v3.4.0/ner.model") # 导入命名实体识别模块 netags = recognizer.recognize(words, postags) for word, postag, netag in zip(words, postags, netags): # 输出结果 print(word + "/" + postag + "/" + netag) ``` 识别结果如下。 ``` 欧洲/ns/S-Ns 东部/nd/O 的/u/O 罗马尼亚/ns/S-Ns ,/wp/O 首都/n/O 是/v/O 布加勒斯特/ns/S-Ns ,/wp/O 也/d/O 是/v/O 一/m/O 座/q/O 世界性/n/O 的/u/O 城市/n/O 。/wp/O ``` 输出例句中"/"为分隔符,分隔符将结果按词为单位分为三段。例如,第一段是词“欧洲”,第二段是词性“ns”,第三段“S-Ns”就是识别的专名。这里标签“O”表示非专名,“S-Ns”表示地名。全部标签在后面的章节中有详细说明。 # 2、Stanford命名实体识别 如果仅使用斯坦福的中文命名实体识别模块(也称为NER),可从http://nlp.stanford.edu/software/CRF-NER.shtml 下载。与词性标注的不同之处在于,命名实体识别模块的程序和中文模型库分开存放。应用程序可以从图1.15所示的截图处下载。  图1.15 截图 斯坦福命名实体识别也可以通过Stanford-CoreNLP包运行。中文模型库内使用了基于词向量的语义相似度模型。运行该模型的前提条件需要首先进行中文分词,然后将分词结果(以空格分开的分词文本)作为输入,再运行命名实体识别模块进行输出。 在图1.14目录列表中的名为ner的子目录中,放置着stanford-chinese-corenlp- 2015-12-08-models.jar解压出来的chinese.misc.distsim.crf.ser.gz基于crf的命名实体识别中文语言模型。 最后,仿照词性标注模块,编写一个Python命名实体类如下。 ``` class StanfordNERTagger(StanfordCoreNLP): def __init__(self, modelpath, jarpath): StanfordCoreNLP.__init__(self, jarpath) self.modelpath = modelpath # 模型文件路径 self.classfier = "edu.stanford.nlp.ie.crf.CRFClassifier" self.__buildcmd() # 构建命令行 def __buildcmd(self): self.cmdline = 'java -mx1g -cp "'+self.jarpath+'" '\ +self.classfier+' -loadClassifier "'\ +self.modelpath+'"' #标注句子 def tag(self, sent): self.savefile(self.tempsrcpath, sent) tagtxt = os.popen(self.cmdline+' -textFile '+self.tempsrcpath, 'r'). read() # 输出到变量中 self.delfile(self.tempsrcpath) return tagtxt # 标注文件 def tagfile(self, sent, outpath): self.savefile(self.tempsrcpath, sent) os.system(self.cmdline+' -textFile '+self.tempsrcpath+' > '+outpath ) self.delfile(self.tempsrcpath) ``` 执行代码如下。 ``` root = 'E:/nltk_data/stanford-corenlp/' modelpath = root+'models/ner/chinese.misc.distsim.crf.ser.gz' st = StanfordNERTagger(modelpath, root) seg_sent = '欧洲 东部 的 罗马尼亚 , 首都 是 布加勒斯特 , 也 是 一 座 世界性 的 城市 。 ' taglist = st.tagfile(seg_sent, "ner_test.txt") print(taglist) ``` 输出结果为ner_test.txt文件,打开该文件可以看到输出结果如下。 ``` 欧洲/LOC 东部/O 的/O 罗马尼亚/GPE , /O 首都/O 是/O 布加勒斯特/GPE , /O 也/O 是/O 一/O 座 /O 世界性/O 的/O 城市/O 。/O ``` Stanford命名实体识别不需要词性标注,因此输出仅分为两段,标注集也比较简单。这里标签“O”表示非专名,“LOC”表示地名。其他标签会在后面章节中再做讲解。