java - 解释 StringToWordVector() 的输出 - Weka

标签 java text machine-learning classification weka

我正在尝试使用 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.........

为什么前三项没有类属性? (它应该有 class1)。 {0 class2,..}, {0 class3..} 中的前导 0 是什么意思。 例如,它表示在 class3 文件夹中的第 3 个 html 文件中,由整数 32 标识的单词出现了 5 次。只是为了看看我如何获得 32 引用的单词( token )?

如何降低特征向量的维度?我们不需要让所有的特征向量都一样大吗? (比如只考虑训练集中最常见的 100 个术语,稍后在测试时,只考虑这 100 个术语在测试文档中的出现。因为,如果我们想出一个全新的词会发生什么在测试阶段,分类器会忽略它吗?)。

我是不是漏掉了什么?我是 Weka 的新手。

如果有人能向我解释分类器如何使用通过 StringToWordVector 过滤器创建的 vector ,我也非常感谢您的帮助。 (比如用训练数据创建词汇表,降维,这些是在 Weka 代码中发生的吗?)

最佳答案

  1. @attribute 的巨大列表包含从您的输入派生的所有标记。
  2. 您的@data 部分采用稀疏格式,即对于每个属性,只有当它不为零时才说明该值。对于前三行,class 属性是 class1,您只是看不到它(如果它是未知的,您会在前三行的开头看到一个 0 ?)。为什么? Weka 在内部将标称属性(包括类)表示为 double 值并从零开始计数。所以你的三个类在内部是:class1=0.0,class2=1.0,class3=2.0。由于零值未以稀疏格式说明,因此您看不到前三行中的类。 (另请参阅 http://www.cs.waikato.ac.nz/ml/weka/arff.html 上的“稀疏 ARFF 文件”部分)
  3. 要获取索引 n 表示的单词/标记,您可以计数,或者如果您有 Instances 对象,则调用 attribute(n).name()在上面。为此,n 从 0 开始计数。
  4. 要降低特征向量的维度,有很多选择。如果您只想拥有 100 个最频繁的术语,您可以stringToWordVector.setWordsToKeep(100)。请注意,这将尽量保留每个类别的 100 个单词。如果您不想每个类保留 100 个单词,stringToWordVector.setDoNotOperateOnPerClassBasis(true)。如果有几个相同频率的单词,你会得到略高于 100,所以 100 只是一种目标值。
  5. 至于在测试阶段出现的新词,我认为这不可能发生,因为你必须在分类之前将所有实例交给stringToWordVector。不过,我不是 100% 确定这一点,因为我使用的是两类设置,我让 StringToWordVector 在告诉分类器任何相关信息之前转换我的所有实例。

我通常可以向您推荐,尝试使用 Weka KnowledgeFlow 工具来学习如何使用不同的类。如果您知道如何在那里做事,您可以很容易地将这些知识用于您的 Java 代码。 希望我能帮到你,虽然回答有点晚了。

关于java - 解释 StringToWordVector() 的输出 - Weka,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10215991/

相关文章:

java - 如何使用 java Selenium WebDriver 下载文件?

java - Java DB Derby Blob 和删除的性能问题

java - 实现 ScrollView 导致致命异常

linux - 避免 col 的 32KB 长度限制

python - ValueError : Error when checking target: expected dense_108 to have 2 dimensions, 但得到形状为 (36020, 10, 2) 的数组

java - 如何在Android中保存图像而不压缩?

javascript - 在javascript中合并两个文本

file - 将多个文本文件合并为一个

data-structures - KD树的实现

math - 如何开始信息提取?