我正在使用 mallet 主题建模示例代码,虽然它运行良好,但我想知道此语句的参数实际含义是什么?
instances.addThruPipe(new CsvIterator(new FileReader(dataFile),
"(\w+)\s+(\w+)\s+(.*)",
3, 2, 1) // (data, target, name) field indices
);
从文档中:
此迭代器(可能更恰当地称为线模式迭代器)读取文件并根据正则表达式每行返回一个实例。
如果您有表单的数据
[名称] [标签] [数据]
您感兴趣的电话是
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
是一个糟糕的名字,因为这个类实际上读入的不是逗号分隔的值,而是空格分隔(空格、制表符等)值。
上面答案中给出的解释太好了。
但是缺少一点。行正则表达式中输入实例的每个数据、标签和名称字段的正则表达式 (regex) 序列需要与输入文件中提供实例的方式相对应,即如果您提供名称作为输入文件中的第一个字段,数据作为第二个字段,标签作为第三个字段,那么您必须首先提供名称正则表达式,然后是数据的正则表达式,然后在标签的最后一个正则表达式。示例如下所示:
输入实例:邮件67(制表符空格)TCC 问题。您好,由于某种原因,古典大师绘画部门的管理员无法从TCC获取信息。它似乎正在JDE上进行,但是在TCC上搜索时没有任何显示。您可以向f提供的任何帮助或指导。(制表符空间)公司
CsvIterator Parameters: CsvIterator(new FileReader(Path to file), "(\w+)\t(.*)\t(\w+)",2,3,1)