注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

anqiang专栏

不要问细节是怎么搞的,源码说明一切

 
 
 

日志

 
 

WVTool使用学习一 构建文本空间向量  

2009-04-23 21:09:21|  分类: WVTool |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

在我们进行数据挖掘学习的过程中,除了有现成的整理好的数据集供我们使用外,我们还需要自己构建数据集。对于做文本分类的研究者来说,要做的第一步就是要将文本向量化,然后在向量空间中对文本进行研究。这样就出现了一个问题,如何将文本向量化?WVTool是一款开源软件,它主要做文本词频方面的处理,对于实现文本向量化非常有用。它支持对文本、半结构化内容(HtmlXML)的向量化处理功能。并且它现在与RapidMiner Data Mining suit (YALE)可以良好的集成,因此它的应用前景还是比较好的。

本文将对WVTool构建向量模型做一个简要的介绍。

对于一篇文章来说,它是由很多的词来组成;而对于一个数据集来说,它是由一个包含该数据集中的所有文章的词组成的。现在我们要对不同文档进行一个相似度的比较,一个很通俗的想法是,将文档用数字化的东西表示出来,即向量的模式。那么把数据集中的所有词作为向量的某一维,如果某一个词在该文档里出现我们标示它为1,否则标示为0。通过这样的一个过程我们可以得到这样的一个向量(0,1,1,1,……),那么对于数据集中的所有文档,我们就可以用一个向量空间来表示了,对于表示好的文档,我们在向量的最后一位或者最前一位标示出它的类别信息,这样一个包含类别信息的向量空间就表示出来了。

当然在这里我们可以通过TF-IDF的形式对每一个词进行加权,因为每个词它在表示文档是它的权重应该是不同的,这个权重是通过该词的词频和在某个文档中出现的次数来决定的。

下面我给出一个构建向量空间的例子:

package com.csdn;

 

import java.io.FileWriter;

 

import mykernel.external.wvtool.DummyStopWordFilter;

import mykernel.external.wvtool.TestStemmerWrapper;

import edu.udo.cs.wvtool.config.WVTConfiguration;

import edu.udo.cs.wvtool.config.WVTConfigurationFact;

import edu.udo.cs.wvtool.generic.output.WordVectorWriter;

import edu.udo.cs.wvtool.generic.stemmer.WVTStemmer;

import edu.udo.cs.wvtool.generic.tokenizer.NGramTokenizer;

import edu.udo.cs.wvtool.generic.tokenizer.SimpleTokenizer;

import edu.udo.cs.wvtool.generic.vectorcreation.TFIDF;

import edu.udo.cs.wvtool.main.WVTDocumentInfo;

import edu.udo.cs.wvtool.main.WVTFileInputList;

import edu.udo.cs.wvtool.main.WVTWordVector;

import edu.udo.cs.wvtool.main.WVTool;

import edu.udo.cs.wvtool.wordlist.WVTWordList;

 

/*

 * Date: 2009.4.4

 * by: Wang Yi

 * Email: wangyi19840906@yahoo.com.cn

 *

 *一个简单的基于WVTool的中文文本空间构建源程序

 */

public class WVToolExample {

 

