最近在看pymining开源项目,对其词频矩阵的生成过程有些模糊,现在过一遍。
首先,pymining中所定义词频矩阵是一个什么样的矩阵?它是一个行 为 文章编号,列为单词的矩阵,而矩阵中的元素是该列单词在该行文章中出现的次数。
例如:
文章1: 小明爱上学。小明爱吃青菜 。 文章2:小明今天去上学了,小明讨厌吃萝卜
生成的词频矩阵可以是:
小明 | 上学 | 青菜 | 萝卜 | |
文章1 | 2 | 1 | 1 | 0 |
文章2 | 2 | 1 | 0 | 1 |
怎样从文章中取出各个关键词呢?首先需要一个词库,它近似包含了所有文章中会出现的词,然后通过分词算法将词库中的词与文章进行匹配,以提取出关键词。pymining采用的是贪心的方法取出关键词。
pymining是怎样完成这个过程的呢?词频矩阵又是采用何种形式存储的呢? 接下来将一一介绍:
先介绍一下pymining的配置文件:
<?xml version="1.0"?>
<config>
<__segmenter__>
<main_dict>dict/dict.main</main_dict>
</__segmenter__>
<__matrix__>
</__matrix__>
<__global__>
<term_to_id>mining/term_to_id</term_to_id>
<id_to_term>mining/id_to_term</id_to_term>
<id_to_doc_count>mining/id_to_doc_count</id_to_doc_count>
<class_to_doc_count>mining/class_to_doc_count</class_to_doc_count>
<id_to_idf>mining/id_to_idf</id_to_idf>
</__global__>
<__filter__>
<rate>0.9</rate>
<method>max</method>
<log_path>mining/filter.log</log_path>
<model_path>mining/filter.model</model_path>
</__filter__>
<naive_bayes>
<model_path>mining/naive_bayes.model</model_path>
<log_path>mining/naive_bayes.log</log_path>
</naive_bayes>
<twc_naive_bayes>
<model_path>mining/naive_bayes.model</model_path>
<log_path>mining/naive_bayes.log</log_path>
</twc_naive_bayes>
</config>
其中:dict/dict.main为pymining自带字典,其中包含41897个单词,每个单词占一行。
1 pymining首先通过 Configuration(minidom.parse(path).childNodes[0]) 得到<config>对象,它保存在Configuration对象下的mCurNode
2 然后在类GlobalInfo中保存<global>对象,并用四个字串来分别保存“mining/term_to_id”,“mining/id_to_term”,“mining/id_to_doc_count” ,“mining/class_to_doc_count”,“mining/id_to_idf”。
3 生成一个Text2Matrix类的对象 其内部生成了一个segmenter对象segmenter,segmenter的curNode是<__segmenter__>对象 ,然后segmenter的内部生成了一个字典mainDict,字典的key是dict.main中的每一个单词,value全部为1。
4 通过Text2Matrix类自带的CreateTrainMatrix函数生成词频矩阵。
pymining采用termtoid字典(key:word,value:id) ,idtoterm字典(key: id,value: word) 和三个列表col,row,val,来存储训练文本转化成的词频矩阵(训练文本逐行划分)
若一行文本为: 小明爱吃青菜,小明喜欢小白,小明爱游泳。存储的方式为(在这里不把‘爱,吃,喜欢’作为关键词):
termtoid:{小明:1 ,青菜:2,小白:3,游泳:4} termtoid与idtoterm相反
col :[1,2,3,4] (代表四个关键词) row[0,4] (代表有4个关键词,0为默认存在) val:[3,1,1,1] 代表col中出现的词在文章中出现的次数
若再次输入一行文本: 小白也喜欢小明 小白喜欢吃蒜薹,小白喜欢跳绳
则termtoid:{小明:1 ,青菜:2,小白:3,游泳:4,蒜薹:5,跳绳:6} termtoid与idtoterm相反
col :[1,2,3,4,2,1,5,6] (代表两篇文章总共出现了8个关键词) row[0,4,8] (代表第二篇文章也有4个关键词,0为默认存在)
val:[3,1,1,1,3,1,1,1] 代表col中出现的词在文章中出现的次数
所以col row val 的含义是:
row 的index代表了第几篇文章(词频矩阵行),count = row[x]-r[x-1]表示文章x所包含的关键字数目,这些关键词对应的id保存在col[x-count]至col[x-1]中,这些关键词出现的次数存储在val[x-count]至val[x-1]中