Spark-Scala中的文本预处理

时间:2015-04-28 12:39:23

标签: scala text apache-spark preprocessor text-mining

我想对Spark-Scala中的大量文本数据应用预处理阶段,例如 Lemmatization - Remove Stop Words(使用Tf-Idf) - POS标记,有什么方法可以实现他们在Spark - Scala?

例如,这里是我的数据的一个示例:

The perfect fit for my iPod photo. Great sound for a great price. I use it everywhere. it is very usefulness for me.
预处理后

perfect fit iPod photo great sound great price use everywhere very useful

他们有POS标签,例如(iPod,NN) (photo,NN)

有一个POS标签(sister.arizona)是否适用于Spark?

3 个答案:

答案 0 :(得分:11)

一切皆有可能。问题是你喜欢这样做的首选方式。

例如,你有一个适合你的停用词词典(它可能只是一个Set),或者你想运行TF-IDF来自动选择停用词(注意这需要一些监督,例如选择将该单词视为停用词的阈值。您可以提供字典和Spark的MLLib already comes with TF-IDF

POS标签步骤很棘手。 JVM上的大多数NLP库(例如Stanford CoreNLP)都没有实现java.io.Serializable,但您可以使用它们执行映射步骤,例如

myRdd.map(functionToEmitPOSTags)

另一方面,不要从该NLP库发出包含不可序列化类的RDD,因为诸如collect(),saveAsNewAPIHadoopFile等步骤将失败。另外,为了减少序列化的麻烦,请使用Kryo而不是默认的Java序列化。如果您在谷歌周围有很多关于此问题的帖子,但请参阅herehere

一旦弄清楚序列化问题,您需要确定用于生成POS标记的NLP库。有很多这样的,例如适用于Java的Stanford CoreNLPLingPipeMallet,适用于Scala的Epic等。请注意,您当然可以将Java NLP库与Scala一起使用,包括使用包装,例如亚利桑那大学的Sista wrapper斯坦福大学CoreNLP等等。

另外,为什么你的例子不是小写处理文本?这几乎是我要做的第一件事。如果您有iPod等特殊情况,除了这些情况外,您可以使用下壳。但总的来说,我会降低一切。如果您要删除标点符号,则应该首先将文本拆分为句子(使用正则表达式分割时段等)。如果您一般要删除标点符号,那当然可以使用正则表达式完成。

你想要干多远?例如,Porter stemmer(每个NLP库中都有实现)源于如此深刻以至于#34; universe"和#34;大学"成为同样的结果。你真的想要吗?根据您的使用情况,那里有较少侵略性的割线机。另外,如果你可以使用词形还原,即为了将单词分成语法前缀,词根和后缀(例如walked = walk(root)+ ed(suffix)),为什么要使用词干化。在大多数情况下,根部会比茎干更好。我上面提到的大多数NLP库都是这样做的。

另外,你对停用词和非有用词的区别是什么?例如,您删除了主题形式中的代词" I"和占有形式" my,"但不是对象形式" me。"我建议选择一本NLP教科书,例如"语音和语言处理"由Jurafsky和Martin(为雄心勃勃的),或者只是阅读关于NLP工具的以工程为中心的书籍之一,例如Java的LingPipe,Python的NLTK等,以获得良好的概述术语,NLP管道中的步骤等

答案 1 :(得分:1)

Apache Spark中没有内置的NLP功能。您可能必须自己实现它,可能基于非分布式NLP库,如marekinfo的优秀答案中所述。

答案 2 :(得分:1)

我建议你看一下spark的ml管道。你可能还没有开箱即用,但你可以建立自己的能力并使用管道作为框架..