从大文本语料库中删除停用词的最有效方法是什么?

时间:2015-04-11 04:31:29

标签: java algorithm hadoop nlp apache-spark

我想知道从大文本语料库中删除停用词的有效方法。 目前我的方法是将禁用词转换为正则表达式匹配文本行与正则表达式并删除它。

例如

String regex ="\\b(?:a|an|the|was|i)\\b\\s*";
 String line = "hi this is regex approach of stop word removal";
 String lineWithoutStopword = line.replaceAll(regex,"");

是否存在其他有效的方法来消除巨大的corupus中的停用词。

谢谢

1 个答案:

答案 0 :(得分:4)

使用Spark,一种方法是在用文字标记后的文本中减去停用词。

val text = sc.textFile('huge.txt')
val stopWords = sc.textFile('stopwords.txt')
val words = text.flatMap(line => line.split("\\W"))
val clean = words.subtract(stopwords)

如果您需要处理非常大的文本文件(>> GBs),那么将一组停用词视为可以向每个工作人员广播的内存结构会更有效。

代码会改变如下:

val stopWords = sc.textFile('stopwords.txt')
val stopWordSet = stopWords.collect.toSet
val stopWordSetBC = sc.broadcast(stopWordSet)
val words = text.flatMap(line => line.split("\\W"))
val clean = words.mapPartitions{iter =>
    val stopWordSet = stopWordSetBC.value
    iter.filter(word => !stopWordSet.contains(word))
}

请注意,为了使其正常工作,必须对原始文字进行标准化。