我在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
我的数据集如:row,x,location,username,hashtaghs,text,retweets,date,favorites,numberOfComment
对于标签我添加了列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
答案 0 :(得分:1)
查找正则表达式文档以了解模式的每个元素的含义。原始模式将整行划分为三组:从开头到第一个逗号或空格的所有字符,直到第二个逗号或空格的所有字符,然后是其他所有字符。
新模式也是如此,但会捕获六个组。这就是为什么你要从文本到行尾的所有内容。
我会推荐一些修复:
如果字段不相关,例如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