【问题标题】:StopWords() not working after using RegexTokenizer() in Spark/Scala ML在 Spark/Scala ML 中使用 RegexTokenizer() 后 StopWords() 不起作用
【发布时间】:2020-02-17 01:22:35
【问题描述】:

在使用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")

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢,这成功了!我对 RegexTokenizer() 的理解是错误的,这是有道理的
    猜你喜欢
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-24
    相关资源
    最近更新 更多