2017-10-18 84 views
1

我在使用Mallet 2.0.7在Java中用于挖掘鸣叫。 根据文档,对于主题建模,我必须使用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,位置,用户名,hashtaghs,文本,转推,日期,收藏夹,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

寻找正则表达式文档来理解模式中每个元素的含义。原始图案将整行分为三组:从开头到第一个逗号或空白的所有字符,直到第二个逗号或空白的所有字符,然后是其他所有字符。

新模式也是一样的,但却捕获了六组。这就是为什么你要从文本到行结束的所有内容。

我会建议一些修正:

  • 如果字段是不相关的,像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 
+0

感谢您的回答!我想函数编译(数据组)的参数3是我想要在其中检测主题的文本的索引,为此,我通过了6。你传递了2这意味着在我的数据集中,这意味着2列(文本和转推)? – NASRIN

+0

在我的预处理步骤中,我删除了逗号,停用词和派生推文。因为这个原因,我用逗号作为分隔符,我根据你的指导改变了模式。 “^(\\ d +)[,] * [^,] * [,] * [^,] * [,] * [^,] * [,] *([^,] *)[,] * [ ^,] * [,] * [^,] * [,] * [^,] * [,] * [^,] * $“但是我仍然怀疑我的程序,你有没有槌子的例子,除了邮件木槌网站? – NASRIN

相关问题