首先,我们先看一个整体架构图
一、分词框架
整体采用结巴分词+自定义词库+字典树的模式进行分词优化。处理流程为:原生数据—>文本清理—>特定预处理—>标识化处理—>罕见词/停用词等移除—>词库匹配—>输出数据
同时,制定以下规则:1、词库匹配时只输入名词性字符。
2、在标识化处理过程中,指定自己定义的字典,其目的在于虽然可以通过Viterbi算法识别出新词,但自行添加新词库可以保证更高的正确率
对于分词状态,由于jieba分词中使用的是4-tag,因此我们以4-tag进行计算。4-tag,也就是每个字处在词语中的4种可能状态,B、M、E、S,分别表示Begin(这个字处于词的开始位置)、Middle(这个字处于词的中间位置)、End(这个字处于词的结束位置)、Single(这个字是单字成词)
二、数据再加工
在原始数据进行词库匹配之前,会对原始数据进行加工处理,筛除掉所有特殊字符、各种进制编码、各种品牌、功能性描述语言,然后根据词性只保留名词类词组,用于简单的词义消歧,最后,再将所得的结果拼接成字符串与词库(通过字典树的方式)进行匹配。
关于维特比算法:该算法致力寻找一条最佳路径,以便最好地解释观测到的序列。本质上,即为多步骤每步多选择模型的最优选择问题viterbi算法是隐马第三个问题(求观察序列的最可能的标注序列)的一种实现方式。viterbi算法其实就是多步骤每步多选择模型的最优选择问题,其在每一步的所有选择都保存了前续所有步骤到当前步骤当前选择的最小总代价(或者最大价值)以及当前代价的情况下前继步骤的选择。依次计算完所有步骤后,通过回溯的方法找到最优选择路径。符合这个模型的都可以用viterbi算法解决,隐马模型的第三问题刚好符合这个模型,所以才采用了viterbi算法 。
三、demo
import jieba.posseg as pseg jieba.load_userdict("dictionary.dic")#导入自定义字典 def text_retrieval(self,words): words =self.text_clean(words) #维特比算法会有发现新词、非字典词的功能 words = pseg.cut(words,HMM=True) #采用隐马模型发现新词 return_word = '' for word,flag in words: if flag=='n': return_word = return_word+word return return_word