Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 解释StringToWordVector()的输出-Weka_Java_Text_Machine Learning_Classification_Weka - Fatal编程技术网

Java 解释StringToWordVector()的输出-Weka

Java 解释StringToWordVector()的输出-Weka,java,text,machine-learning,classification,weka,Java,Text,Machine Learning,Classification,Weka,我正在尝试使用wekajavaapi进行文档分类 这是我的数据文件目录结构 +- text_example | +- class1 | | | 3 html files | +- class2 | | | 1 html file | +- class3 | 3 html files 我使用“TextDirectoryLoader”创建了“arff”文件。然后我在创建的arff文件上使用StringToWordVector过滤器,使用filter.setOutputW

我正在尝试使用wekajavaapi进行文档分类

这是我的数据文件目录结构

+- 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
为什么前3项没有class属性?(应该是1级)。 在{0 class2,…},{0 class3,…}中,前导0是什么意思。 例如,它说,在class3文件夹中的第三个html文件中,由整数32标识的单词出现了5次。只是想看看如何得到32所指的单词(令牌)

如何降低特征向量的维数?我们不需要使所有的特征向量大小相同吗?(例如,只考虑训练集中的100个最常见的术语,以后再考虑测试时,只考虑测试文档中100个术语的出现。因为,如果我们在测试阶段提出一个完全新的单词,那么分类器会忽略它吗?)p> 我是不是遗漏了什么?我是韦卡的新手

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

  • 庞大的
    @attribute
    列表包含从您的输入派生的所有标记
  • 您的
    @data
    部分采用稀疏格式,即对于每个属性,仅当值不同于零时才说明该值。对于前三行,class属性是class1,您无法看到它(如果它未知,您将在前三行的开头看到一个
    0?
    )。为什么会这样?Weka在内部将标称属性(包括类)表示为双倍,并从零开始计数。所以你的三个类是内部的:class1=0.0,class2=1.0,class3=2.0。由于零值不是以稀疏格式表示的,所以在前三行中看不到该类。(另请参见上的“稀疏ARFF文件”一节)
  • 要获取由索引n表示的单词/标记,您可以计数,或者,如果您有
    实例
    对象,则在其上调用
    属性(n).name()
    。因此,
    n
    从0开始计数
  • 为了降低特征向量的维数,有很多选择。如果您只想拥有100个最常用的术语,您可以
    stringToWordVector.setWordsToKeep(100)
    。请注意,这将尝试保留每个类的100个单词。如果不希望每个类保留100个单词,请使用
    stringToWordVector.setdonotoperateonperslassbasis(true)
    。如果有几个词的频率相同,你会得到略高于100的值,所以100只是一种目标值
  • 至于在测试阶段出现的新词,我认为这是不可能的,因为在分类之前必须将
    stringToWordVector
    所有实例交给你。不过,我不能100%确定这一点,因为我使用的是两类设置,我让
    StringToWordVector
    在告诉分类器任何有关它的信息之前转换所有实例 我可以向您推荐,使用Weka KnowledgeFlow工具进行实验,学习如何使用不同的类。如果您知道如何在那里做事情,那么您可以很容易地将这些知识用于Java代码。
    希望我能帮助您,尽管答案有点晚。

    是的,ans在我自学答案的地方有点晚。但是谢谢你的回答,我接受了。嘿,你们有在weka中使用libsvm(包装器)进行一类分类的经验吗?我有点受不了了it@user601不,对不起。我在Weka中从未使用过libsvm。出于好奇:你是在写一篇关于机器学习/数据挖掘主题的论文吗?是的,我正在写一篇涉及文本分类的高年级论文。你也在做类似的事情吗?我正在写我的学士论文,其中也涉及文本分类:)嘿,没关系。有一种方法可以在TextToDirectoryLoader筛选器中将文件名设置为不同的属性;如果我考虑的话,类似于setfilename(布尔)的东西。
    @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.........