情感分析中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
相关产品推荐
相关产品推荐

