在Spark / Scala ML中使用RegexTokenizer()后,StopWords()无法正常工作

时间:2019-10-20 23:18:02

标签: regex scala apache-spark tokenize apache-spark-ml

使用StopWordsRemover后,我需要使用RegexTokenizer。但是,我注意到没有停止词被删除。我注意到在使用Tokenizer(而不是RegexTokenizer)时,停用词被删除了,因为Tokenizer将输出转换成术语数组。 RegexTokenizer仅输出带有(不以逗号分隔)的字符串数组。有解决办法吗?

这是我的数据的样子,其中“ body”是初始数据。您可以看到“ removedStopWords”与“ removeTags”列相同。情况并非如此:

enter image description here

代码:

val regexTokenizer = new RegexTokenizer() // first remove tags from string
  .setInputCol("body")
  .setOutputCol("removeTags")
  .setPattern("<[^>]+>")
val stopWordsRemover = new StopWordsRemover()
  .setInputCol(regexTokenizer.getOutputCol)
  .setOutputCol("removedStopWords")

1 个答案:

答案 0 :(得分:2)

令牌生成器应采用字符流(例如句子)并将其分解为较小的块(例如单词)。 例如,Spark中的Tokenizer将在空白处分割一个句子。

在这里,您使用RegexTokenizer删除HTML标签(更准确地说,根据标签将句子拆分为标记)。在此过程中,您需要确保将输出也拆分为单个单词。 为此,您可以向正则表达式添加条件,除了标签外,还可以通过在正则表达式模式中添加\\s+来在任何空格上进行分割:

val regexTokenizer = new RegexTokenizer() // removes tags from string and split into words
  .setInputCol("body")
  .setOutputCol("removeTags")
  .setPattern("<[^>]+>|\\s+")

现在使用StopWordsRemover应该可以正常工作。