一、基本文本处理技能
- 分词的概念
中文和英文不同,英文中句子天然已经分割为单词,但是中文中字与字之间紧紧连在一起,需要进行分词,分词算法有:基于字符串匹配算法、基于理解的算法、基于统计的算法
- 分词的正向最大匹配
分词的正向最大匹配是基于分治和贪婪两种算法思想,若不设立最大的处理长度,就是贪婪的思想,具体是先以整句为单位,就去词典匹配,若匹配不到,就减少句子长度进行匹配,若匹配到,句子起点后移,继续递归执行,知道整个句子被若干个词匹配到;
只基于贪婪方式,实际工作中无法使用,句子一长就需要迭代的次数就非常多,所以需要结合分治的思想进行处理 - 分词的反向最大匹配
反向最大匹配是从后往前选取最大长度的串,从选取串开始往后匹配,而删减的也是左边的字符 - 分词双向最大匹配
双向就是结合正向最大和反向最大的结果,对两个结果进行比较,从而决定正确的分词方式,当前向和逆向分词数量不同时,选择数量较少的那个分词结果,分词数量相同,依次比较分词结果,相同位置如果分词相同,则选取最后的结果,若相应位置分词结果不一样则选取字符较小的那个为分词结果
- 词、字符频率统计
可以使用Python中的collection.Counter模块
二、语言模型
- unigram、bigram和trigram的概念
n-gram是一种基于统计语言模型的算法,它的思想是将文本里面的内容按照指定的单元进行大小为N的滑动窗口操作,每次取得长度为N的序列,直到滑窗结束
- unigram是指单个词为一个单元,每个词之间没关联关系
- bigram是指两个词为一个单元
- trugram是指三个词为一个单元
- unigram和bigram频率统计
unigram等同于词频统计,bigram频率统计只需要取n-gram,然后传入到Counter()中即可
三、文本矩阵化
- 分词
分词工具采用结巴中文分词,涉及到的算法:
- 基于Trie树结构实现高效的词图扫描,生成句子中汉字所有可能成词的情况所构成的有向无环图(DAG)
- 采用动态规划查找最大概率路径,找到基于词频的最大划分组合
- 对于未登录词,采用基于汉字成词能力的HMM模型,使用了Viterbi算法
结巴中文分词支持的三种分词模式包括:
- 精确模式:视图将句子最精确的切开,适合文本分析;
- 全模式:把句子中所有的可以成词的语句都扫描处理,速度非常快,但不解决歧义;
- 搜索引擎模式:在精确模式的基础上,对分词再次切分,提高召回率,适合用于搜索引擎分词
- 去停用词,构建词表
#去停用词
lists=[]
count =0
for i in x_train_data:
word_list=[word for word in jieba.cut(i) if word not in stopwords]
lists.append(word_list)
#取前100条数据加快处理
data = lists[:100]
#统计词表出现次数
Wordlist ={}
for i in data:
for j in wordList:
wordList[j] +=1
else:
wordList[j] =1
#创建词表
count=0
dic ={}
for i,j in wordList.items():
if j>2:
dic[i]=count
count+=1
# 反向词表
resDic={}
for i,j in dic.items():
resDic[j]=i
- 每篇文档向量化
UNK=0
for i in range(len(data)):
data [i] =[dic[j] if j in dic
else UNk for j in data[i]