我在java中使用Mallet 2.0.7来挖掘推文。 根据文档,对于主题建模,我必须使用 CsvIterator 读取数据集。
Reader fileReader = new InputStreamReader(new FileInputStream(new File(args[0])), "UTF-8");
instances.addThruPipe(new CsvIterator (fileReader, Pattern.compile("^(\\S*)[\\s,]*(\\S*)[\\s,]*(.*)$"),
3, 2, 1)); // data, label, name fields
我的数据集如下:行,x,位置,用户名,主题标签,文本,转发,日期, Collection 夹,评论数
对于标签,我添加了 x 列。第一次,我想在文本 (6) 列中运行算法,后来又添加了另一列。我写了这个模式,但它没有按预期工作,它获取第 6 列直到最后一个数据。如何更改模式的正则表达式?
Reader fileReader = new InputStreamReader(new FileInputStream(new File(filePath)), "UTF-8");
instances.addThruPipe(new CsvIterator(fileReader,
Pattern.compile("^(\\S*)[\\s,]*(\\S*)[\\s,]*(\\S*)[\\s,]*(\\S*)[\\s,]*(\\S*)[\\s,]*(.*)$"),
6, 2, 1)); // data, label, name fields
最佳答案
查找正则表达式文档以了解模式中每个元素的含义。原始模式将整行分为三组:从开头到第一个逗号或空格的所有字符,直到第二个逗号或空格的所有字符,然后是其他所有字符。
新模式的作用相同,但捕获了六个组。这就是为什么您可以获得从文本到行尾的所有内容。
我建议一些修复:
如果某个字段不相关,例如
label
,您可以仅使用 0 来指定它不存在。您不需要添加虚拟字段。()
中的任何内容都是捕获组。如果您不想包含某个字段,请不要捕获它。只需删除括号但保留模式即可。原始模式之所以有效,是因为我们可以对名称和标签字段做出假设:它们不包含逗号或空格,并且后面的所有内容都是文本。要捕获行中间的字段,您需要更加小心。您必须找到文本字段的末尾。我强烈建议使用制表符分隔字段,假设没有字段包含制表符。
尝试这样的事情(未测试过):
// row,x,location,username,hashtaghs,text,retweets,date,favorites,numberOfComment
Reader fileReader = new InputStreamReader(new FileInputStream(new File(filePath)), "UTF-8");
instances.addThruPipe(new CsvIterator(fileReader,
Pattern.compile("^(\d+)\t[^\t]*\t[^\t]*\t[^\t]*\t([^\t]*)\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*$"),
2, 0, 1)); // data, label, name fields
关于java - 在 mallet 中为我的数据集创建自定义模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46807303/