赞
踩
中文分词(Chinese Word Segmentation) 指的是将一个汉字序列切分成一个一个单独的词。分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。
中文分词是其他中文 (信息) 处理的基础,搜索引擎、机器翻译(MT)、语音合成、自动分类、自动摘要、自动校对等等,都需要用到分词。
目前主流分词方法:基于规则,基于统计以及二者混合。
基于规则的分词:主要是人工建立词库也叫做词典,通过词典匹配的方式对句子进行划分。其实现简单高效,但是对未登陆词很难进行处理。主要有正向最大匹配法FMM,逆向最大匹配法RMM以及双向最大匹配法Bi-MM。
- def FMM_func(user_dict, sentence):
- """
- 正向最大匹配(FMM)
- :param user_dict: 词典
- :param sentence: 句子
- """
- # 词典中最长词长度
- max_len = max([len(item) for item in user_dict])
- start = 0
- while start != len(sentence):
- index = start+max_len
- if index>len(sentence):
- index = len(sentence)
- for i in range(max_len):
- if (sentence[start:index] in user_dict) or (len(sentence[start:index])==1):
- print(sentence[start:index], end='/')
- start = index
- break
- index += -1
- def BMM_func(user_dict, sentence):
- """
- 反向最大匹配(BMM)
- :param user_dict:词典
- :param sentence:句子
- """
- # 词典中最长词长度
- max_len = max([len(item) for item in user_dict])
- result = []
- start = len(sentence)
- while start != 0:
- index = start - max_len
- if index < 0:
- index = 0
- for i in range(max_len):
- if (sentence[index:start] in user_dict) or (len(sentence[start:index])==1):
- result.append(sentence[index:start])
- start = index
- break
- index += 1
- for i in result[::-1]:
- print(i, end='/')
双向最大匹配法:FMM和BMM两种算法都分词一遍,然后根据大颗粒度词越多越好,非词典词和单字词越少越好的原则,选取其中一种分词结果输出。
如:“我们在野生动物园玩”
正向最大匹配法,最终分词结果为:“我们/在野/生动/物/园/玩”,其中,总分词数6个,单字词为3。
逆向最大匹配法,最终分词结果为:“我们/在/野生动物园/玩”,其中,总分词数4个,单字词为2。
选择标准:
因此最终输出为逆向结果。
https://zhuanlan.zhihu.com/p/103392455
中文分词有很多种,常见的比如有中科院计算所 NLPIR、哈工大 LTP、清华大学 THULAC 、斯坦福分词器、Hanlp 分词器、jieba 分词、IKAnalyzer 等。
官方: https://github.com/fxsjy/jieba
三种分词算法
支持三种分词模式:
- import jieba
- content = "现如今,机器学习和深度学习带动人工智能飞速的发展,并在图片处理、语音识别领域取得巨大成功。"
- # 1、精确
- segs_1 = jieba.cut(content, cut_all=False)
- print("/".join(segs_1))
-
- #用lcut生成list
- segs_2 = jieba.lcut(content)
- print(segs_2)
-
- # 2、全模式
- segs_3 = jieba.cut(content, cut_all=True)
- print("/".join(segs_3))
- # 3、搜索引擎
- segs_4 = jieba.cut_for_search(content)
- print("/".join(segs_4))
- 1
- 现如今/,/机器/学习/和/深度/学习/带动/人工智能/飞速/的/发展/,/并/在/图片/处理/、/语音/识别/领域/取得/巨大成功/。
-
- ['现如今', ',', '机器', '学习', '和', '深度', '学习', '带动', '人工智能', '飞速', '的', '发展', ',', '并', '在', '图片', '处理', '、', '语音', '识别', '领域', '取得', '巨大成功', '。']
-
- 2
- 现如今/如今///机器/学习/和/深度/学习/带动/动人/人工/人工智能/智能/飞速/的/发展///并/在/图片/处理///语音/识别/领域/取得/巨大/巨大成功/大成/成功//
- 3
- 如今/现如今/,/机器/学习/和/深度/学习/带动/人工/智能/人工智能/飞速/的/发展/,/并/在/图片/处理/、/语音/识别/领域/取得/巨大/大成/成功/巨大成功/。
用 lcut 生成 list
jieba.cut 以及 jieba.cut_for_search
返回的结构都是一个可迭代的 Generator,可以使用 for 循环来获得分词后得到的每一个词语(Unicode)。jieba.lcut 对 cut 的结果做了封装,l 代表 list,即返回的结果是一个 list 集合。同样的,用 jieba.lcut_for_search
也直接返回 list 集合。
自定义添加词到字典
jieba 可以很方便地获取中文词性,通过 jieba.posseg 模块实现词性标注。
- import jieba.posseg as psg
- content = "现如今,机器学习和深度学习带动人工智能飞速的发展,并在图片处理、语音识别领域取得巨大成功。"
- print([(x.word,x.flag) for x in psg.lcut(content)])
[('现如今', 't'), (',', 'x'), ('机器', 'n'), ('学习', 'v'), ('和', 'c'), ('深度', 'ns'), ('学习', 'v'), ('带动', 'v'), ('人工智能', 'n'), ('飞速', 'n'), ('的', 'uj'), ('发展', 'vn'), (',', 'x'), ('并', 'c'), ('在', 'p'), ('图片', 'n'), ('处理', 'v'), ('、', 'x'), ('语音', 'n'), ('识别', 'v'), ('领域', 'n'), ('取得', 'v'), ('巨大成功', 'nr'), ('。', 'x')]
当分词工具分词不准确时,需要加载自定义词典!
正则表达式常用函数
①re.sub用于替换字符串中的匹配项
②compile 函数:用于编译正则表达式,生成一个正则表达式( Pattern )对象
③findall 函数:在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
注意: match 和 search 是匹配一次 findall 匹配所有。
④split 函数:按照能够匹配的子串将字符串分割后返回列表
当分词字典的词冲突,相互影响时,需要调整词频和字典顺序!
①假设字典中定义的词也可能被切开,此时需要调用jieba.suggest_freq函数
例如“台中”,字典中定义了依然会分为“台”,“中”
②使用hanlp时,需要用sort_dict_by_lenth.py来排序字典,不然会冲突
比如字典中有“数据挖掘算法工程师”和“数据挖掘”两个,排序后就可以最长字符串匹配
③拓展: 基于词典的中文分词
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。