- 中文名
- 分词技术
- 应用领域
- 搜索引擎
- 基本释义
- 关键词串用的一种技术
- 技术数目
- 3种技术
分词技术就是搜索引擎针对用户提交查询的关键词串进行的查询处理后根据用户的关键词串用各种匹配方法进行分词的一种技术。
- 中文名
- 分词技术
- 应用领域
- 搜索引擎
- 基本释义
- 关键词串用的一种技术
- 技术数目
- 3种技术
基本介绍
编辑概述
数据处理
1.首先是到数据库里面索引相关的信息,这就是查询处理。举个例子。“什么是百度分词技术” 我们就会把这个词分割成“ 什么是,百度,分词技术。”这种分词方法叫做反向匹配法。2.然后再看用户提供的这个词有没有重复词汇如果有的话,会丢弃掉,默认为一个词汇。接下来检查用户提交的字符串,有没有字母和数字。如果有的话,就把字母和数字认为一个词。这就是搜索引擎的查询处理。分词的原理
编辑百度是如何来分词的呢?分词技术现今非常成熟了。分为3种技术。字符串匹配的分词方法
这是种常用的分词法,百度就是用此类分词。字符串匹配的分词方法,又分为3种分词方法。(1).正向最大匹配法就是把一个词从左至右来分词。举个例子:”不知道你在说什么”这句话采用正向最大匹配法是如何分的呢?“不知道,你,在,说什么”。(2).反向最大匹配法"不知道你在说什么"反向最大匹配法来分上面这段是如何分的。“不,知道,你在,说,什么”,这个就分的比较多了,反向最大匹配法就是从右至左。(3).就是最短路径分词法。就是说一段话里面要求切出的词数是最少的。“不知道你在说什么”最短路径分词法就是指,把上面那句话分成的词要是最少的。“不知道,你在,说什么”,这就是最短路径分词法,分出来就只有3个词了。(4).双向最大匹配法。而有一种特殊的情况,就是关键词前后组合内容被认为粘性相差不大,而搜索结果中也同时包含这两组词的话,百度会进行正反向同时进行分词匹配。词义分词法
就是一种机器语音判断的分词方法。很简单,进行句法、语义分析,利用句法信息和语义信息来处理歧义现象来分词,这种分词方法,还不成熟,处在测试阶段。统计分词法
根据词组的统计,就会发现两个相邻的字出现的频率最多,那么这个词就很重要。就可以作为用户提供字符串中的分隔符,这样来分词。比如,“我的,你的,许多的,这里,这一,那里”等等,这些词出现的比较多,就从这些词里面分开来。转载于:https://www.cnblogs.com/cuihongyu3503319/p/9088723.html
1:分词技术
1.1:规则分词
基于规则的分词是一种机械分词的方法,主要是通过维护词典,在切分语句时,将语句的每个字符串与词表中的词进行逐一匹配,找到则切分,否则不切分。
1.1.1 正向最大匹配法
正向最大匹配法(Maximum Match Method,MM法)的基本思想:假定分词词典中的最长词有i个汉字字符,则用被处理文档的当前子串中的前i个字作为匹配字段,查找字典。如果字典中存在这样的一个i字词,则匹配成功,匹配字段被作为一个词切分出来。如果词典中找不到这样的一个i字词,则匹配失败,将匹配字段中的最后一个字去掉,对剩下的字串重新进行匹配处理。如此进行下去,直到匹配成功,即切分出一个词或剩余字串的长度为0为止。这样就完成了一轮匹配,然后取下一个i字字串进行匹配处理,直到文档被扫描完为止。
算法描述:
1:从左向右取待切分汉语句的m个字符作为匹配字段,m为机器词典中最长词条的字符数。
2:查找机器词典并进行匹配。若匹配成功,则将这个匹配字段作为一个词切分出来。若匹配不成功,则将这个匹配字段的最后一个字去掉,剩下的字符串作为新的匹配字段,进行再次匹配,重复以上过程明知道切分出所有词为止。
例如:
现在有个词典,最长词的长度是5,词典中有“南京市长”和“长江大桥”两个词。
现对“南京市长江大桥”
正向最大匹配法结果:“南京市长”,“江”,“大桥”
示例代码:
class MM(object): def __init__(self): self.window_size = 3 def cut(self, text): result = [] index = 0 text_length = len(text) dic = ['研究', '研究生', '生命', '命', '的', '起源', '牛皮', '厉害', '学习', '呕吼'] while text_length > index: for size in range(self.window_size + index, index, -1): # 4,0,-1 piece = text[index:size] if piece in dic: index = size - 1 break index = index + 1 result.append(piece + '----') print(result) if __name__ == '__main__': text = '研究生命的起源真牛皮车呀' tokenizer = MM() print(tokenizer.cut(text))
输出结果:
['研究生----', '命----', '的----', '起源----', '真----', '牛皮----', '车----', '呀----']
如此可看结果并不能让人很满意。
1.1.2 逆向最大匹配法
逆向最大匹配法(Reverse Maximum Match Method,RMM法)原理:基本原理与MM法相同,不同的是分词切分的方向与MM法相反。
现对“南京市长江大桥”进行逆向最大匹配法,结果:“南京市”,“长江大桥”。
这样的结果看似是对的,但是如果是 南京的市长 姓名是 "江大桥" 呢?这样分词 还是不对的。
示例代码:
class RMM(object): def __init__(self): self.window_size = 3 def cut(self, text): result = [] index = len(text) dic = ['研究', '研究生', '生命', '命', '的', '起源', '牛皮', '厉害', '学习', '呕吼'] while index > 0: for size in range(index - self.window_size, index): piece = text[size:index] if piece in dic: index = size + 1 break index = index - 1 result.append(piece + '----') result.reverse() print(result) if __name__ == '__main__': text = '研究生命的起源真牛皮车呀' tokenizer = RMM() print(tokenizer.cut(text))
输出:
['研究----', '生命----', '的----', '起源----', '真----', '牛皮----', '车----', '呀----']
这样的话,输出结果就靠谱了点。
1.1.3 双向最大匹配法
双向最大匹配法(Bi-directction Matching method)是将正向最大匹配法得到的分词结果和逆向最大匹配法得到的结果进行比较,然后按照最大匹配原则,选取次数切分最少的作为结果。
例如:还是 “南京市长江大桥”,
正向结果:“南京市长”,“江”,“大”,“桥”
逆向结果:南京市,长江大桥。
示例代码:
class MM(): def __init__(self): self.window_size = 3 def cut(self, text): result = [] index = 0 text_length = len(text) dic = ['研究', '研究生', '生命', '命', '的', '起源'] while text_length > index: for size in range(self.window_size + index, index, -1): piece = text[index:size] if piece in dic: index = size - 1 break index = index + 1 result.append(piece + '----') return (result) class RMM(): def __init__(self): self.window_size = 3 def cut(self, text): result = [] index = len(text) dic = ['研究', '研究生', '生命', '命', '的', '起源'] while index > 0: for size in range(index - self.window_size, index): piece = text[size:index] if piece in dic: index = size + 1 break index = index - 1 result.append(piece + '----') result.reverse() return (result) if __name__ == '__main__': text = '研究生命的起源' count1 = count2 = 0 First = MM() Second = RMM() # result1 和 result2 分别是正向和逆向切词结果 result1 = First.cut(text) result2 = Second.cut(text) # 如果两个结果一样,随便返回一个 if result1 == result2: print(result1) else: # 获取 两个结果的长度 # len() 方法返回对象(字符、列表、元组等)长度或项目个数。 a = len(result1) b = len(result2) # 如果相同 循环两个数组 并比较 单词数量 # 因为返回的分词都有后缀 '----',所以比较时==5 if a == b: for A in result1: if len(A) == 5: count1 = count1 + 1 for B in result2: if len(B) == 5: count2 = count2 + 1 if count1 > count2: print(result2) else: print(result1) elif a > b: print(result2) elif a < b: print(result1)
结果:
['研究----', '生命----', '的----', '起源----']
1.2:统计分词
简介:
把每个词看做是由词的最小单位的各个字组成,如果相连的字在不同的文本中出现的次数越多,就证明这相连的字很有可能就是一个词。
利用字与字相邻出现的频率来反应成词的可靠度,统计语料中相邻垂涎的各个字的组合的频度,当这个组合达到某个临界值时,就认为这个词组是可以构成一个词语。
主要步骤:
1):建立统计语言模型。
2):对句子进行单词划分,然后对划分结果进行概率计算,获得概率最大的分词方式。用到了统计学习算法,如 隐含马尔可夫(HMM),条件随机场(CRF)等。
1.2.1:语言模型(详情自行百度了解)
1.2.2:HMM模型(详情自行百度了解)
1.2.3:其他统计分词算法(详情自行百度了解)
2:中文分词工具——Jieba
jieba分词官方地址:https://github.com/fxsjy/jieba
安装方式:
pip install jieba,或 pip3 install jieba
2.1:Jieba三种分词模式
示例代码:
import jieba
sent = '中文分词是文本处理不可或缺的一步!'
seg_list = jieba.cut(sent, cut_all=True)
print('全模式', '/'.join(seg_list))
seg_list = jieba.cut(sent, cut_all=False)
print('精确模式', '/'.join(seg_list))
seg_list = jieba.cut(sent)
print('默认模式', '/'.join(seg_list))
seg_list = jieba.cut_for_search(sent)
print('搜索引擎模式', '/'.join(seg_list))
返回:
全模式 中文/分词/是/文本/文本处理/本处/处理/不可/不可或缺/或缺/的/一步/!
精确模式 中文/分词/是/文本处理/不可或缺/的/一步/!
默认模式 中文/分词/是/文本处理/不可或缺/的/一步/!
搜索引擎模式 中文/分词/是/文本/本处/处理/文本处理/不可/或缺/不可或缺/的/一步/!
高频词:一般是指文档中出现频率较高且非无用的词语,其一定程度上代表了文档的焦点所在。
高频词提取其实就是自然语言处理的TF(Term Frequency)策略。主要有以下干扰项:
代码示例:
# 读取数据
def get_content(path):
with open(path, 'r', encoding='utf-8', errors='ignore') as f:
content = ''
for l in f:
l = l.strip()
content += l
return content
# 定义高频词统计的函授,输入为一个词的数组
def get_TF(words, topK=10):
tf_dic = {}
for w in words:
tf_dic[w] = tf_dic.get(w, 0) + 1
return sorted(tf_dic.items(), key=lambda x: x[1], reverse=True)[:topK]
if __name__ == '__main__':
import glob
import random
import jieba
files = glob.glob('../Desktop/1.txt')
corpus = [get_content(x) for x in files]
sample_inx = random.randint(0, len(corpus))
split_words = list(jieba.cut(corpus[sample_inx]))
print('样本之一:' + corpus[sample_inx])
print('样本分词效果:' + '/'.join(split_words))
print('样本的topk(10) 词:' + str(get_TF(split_words)))
输出结果:
样本之一:在苹果最新获批的一项技术专利中,展示了屏幕检测光线的技术细节。该技术专利可能帮助苹果将 Touch ID 指纹传感器和 Face ID 面部识别传感器整合到屏幕下方,从而取消目前 iPhone 机型中的刘海区域。在技术专利名称为“用于检测电子设备显示屏发光层所受光线的传感系统”,简而言之,苹果计划在显示屏下方嵌入一个光线检测传感器,该传感器可用于 Face ID 以及 Touch ID。该公司分享了该技术的两种潜在实现细节。在第一种情况下,显示屏背后的光线传感器可以组合出触摸屏幕的物体的图像。这暗示了Touch ID的回归。除此之外,苹果专利中还提到了使用环境光传感器进行操作。第二种实施方式将使用光电二极管或太阳能电池阵列来组装图像的像素。此外,该系统将积累来自光电二极管的电信号,以感知光的强度以及颜色。第二种实现方式指向Face ID,它可能会在未来的iPhone迭代中出现。需要注意的是,苹果公司申请了很多专利,不一定所有的专利都能商用。然而,该专利确实让人看到了该公司的未来前景和该技术的潜在引入。
样本分词效果:在/苹果/最新/获批/的/一项/技术/专利/中/,/展示/了/屏幕/检测/光线/的/技术细节/。/该/技术/专利/可能/帮助/苹果/将/ /Touch/ /ID/ /指纹/传感器/和/ /Face/ /ID/ /面部/识别/传感器/整合/到/屏幕/下方/,/从而/取消/目前/ /iPhone/ /机型/中/的/刘海/区域/。/在/技术/专利/名称/为/“/用于/检测/电子设备/显示屏/发光/层所受/光线/的/传感/系统/”/,/简而言之/,/苹果/计划/在/显示屏/下方/嵌入/一个/光线/检测/传感器/,/该/传感器/可/用于/ /Face/ /ID/ /以及/ /Touch/ /ID/。/该/公司/分享/了/该/技术/的/两种/潜在/实现/细节/。/在/第一种/情况/下/,/显示屏/背后/的/光线/传感器/可以/组合/出/触摸/屏幕/的/物体/的/图像/。/这/暗示/了/Touch/ /ID/的/回归/。/除此之外/,/苹果/专利/中/还/提到/了/使用/环境光/传感器/进行/操作/。/第二种/实施/方式/将/使用/光电/二极管/或/太阳能/电池/阵列/来/组装/图像/的/像素/。/此外/,/该/系统/将/积累/来自/光电/二极管/的/电信号/,/以/感知/光/的/强度/以及/颜色/。/第二种/实现/方式/指向/Face/ /ID/,/它/可能/会/在/未来/的/iPhone/迭代/中/出现/。/需要/注意/的/是/,/苹果公司/申请/了/很多/专利/,/不/一定/所有/的/专利/都/能/商用/。/然而/,/该/专利/确实/让/人/看到/了/该/公司/的/未来/前景/和/该/技术/的/潜在/引入/。
样本的topk(10) 词:[('的', 17), (' ', 15), (',', 13), ('。', 12), ('该', 8), ('专利', 7), ('了', 6), ('ID', 6), ('传感器', 6), ('在', 5)]
通过上面的结果,发现诸如,“的”“,”“。”“该”等词占据着很高的位置,而这类词对文章焦点并没有太大意义。
因此,我们可以自定义词典,然后进行优化。
首先定义一个自定义停用词库:
添加代码:
def stop_words(path):
with open(path, 'r', encoding='utf-8', errors='ignore') as f:
return [l.strip() for l in f]
修改主函数:
if __name__ == '__main__':
import glob
import random
import jieba
files = glob.glob('../Desktop/1.txt')
corpus = [get_content(x) for x in files]
sample_inx = random.randint(0, len(corpus))
split_words = [x for x in jieba.cut(corpus[sample_inx]) if
x not in stop_words('../Desktop/stop_words.utf8')]
print('样本之一:' + corpus[sample_inx])
print('样本分词效果:' + '/'.join(split_words))
print('样本的topk(10) 词:' + str(get_TF(split_words)))
最终结果:
样本的topk(10) 词:[(' ', 15), ('专利', 7), ('ID', 6), ('传感器', 6), ('技术', 5), ('苹果', 4), ('光线', 4), ('屏幕', 3), ('检测', 3), ('将', 3)]
中文分词技术
简介
自然语言处理的一项核心技术。在语言理解中,词是最小的能够独立活动的有意义的语言成分。将词确定下来是理解自然语言的第一步,只有跨越这一步,中文才能像英文那样过渡到短语划分、概念抽取以及主题分析,已至自然语言理解,最终达到智能计算的最高境界。因此,每个NLP研究者应该掌握最基本的分词技术。
“词”这个概念一直是汉语语言学界纠缠不清而又绕不开的问题。“词是什么”(词的抽象定义)和“什么是词”(词的具体界定),这两个问题迄今为止也没有权威、明确的表述,更不可能拿出令人认可的词表来。主要的难点在于汉语结构与英语等语种差异很大,对词的构成边界方面很难界定。
在英语中,单词本身就是“词”的表达,一篇英文文章就是“单词”加分隔符(空格或者逗号和句号)来表示的,而在汉语中,词以字为基本单位的,但是一篇文章的语义表达确实 以词来划分的。因此,在处理中文文本时,需要进行分词处理,将句子转化为词的表示。这个切词处理过程就是中文分词,它通过计算机自动识别出句子的词,在词间加入边界标记符,分隔出各个词汇。整个过程看似简单,然而实践起来确实无比复杂的,主要就是因为中文歧义。
分词策略
很多句子人来判定都有问题,更不用说机器了。此外,像未登录词、分词粒度粗细等都是影响分词效果的重要因素。从中文分词提出以来,历经30多年的探索,提出来很多方法,归纳为**规则分词、统计分词和混合分词(规则+统计)**这三个主要流派。
规则分词是最早兴起的办法,主要是通过人工设立词库,按照一定的方式进行匹配切分,其实现简单高效,但对新词很难进行处理。统计分词是随着机器学习的技术兴起,应用到了分词任务上而产生的,它能够较好应对新词发现等特殊场景。然而,实践中统计分词太过依赖语料的质量。混合分词是基于前两者的结合,如今大多采用这种方式。
规则分词
基于规则的分词是一种机械分词方法,主要是通过维护词典,在切分语句时将语句的每个字符串与词表中的词逐一匹配,找到则切分,否则不予切分。按照匹配切分的方式,主要有正向最大匹配法、逆向最大匹配法以及双向匹配法三种。这三种方法每一个都是对前者的优化。基于规则的分词,一般简单高效,但是词典的维护是一个庞大的工程。在网络发达的今天,新词层出不穷,很难通过词典覆盖所有词。
统计分词
随着大规模语料的建立,统计机器学习方法的研究和发展,基于统计的中文分词算法渐渐成为主流。其主要思想是把每个词看做是由词的最小单位的各个字组成的,如果相连的字在不同的文本中出现的次数越多,就证明这相连的字很可能就是一个词。因此我们就可以利用字与字相邻出现的频率来反映成词的可靠度,统计语料中相邻出现的各个字的组合的频度,当组合频度高于某一个临界值时,我们便认为此字组可能会构成一个词语。
基于统计的分词一般做如下两个步骤。
主要的有HMM模型、CRF模型、神经网络分词算法(常采用CNN、LSTM等深度学习网络自动发现一些模式和特征,然后结合CRF、softmax等分类算法进行分词预测。)对比机械分词法,统计分词方法不需要耗费人力维护词典,能较好地处理歧义和未登录词,是目前分词的主流方法。但是,其分词的效果很依赖训练语料的质量,且计算量很大。
事实上,目前不管是基于规则的算法、还是基于HMM、CRF或者深度学习的方法,其分词效果在具体任务中,其实差距并没有多明显。在实际工程应用中,多是基于一种分词方法,然后用其他分词算法加以辅助。如此,能在保证词典分词准确率的基础上,对未登录词和歧义词有较好的识别,jieba就是如此实现的。
北大之前开源的pkuseg在我之前的博客有过介绍。近年来,NLP技术的日益成熟,开源实现的分词工具越来越多,如Ansj、盘古分词等。相对而言,jieba有着如下优势。
jieba结合了基于规则和统计两种方法。首先,基于前缀字典的词图扫描;然后,对于未登录词,使用基于汉字成词的HMM模型,采用了Viterbi算法进行推导。
pip install jieba
三种分词模式(见JiebaDemo)
import jieba
sentence = "中文分词是文本处理不可或缺的一步!"
seg_list = jieba.cut(sentence, cut_all=True)
print('全模式', '/'.join(seg_list))
seg_list = jieba.cut(sentence, cut_all=False)
print('精确模式', '/'.join(seg_list))
seg_list = jieba.cut(sentence)
print('默认精确模式', '/'.join(seg_list))
seg_list = jieba.cut_for_search(sentence)
print('搜索引擎模式', '/'.join(sentence))
jieba有默认的一套字典,然而很多情况下,不同的应用场合需要不同的字典,jieba支持用户自定义字典,只要分词之前使用下面的代码加载即可。
jieba.load_userdict('./data/user_dict.utf8')
这个用户自定义的字典格式如下。
本案例目标为高频词提取,数据集为搜狗实验室新闻数据。高频词一般指文档中出现频率较高且非无用的词语,其一定程度上代表了文档的焦点所在。针对单篇文档,可以作为关键词看待。对于新闻这样的多篇文档,可以作为热词,发现舆论焦点。高频词提取其实就是NLP中的TF策略。(后面具体介绍)主要有标点符号和停用词(“的”“了”等无意义词)两个干扰项。
下面的代码是使用jieba,针对搜狗实验室新闻数据,进行高频词提取。
def get_content(path):
"""
获取文件内容
:param path:
:return:
"""
with open(path, 'r', encoding='gbk', errors='ignore') as f:
content = ''
for l in f:
l = l.strip()
content += l
return content
def get_TF(words, topK=10):
"""
计算TF值
:param words:
:param topK:
:return:
"""
tf_dic = {}
for w in words:
tf_dic[w] = tf_dic.get(w, 0) + 1
return sorted(tf_dic.items(), key=lambda x: x[1], reverse=True)[:topK]
def stop_words(path):
"""
获取停用词
:param path:
:return:
"""
with open(path, encoding='utf-8') as f:
return [l.strip() for l in f]
stop_words('./data/stop_words.utf8')
def main():
"""
主模块
:return:
"""
# 文件操作模块,允许通配符等
import glob
import jieba
import random
files = glob.glob('./data/news/C000013/*.txt')
corpus = [get_content(x) for x in files]
# 随机文字进行高频词提取
sample_inx = random.randint(0, len(files))
split_words = [x for x in jieba.cut(corpus[sample_inx]) if x not in stop_words('./data/stop_words.utf8')]
print('样本之一:' + corpus[sample_inx])
print('样本分词效果:' + '/ '.join(split_words))
print('样本的topK(10)词:' + str(get_TF(split_words)))
if __name__ == '__main__':
main()
结果如下图。
本问内容参考自《Python自然语言处理实战》此书,具体数据集代码可以查看我的GitHub,欢迎star或者fork
1.导语:
本周对自然语言处理的分词技术进行了学习。本文针对分词技术的进行了全视角的概览,目标是掌握什么是分词技术、为什么需要分词技术和如何使用分词技术。后续将分不同篇幅对其中内容进行深挖和讲解。文章结构如下(全文阅读时间大约10分钟):
2.简介:
首先,简单介绍一下自然语言处理技术(简称NLP),是人工智能领域中一个重要的方向,主要研究如何让人类和计算机之间,能够使用人类能够理解的语言进行有效沟通,其涵盖语言学、计算机科学、数学等多种交叉学科。在现如今人工智能技术迅速发展时期,AI技术逐步从感知智能朝认知智能大跨步迈进,NLP技术或许是人类实现强人工智能的关键所在。
什么是分词技术?分词技术属于自然语言处理技术范畴,分词就是将句子中的词语划分出来的技术,人能够知道哪些是词语,如何让计算机能够理解和划分,其处理过程就是分词。当然,分词只是一种工具,场景不同,要求也不同。
为什么需要分词技术?因为许多自然语言处理技术都会围绕词语展开,例如情感分析、问答模型等;分词效果直接影响上层技术的效果;并且,词语是最小粒度有意义的语言成分;英文往往不需要分词,但中文需要,因为中文在基本文法上有其特殊性,主要体现在:1.英文以空格作为天然分隔符,中文词语间没有分隔2.古文词通常是单个汉字,而现在汉语双字多字词比较多3.词和词组边界模糊
3.技术难点
到目前为止,中文分词技术仍存在三大难题未完全突破:1.分词的规范:字和词的界限往往很模糊,并没有一个公认、权威的标准,会有很多不同主观上的分词差异2.歧义词的切分,歧义词的情况分为:交集型歧义、组合型歧义和混合型歧义。另外,更头痛的情况就是真歧义,即使是人都无法判断的情况3.未登录词识别,就是新词的意思,如人名、地名、网络用词等等
4.分词算法概述
4.1算法中的数据结构
在展开算法实现之前,先来讲讲算法中提到的数据结构:一个是词典,一个是词图。
词典一般可以用链表或数组实现,更高级的词典还有Trie树和AC自动机等,例如在HanLp的源码中用户自定义词典的识别是用的AC自动机实现的(需要了解Trie树、KMP算法、AC自动机可以在后续的推文中学习)。
图作为一种常见的数据结构,其存储方式一般有两种:邻接矩阵和邻接表。所谓矩阵其实就是二维数组,所谓邻接矩阵存储结构,就是每个顶点用一个一维数组存储每条边的信息,就能用矩阵表示图中各顶点之间的邻接关系。
邻接表,存储方法跟树的子链表示法相类似,是一种顺序分配和链式分配相结合的存储结构。
4.2.分词算法简介
现有的分词算法,大体上可以分为如下几类:1.基于规则的分词算法 2.基于统计的分词算法 3.基于语义的分词算法 4.基于理解的分词算法(该部分内容在本期后续推文中会展开讲解)
基于规则的分词算法主要思想是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行匹配。若在词典中找到某个字符串,则匹配成功。该方法有三个要素,即分词词典、文本扫描顺序和匹配原则。
优点是简单,容易实现。缺点是:匹配速度慢;存在交集型和组合型歧义切分问题;词本身没有一个标准的定义,没有统一标准的词集;不同词典产生的歧义也不同;缺乏自学习的智能性。基于统计的分词算法的主要核心是词是稳定的组合,因此在上下文中,相邻的字同时出现的次数越多,就越有可能构成一个词。因此字与字相邻出现的概率或频率能较好地反映成词的可信度。可以对训练文本中相邻出现的各个字的组合的频度进行统计,计算它们之间的互现信息。互现信息体现了汉字之间结合关系的紧密程度。当紧密程 度高于某一个阈值时,便可以认为此字组可能构成了一个词。该方法又称为无字典分词。
实际运用中会结合基于规则的分词方法,不仅发挥词典匹配的速度快的优势,又结合无词典分词能够结合上下文识别、消歧的优势。基于语义的分词算法引入了语义分析,对自然语言自身的语言信息进行更多的处理。
基于理解的分词算法,是通过让计算机,模拟人对句子的理解,达到识别词组的效果。基本思想是在分词的同时进行句法、语义的分析,利用句法和语义信息来处理歧义现象。通常包含三部分:分词子系统、句法语义子系统、总控部分。在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信息,来对分词歧义进行判断,模拟人对句子的理解过程。目前基于理解的分词方法主要有专家系统分词法和神经网络分词法等。
5.python工具
最后介绍一些常用的python分词库(该部分内容在本期后续推文中会展开讲解如何使用):
1.jieba:专用于分词的python库,分词效果好.支持三种分词模式:精准模式、全模式和搜索引擎模式;并且支持繁体分词;可以自定义词典。它主要使用的分词算法是基于统计的分词算法:
a.基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG)
b.采用动态规划查找最大概率路径,找出基于词频的最大切分组合c.对未登录词,采用基于汉字成词能力的HMM模型,使用Viterbi算法Github地址:https://github.com/fxsjy/jieba2.THULAC:由清华大学自然语言处理与社会人文计算实验室研制推出的一套中文词法分析工具包,具有中文分词和词性标注功能。THULAC具有如下几个特点:
a.能力强。利用集成的目前世界上规模最大的人工分词和词性标注中文语料库(约含5800万字)训练而成,模型标注能力强大。b.准确率高。该工具包在标准数据集Chinese Treebank上分词的F1值可达97.3%,词性标注的F1值可达到92.9%,与该数据集上最好方法效果相当。c.速度较快。同时进行分词和词性标注速度为300KB/s,每秒可处理约15万字。只进行分词速度可达到1.3MB/s.Github地址:https://github.com/thunlp/THULAC-Python3.pkuseg:由北京大学语言计算与机器学习研究组研制推出的一套全新的中文分词工具包。具有如下几个特点:
a.分词准确率。相比于其他的分词工具包,该工具包在不同领域的数据上都大幅提高了分词的准确度。根据测试结果,pkuseg分别在示例数据集(MSRA和CTB8)上降低了79.33%和63.67%的分词错误率。b.多领域分词。该分词包训练了多种不同领域的分词模型。根据待分词的领域特点,用户可以自由地选择不同的模型。c.支持用户自训练模型。支持用户使用全新的标注数据进行训练。Github地址:https://github.com/lancopku/PKUSeg-python4.FoolNLTK:根据该项目所述,这个中文工具包的特点有如下几点:
a.可能不是最快的开源中文分词,但很可能是最准的开源中文分词b.基于 BiLSTM 模型训练而成c.包含分词,词性标注,实体识别, 都有比较高的准确率d.用户自定义词典Github地址:https://github.com/rockyzhengwu/FoolNLTK5.LTP:语言技术平台(Language Technology Platform,LTP)是哈工大社会计算与信息检索研究中心历时十年开发的一整套中文语言处理系统。LTP制定了基于XML的语言处理结果表示,并在此基础上提供了一整套自底向上的丰富而且高效的中文语言处理模块(包括词法、句法、语义等6项中文处理核心技术),以及基于动态链接库(Dynamic Link Library, DLL)的应用程序接口、可视化工具,并且能够以网络服务(Web Service)的形式进行使用。GitHub地址:https://github.com/HIT-SCIR/pyltptp
另外运行的时候需要下载模型,模型还比较大,下载地址:http://ltp.ai/download.html6.SnowNLP: Simplified Chinese Text Processing,可以方便的处理中文文本内容,是受到了 TextBlob 的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个方便处理中文的类库,并且和 TextBlob 不同的是,这里没有用 NLTK,所有的算法都是自己实现的,并且自带了一些训练好的字典。GitHub 地址:https:http://github.com/isnowfy/snownlp
作者原创,请勿替换文字
公众号:语言智能体