我正在使用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的新手,因此对上述行的任何帮助都会受到赞赏。
提前致谢
答案 0 :(得分:0)
我认为您要解决的问题是 - 找出您的语料库文件中与ngram文件中的ngrams列表匹配的行。
然后,你需要的是:
如果ngrams是一个大文件,那么也将它变为rdd。另外,将第一个rdd展平为(,)(即每个记录中的ngrams)。最后,使用key加入这两个rdds。
我故意不在这里提供代码,因为我已经在这里解决了关于ngrams insimilarr环境的几个问题。显然它是一些学习练习的一部分,我不想破坏乐趣:)