Esm*_*edi -3 text preprocessor scala text-mining apache-spark
我想对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.
Run Code Online (Sandbox Code Playgroud)
预处理后:
perfect fit iPod photo great sound great price use everywhere very useful
Run Code Online (Sandbox Code Playgroud)
他们有POS标签,例如 (iPod,NN) (photo,NN)
有一个POS标签(sister.arizona)是否适用于Spark?
mar*_*nfo 12
一切皆有可能.问题是你喜欢这样做的首选方式.
例如,你有一个适合你的停用词词典(它可能只是一个Set),或者你想运行TF-IDF来自动选择停用词(注意这需要一些监督,例如选择将该单词视为停用词的阈值.你可以提供字典,Spark的MLLib 已经附带TF-IDF.
POS标签步骤很棘手.JVM上的大多数NLP库(例如Stanford CoreNLP)不实现java.io.Serializable,但您可以使用它们执行映射步骤,例如
myRdd.map(functionToEmitPOSTags)
Run Code Online (Sandbox Code Playgroud)
另一方面,不要从该NLP库发出包含不可序列化类的RDD,因为诸如collect(),saveAsNewAPIHadoopFile等步骤将失败.另外,为了减少序列化的麻烦,请使用Kryo而不是默认的Java序列化.如果你谷歌,有很多关于这个问题的帖子,但请看这里和这里.
找出序列化问题后,您需要确定用于生成POS标记的NLP库.有很多这些,例如Stanford CoreNLP,LingPipe和Mallet for Java,Epic for Scala等.请注意,您当然可以使用Scala的Java NLP库,包括诸如亚利桑那大学的斯坦福CoreNLP 的Sista包装器之类的包装器.等
另外,为什么你的例子不是小写的处理文本?这几乎是我要做的第一件事.如果您有iPod等特殊情况,除了这些情况外,您可以使用下壳.但总的来说,我会降低一切.如果要删除标点符号,则应该首先将文本拆分为句子(使用正则表达式分割时段等).如果您一般删除标点符号,那当然可以使用正则表达式完成.
你想要干多远?例如,Porter stemmer(每个NLP库中都有实现)源于如此深刻,以至于"宇宙"和"大学"成为同样的结果.你真的想要吗?根据您的使用情况,那里有较少侵略性的割线机.此外,如果你可以使用词形还原,即为什么使用词干化,即将单词拆分为语法前缀,词根和后缀(例如,walked = walk(root)+ ed(suffix)).在大多数情况下,根部会比茎干更好.我上面提到的大多数NLP库都是这样做的.
另外,你对一个停用词和一个无用词有什么区别?例如,您删除了主题形式"I"中的代词和占有式"my",但不是"me"的对象形式.我建议选择Jurafsky和Martin的"语音和语言处理"等NLP教科书(雄心勃勃),或者阅读有关NLP工具的工程中心书籍之一,如LingPipe for Java,NLTK for Python等. ,以便更好地概述术语,NLP管道中的步骤等.
| 归档时间: |
|
| 查看次数: |
5153 次 |
| 最近记录: |