Java中TMFlatFile无法解析为变量及Eclipse命令行传参咨询
问题解决步骤
一、修复代码中的变量传递错误
你当前的核心问题是TMFlatFile变量仅在main方法中定义,没有传递到StartTopicModellingProcess方法里,导致方法内无法识别该变量。按以下步骤修改代码:
修改
main方法的调用语句:
将原代码中的loader.StartTopicModellingProcess(filePath);替换为
loader.StartTopicModellingProcess(filePath, TMFlatFile);修改
StartTopicModellingProcess方法的参数定义:
将方法签名从private void StartTopicModellingProcess(String filePath) {改为
private void StartTopicModellingProcess(String filePath, String TMFlatFile) {这样方法内部就能直接使用
TMFlatFile调用SaveLemmaDataToFile,无需硬编码。
修改后的完整代码如下:
import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; import cc.mallet.pipe.CharSequence2TokenSequence; import cc.mallet.pipe.Pipe; import cc.mallet.pipe.SerialPipes; import cc.mallet.pipe.TokenSequence2FeatureSequence; import cc.mallet.topics.ParallelTopicModel; import cc.mallet.types.InstanceList; import cc.mallet.util.CsvIterator; public class B4TopicModelling { public static void main(String[] args) { if (args.length == 2) { B4TopicModelling loader = new B4TopicModelling(); String filePath = args[0]; // e.g. "JSONDataStore_complex.json" String TMFlatFile = args[1]; // e.g. "topicdatanew.txt" System.out.println("Start Topic Modelling :" + filePath); loader.StartTopicModellingProcess(filePath, TMFlatFile); int numTopics = 10; // 主题数量(文档聚类的组数) int numThreads = 2; // 使用的线程数(多核机器可加速) int numIterations = 500; // 迭代次数 int numTopWords = 10; // 每个主题的高频词数量 loader.RunTopicModelling(TMFlatFile, numTopics, numThreads, numIterations, numTopWords); } else { System.err.println("Error: No valid arguments have been entered."); } } private void StartTopicModellingProcess(String filePath, String TMFlatFile) { JSONIOHelper jsonIO = new JSONIOHelper(); // 创建JSONIOHelper实例 jsonIO.LoadJSON(filePath); // 调用加载JSON方法 ConcurrentHashMap<String, String> lemmas = jsonIO.GetDocumentsFromJSONStructure(); SaveLemmaDataToFile(TMFlatFile, lemmas); } private void SaveLemmaDataToFile(String TMFlatFile, ConcurrentHashMap<String, String> lemmas) { // 将ConcurrentHashMap中的数据写入文件 try (FileWriter writer = new FileWriter(TMFlatFile)) { for (Entry<String, String> entry : lemmas.entrySet()) { // 按格式写入:键 + 制表符 + en + 制表符 + 值 writer.write(entry.getKey() + "\ten\t" + entry.getValue() + "\r\n"); } System.out.println("TMFlatFile File saved successfully..."); } catch (Exception e) { System.out.println("Saving TMFlatFile to text file failed..."); } } private void RunTopicModelling(String TMFlatFile, int numTopics, int numThreads, int numIterations, int numTopWords) { ArrayList<Pipe> pipeList = new ArrayList<Pipe>(); // 管道配置:分词、特征映射 pipeList.add(new CharSequence2TokenSequence(java.util.regex.Pattern.compile("\\p{L}[\\p{L}\\p{P}]+\\p{L}"))); // pipeList.add(new TokenSequenceRemoveStopwords(new File("stoplist_en.txt"), "UTF-8", false, false, false)); pipeList.add(new TokenSequence2FeatureSequence()); InstanceList instances = new InstanceList(new SerialPipes(pipeList)); InputStreamReader fileReader = null; try { File inFile = new File(TMFlatFile); fileReader = new InputStreamReader(new FileInputStream(inFile)); } catch (Exception e) { System.out.println("File Load failed"); System.exit(1); } // 将数据导入管道 instances.addThruPipe(new CsvIterator(fileReader, java.util.regex.Pattern.compile("^(\\S*)[\\s,]*(\\S*)[\\s,]*(.*)$"), 3, 2, 1)); // 初始化并行主题模型 ParallelTopicModel model = new ParallelTopicModel(numTopics, 1.0, 0.01); model.addInstances(instances); model.setNumThreads(numThreads); model.setNumIterations(numIterations); try { model.estimate(); } catch (java.io.IOException e) { System.out.println("Model estimation failed..."); } } }
二、在Eclipse中配置命令行参数
代码修复完成后,按以下步骤设置命令行参数:
- 右键项目中的
B4TopicModelling类,选择「Run As」→「Run Configurations...」 - 在弹出窗口左侧找到「Java Application」分类,若没有对应配置,点击左上角「New launch configuration」新建一个
- 切换到「Arguments」标签页,在「Program arguments」输入框中填入两个文件名,例如
JSONDataStore_complex.json topicdatanew.txt(参数间用空格分隔) - 点击「Apply」保存配置,再点击「Run」启动程序即可
内容的提问来源于stack exchange,提问作者Bluetail
相关产品推荐
相关产品推荐

