如何在Spark LDA代码中匹配每个文档的ngrams

时间:2015-06-22 06:41:39

标签: scala apache-spark lda

我正在使用https://gist.github.com/jkbradley/ab8ae22a8282b2c8ce33

中给出的spark中的LDA示例代码

我有一个语料库文件,其中每一行都是一个文档,我已经使用

阅读了该文档
val corpus: RDD[String] = sc.textFile("C:/corpus.txt")

我还有一个ngram文件,其中每一行都是一个bigram / trigram等,我已经阅读了

val ngramFile: RDD[String] = sc.textFile("C:/ngram.txt")

我想修改以下行并仅在每个文档中使用匹配的ngram

val tokenized: RDD[Seq[String]] = corpus
  .map(_.toLowerCase.split("\\s"))
  .map(_.filter(_.length > 3)
        .filter(_.forall(java.lang.Character.isLetter))
  )

我尝试过的是

 //(Iterate ngramFile each line and match it with the corpus line)
 val tokenized= corpus.map( line => 
   ngramFile.r.findAllMatchIn(line))  
 )//this is error :)

所以如果我的语料库文件是

Working in Scala Language.
Spark LDA has Scala and Java API.

我的nGram文件是:

Scala Language
Spark LDA
Java API

然后打印上面"标记化"变量应该给我

WrappedArray(scala language)
WrappedArray(spark lda,java api)

代替当前版本的代码

WrappedArray(working,in,scala,language)
WrappedArray(spark,lda,has,scala,and,java,api)

我是Scala的新手,因此对上述行的任何帮助都会受到赞赏。

提前致谢

1 个答案:

答案 0 :(得分:0)

我认为您要解决的问题是 - 找出您的语料库文件中与ngram文件中的ngrams列表匹配的行。

然后,你需要的是:

  1. 阅读语料库文件。对于每一行,在元组(,)中生成ngrams(这可以通过任何算法实现)。从中创建rdd
  2. 读取ngram文件。如果此文件很小,请创建hashmap并进行广播。
  3. 对于步骤1中创建的rdd的每条记录,找出步骤2中ngrams hashmap列表中是否有任何ngrams
  4. 如果ngrams是一个大文件,那么也将它变为rdd。另外,将第一个rdd展平为(,)(即每个记录中的ngrams)。最后,使用key加入这两个rdds。

    我故意不在这里提供代码,因为我已经在这里解决了关于ngrams insimilarr环境的几个问题。显然它是一些学习练习的一部分,我不想破坏乐趣:)