在mallet中为我的数据集创建自定义Pattern

时间:2017-10-18 09:48:35

标签: java regex topic-modeling mallet

我在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

1 个答案:

答案 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