解释 StringToWordVector() 的输出 - Weka
Posted
技术标签:
【中文标题】解释 StringToWordVector() 的输出 - Weka【英文标题】:Interpreting the output of StringToWordVector() - Weka 【发布时间】:2012-04-30 06:06:02 【问题描述】:我正在尝试使用 Weka java API 进行文档分类。
这是我的数据文件的目录结构。
+- text_example
|
+- class1
| |
| 3 html files
|
+- class2
| |
| 1 html file
|
+- class3
|
3 html files
我有使用“TextDirectoryLoader”创建的“arff”文件。然后我在创建的 arff 文件上使用StringToWordVector
过滤器和filter.setOutputWordCounts(true)
。
以下是应用过滤器后的输出示例。我需要澄清一些事情。
@attribute </form> numeric
@attribute </h1> numeric
.
.
@attribute earth numeric
@attribute easy numeric
这个巨大的列表应该是初始 html 文件内容的标记化。对吧?
那我有,
@data
1 2,3 2,4 1,11 1,12 7,..............
10 4,34 1,37 5,.......
2 1,5 6,6 16,...
0 class2,34 11,40 15,.....,4900 3,...
0 class3,1 2,37 3,40 5....
0 class3,1 2,31 20,32 17......
0 class3,32 5,42 1,43 10.........
为什么前 3 个项目没有类属性? (它应该有class1)。 0 class2,.., 0 class3.. 中的前导 0 是什么意思。 例如,它表示在 class3 文件夹中的第三个 html 文件中,由整数 32 标识的单词出现了 5 次。就是想看看怎么得到32所指的词(token)?
如何降低特征向量的维数?我们不需要使所有特征向量的大小相同吗? (比如只考虑训练集中最常见的 100 个词,然后在测试时,只考虑测试文档中出现的那 100 个词。因为,这样如果我们想出一个全新的词会发生什么在测试阶段,分类器会忽略它吗?)。
我在这里遗漏了什么吗?我是 Weka 的新手。
如果有人能解释一下分类器如何使用这个由StringToWordVector
过滤器创建的向量,我真的很感激帮助。 (比如用训练数据创建词汇表,降维,这些都是在 Weka 代码中发生的吗?)
【问题讨论】:
【参考方案1】:@attribute
的庞大列表包含从您的输入派生的所有标记。
您的@data
部分采用稀疏格式,即对于每个属性,仅当它不为零时才说明该值。对于前三行,class 属性是 class1,你只是看不到它(如果它是未知的,你会在前三行的开头看到一个0 ?
)。为什么呢? Weka 在内部将名义属性(包括类)表示为双精度数并从零开始计数。所以你的三个类在内部:class1=0.0,class2=1.0,class3=2.0。由于零值未以稀疏格式说明,因此您看不到前三行中的类。 (另请参阅http://www.cs.waikato.ac.nz/ml/weka/arff.html 上的“稀疏 ARFF 文件”部分)
要获取索引 n 表示的单词/标记,您可以计数,或者,如果您有 Instances
对象,则在其上调用 attribute(n).name()
。为此,n
从 0 开始计数。
要降低特征向量的维数,有很多选择。如果您只想拥有 100 个最常用的术语,请stringToWordVector.setWordsToKeep(100)
。请注意,这将尝试保留每节课的 100 个单词。如果您不想每节课保留 100 个单词,stringToWordVector.setDoNotOperateOnPerClassBasis(true)
。如果有几个词的频率相同,你会得到略高于 100,所以 100 只是一种目标值。
至于在测试阶段出现的新词,我认为这是不可能的,因为你必须在分类之前把stringToWordVector
所有的实例都交出来。不过,我不是 100% 确定这一点,因为我使用的是两类设置,我让 StringToWordVector
在告诉分类器任何相关信息之前转换我的所有实例。
我一般可以向您推荐,尝试使用 Weka KnowledgeFlow 工具来学习如何使用不同的类。如果您知道如何在那里做事,那么您可以很容易地将这些知识用于您的 Java 代码。 希望我能帮到你,虽然答案有点晚了。
【讨论】:
是的,我自己学习答案的地方有点晚了。但是感谢您的回答,我接受了。嘿,您有使用 weka 中的 libsvm(包装器)进行一类分类的经验吗?我有点坚持它 @user601 不,抱歉。我从未在 Weka 中使用过 libsvm。只是出于好奇:您是否正在写一篇关于机器学习/数据挖掘主题的论文? 是的,我正在做我的大四论文,其中涉及文本分类。你在做类似的事情吗? 我正在写我的学士论文,其中也涉及文本分类:) 嘿,没关系。有一种方法可以在 TextToDirectoryLoader 过滤器中将文件名设置为不同的属性;如果我认为,类似 setfilename(boolean) 的东西。以上是关于解释 StringToWordVector() 的输出 - Weka的主要内容,如果未能解决你的问题,请参考以下文章
使用 StringToWordVector 和 SMO 的 Weka 分类项目