您的位置:首页 > 其它

nlp之中文分词原理基础和jieba使用的详细教程

2019-05-13 11:34 603 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/weixin_41822392/article/details/90170082

中文分词

一、规则分词

规则分词,是一种机械分词方法,主要是通过维护词典、再切分语句时,将语句的每个字符串与词表进行逐一的匹配,找到切分,否则不切分。
细分主要可以分成:正向最大匹配法、逆向最大匹配法、双向最大匹配。
(1)正向最大匹配法(MM):假设分词词典中的最长的词有j个字符,则用被处理文档的当前字符串的前j个字符作为匹配字段,查找字典。如果字典中存在这样的一个次,则匹配成功,匹配到的字段被切割出来,如果匹配失败,则切掉匹配字段的最后一个字符,对剩下的字串重新进行匹配处理,循环往复,直到匹配成功。循环取下一个j字符串进行匹配,直到文档被扫描完为止。
(2)逆向最大匹配法(RMM):基本原理同MM,不同的是分词切分的方向与MM相反。逆向最大匹配法,从被处理的文档的末端开始匹配扫描,每次取最末端的j个字符。由于汉语正结构较多,所以逆向可以适当的提高准确度。
(3)双向最大匹配法(BDMM):将MM与RMM得到的分词结果进行比较,然后按照最大的匹配原则,选取词数切分最少的作为结果。

二、统计分词

基于统计的分词方法:给出大量已经分词的文本,利用统计机器学习模型学习词语切分的规律(称为训练),从而实现对未知文本的切分。例如最大概率分词方法和最大熵分词方法等。随着大规模语料库的建立,统计机器学习方法的研究和发展,基于统计的中文分词方法渐渐成为了主流方法。

主要统计模型:N元文法模型(N-gram),隐马尔可夫模型(Hidden Markov Model ,HMM),最大熵模型(ME),条件随机场模型(Conditional Random Fields,CRF)等。

三、中文分词工具Jieba
(一)特点

(1)支持三种分词模式:
精确模式,试图将句子最精确地切开,适合文本分析;
全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
(2)支持自定义词典
(3)支持繁体分词

(二)主要功能

(1)分词代码如下,jieba.cut()默认为精确模式

import jieba

seg_list = jieba.cut("我来到北京清华大学", cut_all=True)
print("Full Mode: " + "/ ".join(seg_list))  # 全模式
seg_list = jieba.cut("我来到北京清华大学", cut_all=False)
print("Default Mode: " + "/ ".join(seg_list))  # 精确模式
seg_list = jieba.cut("他来到了网易杭研大厦")  # 默认是精确模式
print(", ".join(seg_list))

可以得到结果如下:

(2)添加自定义词典
开发者可以指定自己自定义的词典,以便包含 jieba 词库里没有的词。
添加代码格式: jieba.load_userdict(file_name) # file_name 为文件类对象或自定义词典的路径
添加词典格式和 dict.txt 一样,一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。
如下:

创新办 3 i
云计算 5
凱特琳 nz
台中

jieba.load_userdict(file_name)

(3)关键词提取
常用的有tf-idf(词频-逆文档频率)算法和textrank:

import jieba.analyse

content = u'中国特色社会主义是我们党领导的伟大事业,全面推进党的建设新的伟大工程,是这一伟大事业取得胜利的关键所在。党坚强有力,事业才能兴旺发达,国家才能繁荣稳定,人民才能幸福安康。党的十八大以来,我们党坚持党要管党、从严治党,凝心聚力、直击积弊、扶正祛邪,党的建设开创新局面,党风政风呈现新气象。习近平总书记围绕从严管党治党提出一系列新的重要思想,为全面推进党的建设新的伟大工程进一步指明了方向。'
# 第一个参数:待提取关键词的文本
# 第二个参数:返回关键词的数量,重要性从高到低排序
# 第三个参数:是否同时返回每个关键词的权重
# 第四个参数:词性过滤,为空表示不过滤,若提供则仅返回符合词性要求的关键词
keywords = jieba.analyse.extract_tags(content, topK=20, withWeight=True, allowPOS=())
for item in keywords:
print(item[0], item[1])

# 同样是四个参数,但allowPOS默认为('ns', 'n', 'vn', 'v')
# 即仅提取地名、名词、动名词、动词
keywords = jieba.analyse.textrank(content, topK=20, withWeight=True, allowPOS=('ns', 'n', 'vn', 'v'))
for item in keywords:
print(item[0], item[1])

运行结果:(两种方式分词结果的圈中不一样)

(4)词性标注
jieba在进行中文分词的同时,还可以完成词性标注任务。根据分词结果中每个词的词性,可以初步实现命名实体识别,即将标注为nr的词视为人名,将标注为ns的词视为地名等。所有标点符号都会被标注为x,所以可以根据这个去除分词结果中的标点符号。

import jieba.posseg as pseg
words = pseg.cut("我爱北京北京故宫天安门")
for word, flag in words:
# 格式化模版并传入参数
print('%s, %s' % (word, flag))

运行结果:

我, r
爱, v
北京, ns
北京故宫, ns
天安门, ns

这些是最常用的一些jieba分词示例,详情请参照github结巴分词的地址:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: