《NLP汉语自然语言处理原理与实践》第一章

时间:2024-05-21 13:45:44

一.基本知识

规则派还是统计派:

1.规则派:以语言学理论为基础,根据语言学家对语言现象的认识,采用规则形式描述或解释歧义行为或歧义特性。规则派首先要对大量的语言现象进行研究,归纳出一系列的语言规则。然后再形成一套复杂的规则集----语言分析或生产系统,对自然语言进行分析处理。


2.统计派:以基于语料库的统计分析为基础的经验主义方法,该方法更注重用数学,从能代表自然语言规律的大规模真实文本中发现知识,抽取语言现象或统计规律。统计派来源于多种数学基础,包括香浓的信息论、最优化方法、概率图模型、神经网络、深度学习等。她将语言事件富裕概率,作为其可信度,由此来判断某个语言现象是常见的还是罕见的。统计派的方法则偏重于对语料库中人们实际使用的普遍语言现象的统计表述。统计方法是语料库语言学研究的主要内容。


深度学习就是一种特征学习方法,把原始数据通过一些简单的但是非线性的模型转换成更高层次的、更加抽象的表达。通过足够多的转换的组合,非常复杂的函数也可以被学习。


《NLP汉语自然语言处理原理与实践》第一章

NLP 全系列处理框架
名称 包含模块和下载地址 开发语言
哈工大的Ltp3.X 中文分词、词性标注、未登录词识别、句法分析、语义角色标注
网址:https://github.com/HIT-SCIR/ltp/releases
C++
Stanford NLP 中文分词、词性标注、未登录词识别、句法分析等
网址:http://nlp.stanford.edu/software/
java
FudanNLP 中文分词、句法分析等
网址:https://github.com/xpqiu/fnlp/
java
HaNLP 中文分词、句法分析等各类算法
网址:http://hanlp.linrunsoft.com/
java
... ... ....


NLP 分词框架
名称 包含模块和下载地址 开发语言
ICTCLAS分词系统 具有里程碑意义的中文分词系统
网址:http://www.threedweb.cn/forum-2-1.html
C++
Ansj中文分词系统 中等规模的中文分词系统
网址:https://github.com/NLPchina/ansj_seg
Java
结巴分词 小规模中文分词
网址:https://github.com/fxsjy/jieba
Python
... ... ...


一个自然语言处理系统也应该包含至少三个模块语言的解析语义的理解以及语言的生成


在语法解析层面,大规模高精度的中文分词、词性标注系统已经基本达到商用的要求,但在句法解析方面还存在着精度问题


在语义解析层面,命名实体识别、语义块都已经获得了较高的精度。人工智能对知识库的研究历史悠久,已经形成一整套的知识库的架构和推理体系。实现句子到知识库的主要方法是语义角色标注系统,但在整句的理解层面,语义角色标注系统的精度严重依赖句法解析系统,这使该系统离商用还有一段距离。


由于前两个层面的问题,语言生成的发展相对滞后,应用也不广泛,虽有商业的应用,但是范围都非常狭窄,基本都集中在机器翻译领域

《NLP汉语自然语言处理原理与实践》第一章


二.中文分词模块:

(1)基于条件随机场(CRF)的中文分词算法的开源系统。

国内使用CRF做中文分词的开源系统主要是哈工大的HIT LTP语言技术平台(https://github.com/HIT-SCIR/pyltp)


(2)基于张华平NShort的中文分词算法的开源系统。

张华平NShort的中文分词算法是目前大规模中文分词的主流算法。在商用领域,大多数搜索引擎公司都使用该算法作为主要的分词算法。具有算法原理简单、容易理解、便于训练、大规模分词的效率高、模型支持增量扩展、模型占用资源低等优势。

结巴分词器是该算法的Python实现,结巴分词的算法核心就是NShort中文分词算法(https://github.com/fxsjy/jieba)

      结巴分词模块可以支持如下三种的分词模型:

      1.精确模式,试图将句子最精确地切开,适合文本分析(类似Ltp的分词方式)

       2.全模式,把句子中所有可以成词的词语都扫描出来,速度非常快,但是不能解决歧义。

       3.搜索引擎模式,在精确模式的基础上对长词再次切分,提高召回率,适合用于搜索引擎分词。

它支持繁体分词,支持基于概率的用户字典。

结巴分词库的安装:

pip  install jieba

      使用结巴分词:

import jieba
#结巴分词--全模式
sent = "爱吃花果,花非花雾非雾"
wordlist = jieba.cut(sent,cut_all=True)
print("|".join(wordlist))

#结巴分词--精确模式
wordlist = jieba.cut(sent)
print("|".join(wordlist))

#结巴分词--搜索引擎模式
wordlist = jieba.cut_for_search(sent)
print("|".join(wordlist))

result:

爱|吃|花果|||花|非|花|雾非雾
爱|吃|花果|,|花非花|雾非雾
爱|吃|花果|,|花非花|雾非雾


使用用户自定义字典:每行三个字段,词  词频  词性

userdict.txt文件必须为UTF-8编码

字段:

爱 5 v

吃花果 5  n

结巴分词中的字典词频设置,默认为5.这个数越大,说明该字符串成词的概率越高,受到内置字典的干扰就越小;这个数越小,用户字典内的词受到内置字典的干扰越强,不能正确切分的概率就越大。用户需要根据实际情况来设置这个值。

jieba.load_userdict("userdict.txt")

sent = "爱吃花果,花非花雾非雾"
wordlist = jieba.cut(sent)
print("|".join(wordlist))

result
爱|吃花果|,|花非花|雾非雾

三、词性标注
    词性标注又称词类标注,是指判断出在一个句子中每个词所扮演的角色,例如名称,动词,形容词等。
    一般而言,中文的词性标注算法比较统一,大多数使用HMM(因马尔科夫模型)或者最大熵算法,
如结巴分词的词性标注。为了获得更高的精度,也有使用CRF算法的,如Ltp中的词性标注。
    目前流行的中文词性标签有两大类:北大词性标注集和宾州词性标注集。这两类各有千秋。

四、命名实体识别
    命名实体识别用于识别文本中具有特定意义的实体,常见的实体主要包括人名、地名、机构名以及其他专有名词等。
    ltp和Stanford命名实体识别

五、句法解析
    句法解析是根据给定的语法体系自动推导出句子的语法结构,分析句子所包含的语法单元和这些
语法单元之间的联系,将句子转化为一颗结构化的语法树。句法解析是所有自然语言处理的核心模块。
    目前句法分析有两种不同的理论:一种是短语结构语法;另一种是依存语法。
六、语义角色标注