在 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
应该可以正常工作。
我用了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
应该可以正常工作。