You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

情感分析中ARFF数据集分词后丢失Positive标签问题求助

情感分析任务中分词后数据集缺失Positive标签的排查方案

问题背景

在实现情感分析任务时,对dataset.arff数据集执行分词处理用于模型训练,结果发现输出的数据集里缺失了Positive标签。

原始数据集头部信息

@relation SentimentAnalysis
@attribute text string
@attribute classValues {Positive,Negative,Neutral,'Very positive','Very negative'}
@data
'some text',Positive
'some text',Negative
'some text',Neutral
[...]

分词后数据集示例

头部部分:

@relation 'SentimentAnalysis-weka.filters.unsupervised.attribute.StringToWordVector-R1-W5000-prune-rate-1.0-N0-stemmerweka.core.stemmers.NullStemmer-stopwords-handlerweka.core.stopwords.Null-M1-tokenizerweka.core.tokenizers.WordTokenizer -delimiters \" \\r\\n\\t.,;:\\'\\\"()?!\"'

@attribute classValues {Positive,Negative,Neutral,'Very positive','Very negative'}

数据部分(仅示例):

{0 Negative,20 1,220 1,228 [...] }
{0 Neutral,22 1,169 [...] }
{22 1,169 1,272 [...] }

使用的分词代码

public static void Tokenizer(){
           
            
            ArffLoader loader = new ArffLoader();
            String filename = "dataset.arff";
            File file = new File(filename);
            
            //checking if the file exist

            if (file.exists()){
                try {
                    loader.setFile(new File(filename));
                    Instances data = loader.getDataSet();
                    if (data.classIndex() == -1){
                        data.setClassIndex(data.numAttributes()- 1);
                    }

                    String[] options = new String[] {"-R", "1", "-W", "5000", "-prune-rate", "-1.0"};
                    StringToWordVector filter = new StringToWordVector();
                    filter.setOptions(options);
                    filter.setInputFormat(data);
                    
                    Instances filteredData = Filter.useFilter(data, filter);
                    
                    File tokenizedFile = new File("tokenizeDataSet.arff");


                    ArffSaver saver = new ArffSaver();
                    saver.setInstances(filteredData);
                    saver.setFile(tokenizedFile);
                    saver.writeBatch();

                    System.out.println("tokenized text saved properly");
                } catch (Exception e) {
                    System.out.println("Error in reloading the Arff file:"+ e.getMessage());
                    e.printStackTrace();
                }
                
            }    
}

排查原因及解决方案

1. 验证原始数据集的Positive样本存在性

先确认原始dataset.arff中确实存在Positive标签的样本且数量不为零:

  • 用Weka Explorer打开原始文件,查看类分布统计,确认Positive样本的存在。

2. 修正StringToWordVector的prune-rate参数

你设置的-prune-rate参数为-1.0,该值会触发Weka基于类分布的词修剪逻辑——如果Positive样本数量过少,对应的特征词会被全部过滤,最终导致Positive样本在输出中消失。

  • 解决方案:将-prune-rate改为1.0(禁用修剪),或调整为合适阈值(如0.001),修改后的参数数组:
    String[] options = new String[] {"-R", "1", "-W", "5000", "-prune-rate", "1.0"};
    

3. 确认类索引设置正确性

虽然代码中设置了data.setClassIndex(data.numAttributes()- 1),但需验证原始数据集的类属性确实是最后一列:

  • 在加载数据后添加代码验证:
    System.out.println("Class attribute name: " + data.classAttribute().name());
    
    确保输出为classValues。

4. 检查过滤后样本的类分布

Weka的Filter.useFilter会自动移除无有效特征的样本,若Positive样本的文本分词后无特征词(概率极低,但需排查),会被过滤。

  • 解决方案:在过滤后添加统计代码,确认Positive样本是否存在:
    // 过滤后添加以下代码
    System.out.println("Total instances after filtering: " + filteredData.numInstances());
    for (int i = 0; i < filteredData.classAttribute().numValues(); i++) {
        String className = filteredData.classAttribute().value(i);
        int count = 0;
        for (Instance inst : filteredData) {
            if (inst.classValue() == i) count++;
        }
        System.out.println(className + ": " + count);
    }
    

5. 验证ArffSaver的输出逻辑

若过滤后的filteredData中存在Positive样本,但保存后缺失,需检查ArffSaver的格式设置:

  • 可以尝试将输出格式改为非稀疏模式,添加saver.setSparseArff(false)后再保存,查看是否正常显示Positive标签。

内容的提问来源于stack exchange,提问作者Lorenzo Pombini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 20:05:01