2015-03-02 182 views
0

我对Spark很新,我有一个问题。在apache-spark RDD中处理多个'行'

我尝试用一​​些数据做简单的情感分析。 在数据文件中,每行包含产品评论。

这里是我的处理一行代码:

// wordlist 
val pos_file = "/user/cloudera/Data/pos_list.txt" 
val neg_file = "/user/cloudera/Data/neg_list.txt" 

val pos_words = sc.textFile(pos_file).cache().collect().toSet 
val neg_words = sc.textFile(neg_file).cache().collect().toSet 


val test_string = "Line with positive or negative review." 
val test_rdd = sc.parallelize(List(test_string)) 

val test_rdd2 = test_rdd.flatMap(line => "[a-zA-Z]+".r findAllIn line map (_.toLowerCase)) 

val pos = test_rdd2.filter(x => pos_words contains x) 
val neg = test_rdd2.filter(x => neg_words contains x) 

我现在的问题是如何处理在RDD每个记录(在这种情况下,3):

val file_in = "/user/cloudera/Data/teststring.txt" 
val data = sc.textFile(file_in).cache() 
val reviews = data.flatMap(_.split("\n")) 

scala> reviews.count() 
res29: Long = 3 

下面的代码

val reviews2 = reviews.flatMap(line => "[a-zA-Z]+".r findAllIn line map (_.toLowerCase)) 

给我所有的单词。 我想获得每行/评论pos和neg的值。 计算非常简单:如果一个单词位于pos_words/neg_words集合中,则将其置于pos/neg中。实际上,我只是指出了正面或负面词语的出现。

我该如何得到像'''''',''''''的值?

提前感谢

+0

该行在review2会给你所有的单词在一行,而不是一个cummulated pos/neg值。不知道你的分数应该如何计算。你能更新你的例子吗? – maasg 2015-03-02 19:02:10

+0

是的,你是对的。 如果我加载一个文本文件,文本文件中的每一行都是一个评论。我想为每行/评论获取pos和neg的值。 计算非常简单:如果一个单词位于pos_words/neg_words集合中,则将其置于pos/neg中。实际上,我只是指出了正面或负面词语的出现。 我的问题是reviews2包含了所有评论的单词,所以我无法统计单行的单词。 – bademaster 2015-03-03 13:20:06

回答

0

试图总结的问题是:我们要算的某些词(正,负)上输入文件是“规范化”之后的每一行出现:所有字母和空格小写。

假设我已经两套正反字:

val posWords: Set[String] = ??? 
val negWords: Set[String] = ??? 

而且,每行1个记录输入文件:

val data = sc.textFile("data.txt") 

我们希望表单的结果:

(text, posCount, negCount) 

我们首先定义一个辅助函数,让我们计算序列中单词的匹配针对一组字符串的字符串:

def matches(text:Seq[String], words:Set[String]):Int = 
text.map(w => if (words.contains(w)) 1 else 0).sum 

最后,我们把每一行成正反两方面的匹配计数。

val posNegData = data.map{line => 
    val cleanLine = line.toLowerCase.split("\\W") 
    (line, matches(cleanLine, posWords), matches(cleanLine, negWords)) 
} 

这里我们假设预期结果是带有正负匹配的原始字符串。 (这是从原来的问题不清楚)

+0

工作得很好。非常感谢你。 – bademaster 2015-03-04 21:46:03