从WekaWiki上的一个文本聚类的示例开始(2)

上一篇文章介绍了一个简单的预处理过程,这篇文章将继续演示下一步:用 weka 的 Filter 提取特征。

Weka 处理数据的格式是 arff,所以首先我们要把 text_example 转换成 该格式,这里要用到 weka.core.converters.TextDirectoryLoader 这个类。运行下面这行语句。

java -classpath $WEKAROOT/weka.jar weka.core.converters.TextDirectoryLoader -dir $WEKAROOT/data/text_example > ~/text_example.arff

其中 -classpath 指明了 weka.jar 文件的路径,-dir 指明了要转换的文件夹路径,最后把结果定向输出到 text_example.arff 文件。

我把转换完成的 arff 文件上传到了百度云:http://pan.baidu.com/s/1bzJAB

按照 WekaWiki 的说法有了 arff 文件后就可以用 J48 分类器对文档进行分类。其中用了两个 Filter,一个是 StringToWordVector ,这个过滤器后面再细说。另一个过滤器叫Record,它可以对样本的维度重新排序,设置配置参数 2-last,first,表示把第一个维度(first)移到最后面去,weka一般会把最后一个维度当作样本的分类。这里就不采用这个实施方案了,因为样本一共就7个,生成的分类器肯定会过渡拟合的。

不妨对这7篇文档进行聚类。

首先把 arff 文件中class维度删除。然后用 StringToWordVector 过滤器将字符串转成维度。下图是 StringToWordVector 的配置界面:


IDFTransform 表示某个词的反文档概率,其值为 ln (所有文档数 ÷ 包含该词的文档数)

TFTransform 表示某个词的频度, ln(文档中某个词语的频度÷文档长度+1)

如果把上面两个配置项同时置为 True,则最后维度的值的计算方式就变成了 两个 ln 值的乘积了。

要让维度的值变成在文本聚类中常用的 TF×IDF(http://zh.wikipedia.org/wiki/TF-IDF) 值,我们应该把 TFTransform置为False,把IDFTransform置为True,然后把OutputWordsCount 这个配置项也置为True,这样最后维度值就变成了 某词对于某文档的词频×IDF 即 TF×IDF。(如果想做得更好,可以把词在文档中的位置也考虑进来)

stemmer表示词干提取,stopwords表示停用词。

wordsToKeep 表示对于每个 arff 中的 string (比如 text_example中有 7 篇文档,即7个string,arff 中每一对引号中的字符串被认为是一个string)把其中词频大于 minTermFreq 值的前wordsToKeep 个词语保留作维度。由于是对每个arff 中的string 作保留,所以最后得到的维度数目通常大于我们设置的wordsToKeep 值。

你可能感兴趣的:(从WekaWiki上的一个文本聚类的示例开始(2))