在 Spark/Scala ML 中使用 RegexTokenizer() 后 StopWords() 不工作

StopWords() not working after using RegexTokenizer() in Spark/Scala ML

我用了RegexTokenizer之后还需要用StopWordsRemover。但是,我注意到没有删除任何停用词。我注意到在使用 Tokenizer(与 RegexTokenizer 相对)时停用词被删除,因为 Tokenizer 将输出转换为术语数组。 RegexTokenizer 仅输出一个字符串数组(不是逗号分隔)。有解决办法吗?

这是我的数据,其中 "body" 是初始数据。您可以看到 "removedStopWords" 与 "removeTags" 列相同。不应该是这样的:

代码:

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

分词器应该获取字符流(例如句子)并将其分解成更小的块(例如单词)。 例如,Spark 中的 Tokenizer 将根据空格拆分句子。

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

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

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