使用StopWordsRemover
后,我需要使用RegexTokenizer
。但是,我注意到没有停止词被删除。我注意到在使用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")
答案 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
应该可以正常工作。