Mallet中csvIterator的参数是什么意思?

5

我正在使用Mallet主题建模示例代码,虽然它可以正常运行,但我想知道这个语句的参数实际上是什么意思?

instances.addThruPipe(new CsvIterator(new FileReader(dataFile),
                                      "(\\w+)\\s+(\\w+)\\s+(.*)",
                                      3, 2, 1)  // (data, target, name) field indices                    
                     );
2个回答

8
文档中了解到:
该迭代器(更准确地说应该称为行模式迭代器)读取文件并基于正则表达式每行返回一个实例。
如果您有以下形式的数据
[name] [label] [data]
您需要关注的调用是:
CsvIterator(java.io.Reader input, java.lang.String lineRegex, 
            int dataGroup, int targetGroup, int uriGroup) 

第一个参数是数据的读取方式,例如文件读取器或字符串读取器。第二个参数是正则表达式,用于从每个从读取器读取的行中提取数据。在您的示例中,您有(\\w+)\\s+(\\w+)\\s+(.*),它的意思是:

  • 1个或多个字母数字字符(捕获组,这是实例名称),后跟
  • 1个或多个空格字符(制表符、空格等),后跟
  • 1个或多个字母数字字符(捕获组,这是标签/目标),后跟
  • 1个或多个空格字符(制表符、空格等),后跟
  • 0个或多个字符(这是数据)

数字3、2、1表示数据排在最后,目标排在第二位,名称排在第一位。正则表达式基本上确保每行的格式如文档所述:

test1 spam Wanna buy viagra?
test2 not-spam Hello, are you busy on Sunday?

CsvIterator是一个糟糕的名称,因为这个类所读取的实际上不是逗号分隔的值,而是空格分隔(空格、制表符等)的值。


这是一个很好的解释。它支持每个类别多个标签,例如One-vs-Rest类型分类器吗? - brianray

0

上面的答案解释得非常好。

但是有一点遗漏。在行正则表达式的输入实例的每个数据、标签和名称字段的正则表达式(regex)序列需要与输入文件中提供实例的方式相对应。例如,如果您在输入文件中将名称作为第一个字段、数据作为第二个字段和标签作为第三个字段,则必须先提供名称的正则表达式,然后是数据的正则表达式,最后是标签的正则表达式。示例如下:

输入实例:Mail67(制表符空格)TCC问题。嗨,由于某种原因,旧大师画部门的任何管理员都无法从TCC获取信息。它似乎正在通过JDE进行,但在TCC上搜索时没有任何内容。您可以提供的任何帮助或指导都将不胜感激....(制表符空格)公司

CsvIterator参数:CsvIterator(new FileReader(文件路径), "(\w+)\t(.*)\t(\w+)",2,3,1)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接