    public static void main(String[] args) throws Exception {

 

        // Initialize the WVTool

    //初始化一个WVTool对象

        WVTool wvt = new WVTool(false);

 

        // Initialize the configuration

        //初始化一个configuration对象

        WVTConfiguration config = new WVTConfiguration();

       

        /*

         * 这个我构建的一个模拟的StemmerWrapper对象

         * TestStemmerWrapper对象不进行任何词干化处理功能

         * 因为中文不存在词干化问题

         */

        WVTStemmer stemmer = new TestStemmerWrapper();

 

        /*

         * 实现一个Ngram功能,这个是2gram

         * 对于中国人民共和国的一个字符串,

         * 它将处理为:

         * 中国

         * 国人

         * 人民

         * 民共

         * 共和

         * 和国

         * SimpleTokenizer对象是一个简单的分词器,

         * 它仅仅是去除掉字符串中的例如,:;等字符

         */

       // Ngram tk=new Ngram(2,new SimpleTokenizer());

        NGramTokenizer tk = new NGramTokenizer(2,new SimpleTokenizer());

        /*

         * 构建一个停顿词过滤的对象

         * 在这里我们也仅仅是一个模拟类,因为停顿词一般在中文分词工具中已经被剔除掉了

         */

        DummyStopWordFilter filter = new DummyStopWordFilter();

       

        /*

         * 在这里我们把字符串长度小于2的词组作为停顿。

         * 这样就避免了长度等于1的词组 (在中文中一个字一般是不代表任何涵义的)

         */

        filter.setMinNumChars(2);

        

       

        config.setConfigurationRule(WVTConfiguration.STEP_TOKENIZER, new WVTConfigurationFact(tk));

       

        config.setConfigurationRule(WVTConfiguration.STEP_STEMMER, new WVTConfigurationFact(stemmer));

       

        config.setConfigurationRule(WVTConfiguration.STEP_WORDFILTER, new WVTConfigurationFact(filter));

       

        /*

         * 定义一个只有两个类别的输入集合

         * 即整个样本集合仅有两个类别

         */

        WVTFileInputList list = new WVTFileInputList(2);

 

        // Add entries

        /*

         * 为输入添加一个文档信息对象 WVTDocumentInfo

         * 其中sourceName对象可以是一个文件夹的名称,也可以是一个文件名称

         * 最后一个0这个文档信息对象的类别

         */

        list.addEntry(new WVTDocumentInfo("./temp/51122.txt", "txt", "", "", 0));

        list.addEntry(new WVTDocumentInfo("./temp/xxx.txt", "txt", "", "", 1));

        // Generate the word list

        /*

         * 生成wordList

         */

        WVTWordList wordList = wvt.createWordList(list, config);

 

        // Prune the word list

        /*

         * wordList中DocumentFrequency做出一个限制,即DocumentFrequency在1<n<5之间

         * 以前的解释是termOccurs,这个解释是错误的。有兴趣的看看源码就知道了。

         * (今天屈伟问起这个问题我才发现这个错误)。

         */

        wordList.pruneByFrequency(1, 5);

       

        /*

         * 生成词组文件

         */

        wordList.storePlain(new FileWriter("wordlist.txt"));

       

        /*

         * 生成词频文件  wordList

         */       

        wordList.store(new FileWriter("wordVector.txt"));

 

        // Create the word vectors

 

       

        // Set up an output filter (write sparse vectors to a file)

        /*

         * 将生成的文本向量空间写入一个特定的文件

         */

        FileWriter outFile = new FileWriter("wv.txt");

        //DummyWordVectorWriter wvw = new DummyWordVectorWriter(outFile, true);

 

        WordVectorWriter wvw = new WordVectorWriter(outFile,true);

       

        config.setConfigurationRule(WVTConfiguration.STEP_OUTPUT, new WVTConfigurationFact(wvw));

 

        config.setConfigurationRule(WVTConfiguration.STEP_VECTOR_CREATION, new WVTConfigurationFact(new TFIDF()));

 

      

        // Create the vectors

        wvt.createVectors(list, config, wordList);

 

        // Close the output file

        wvw.close();

        outFile.close();

        

       

        // Just for demonstration: Create a vector from a String

        /*

         * 一个使用wordList构建文本空间向量的实例

         */

        WVTWordVector q = wvt.createVector("cmu harvard net", wordList);

 

    }

 

}

由于WVTool默认是处理中文的,所以我们需要一个可以处理中的东西。现在我选择了WVToolNGramTokenizer这个类来实现处理中文,当然大家可以通过包装中文分词工具来实现WVTool中的中文处理功能,那样的话会比NGram的效果要好的多。中文处理的类实现这两个接口就可以了(WVTTokenizer, TokenEnumeration)。

其中有一些细节请大家自己实现一下,有问题可以问我。

  评论这张
 
阅读(6811)| 评论(8)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017