中文分词
这里写目录标题
基于词典的分词方法
机械分词方法、字符串匹配的分词方法。
按照一定的策略将待分词的汉字串与一个充分大的机器词典中的词条进行匹配。
三个要素:1.分词词典 2.文本扫描顺序 3.匹配原则
按照扫描句子的顺序,可以分为正向扫描、逆向扫描和双向扫描。
匹配的原则主要有最大匹配、最小匹配、逐词匹配和最佳匹配。
最大匹配算法:(正向/逆向)
- 设词典中的最长词的长度为n;
- 从待分句子中取出长度为n的字符串,与词典进行匹配;
- 如果匹配成功,作为一个词;
- 如果匹配不成功,将该从句子中去掉一个汉字再次匹配,重复进行直至完成匹配。
正向最大匹配算法每次去除最后一个字,错误率0.6%。逆向最大匹配算法每次去除第一个字,错误率0.4%。
预处理优化
-
对句子:设立切分标志
- 自然切分标志:非字符号(标点符号)
- 非自然切分标志:利用词缀和不构成词的词(们,啊)
-
对词典:将词典按照词频大小排列。
缺点:歧义;未登录词;
基于统计的分词方法
词是字的稳定组合,相邻的字同时出现的频率越大,越有可能构成一个词。
算法实现:计算文本中相邻的字的组合频度,计算互现信息,高于某一个阈值则认为可能构成了一个词。
主要应用模型:ngram模型,HMM模型和最大熵模型。
互信息:两个离散随机变量X、Y的相互依赖(关联、影响)程度。
实际应用中一般将基于统计的方法与基于词典的方法相结合。
基于语义、理解的分词方法
评测一个分词系统的效果的主要指标:精度(查准率)、召回率(查全率)、F值
N:标准分割的单词数、e:分词器错误标注的单词数、c:分词器正确标注的单词数
精度(查准率),表明分词器分词的准确程度。R = C/N
召回率(查全率),表明分词器切分正确的词有多么全。P = c/(c + e)
F值,综合反应整体的指标。F = 2PR/(P + R)
错误率,表明分词器的错误程度。ER = e/N
R、P、F越大越好,ER越小越好。一个完美的分词器的P、R、F的值均为1,ER值为0。
分词工具
jieba算法:
基本原理:对于需要划分的词,如果在词典中,则直接读取、划分;如果不在词典中,用Viterbi算法进行分词。
jieba的三种分词模式:精确模式:对语句进行最精确的划分;全模式:扫描出句子中所有可以成词的词语;搜索引擎模式;
jieba.cut()函数是中文语句分词的主要函数。调用方式:
import jieba
jieba.cut(sentence, cut_all=False, HMM=True)
# sentence:需要分词处理的字符串
# cut_all:分词模式。True全模式,False精准模式。
# HMM:是否使用HMM模型
例:
import jieba
s=jieba.cut(sentence) # 字符串
list(s)
thula分词工具包
thulac分词工具包中的thulac()函数,生成模型:
thulac(user_dict=None, model_path=None, T2S=False, seg_only=False, filt=False)# 初始化程序,进行自定义设置
# user_dict:设置用户词典。
thulac模型的调用方式:
- cut()进行一句话分词
cut(sentence, text=False)
- cut_f()对文件进行分词
cut_f(Text, text=False)# text表示是否返回文本,默认False
cut_f(input_text, output_text)# 输入文件 输出文件
例:
import thulac
thu1 = thulac.thulac() # 默认模式
text = thu1.cut("我爱北京*", text=True) #进行一句话分词
# 结果:我_r 爱_v 北京_ns *_ns
print(text)
练习
切分以下句子:
import thulac
thu1 = thulac.thulac() #默认模式
# 结果:他_r 用_v 了_u 两_m 个_q 半天_m 写_v 完_v 了_u 这_r 篇_q 文章_n 。_w
text1 = thu1.cut("他用了两个半天写完了这篇文章。", text=True)
print(text1)
# 结果:我等_r 她_r 等_v 了_u 半天_m 。_w
text2 = thu1.cut("我等她等了半天。", text=True)
print(text2)
import jieba
# 结果:['人们', '朝向', '不同', '的', '出口', '。']
s1 = jieba.cut("人们朝向不同的出口。", cut_all=False, HMM=True)
print(list(s1))
# 结果:['我们', '出发', '的', '时间', '不同', '。']
s2 = jieba.cut("我们出发的时间不同。", cut_all=False, HMM=True)
print(list(s2))