pymining中的词频矩阵的生成过程

最近在看pymining开源项目,对其词频矩阵的生成过程有些模糊,现在过一遍。

首先,pymining中所定义词频矩阵是一个什么样的矩阵?它是一个行 为 文章编号,列为单词的矩阵,而矩阵中的元素是该列单词在该行文章中出现的次数。

例如:

文章1: 小明爱上学。小明爱吃青菜 。 文章2:小明今天去上学了,小明讨厌吃萝卜

生成的词频矩阵可以是:

 小明上学青菜萝卜
文章12110
文章22101

怎样从文章中取出各个关键词呢?首先需要一个词库,它近似包含了所有文章中会出现的词,然后通过分词算法将词库中的词与文章进行匹配,以提取出关键词。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]中




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值