2015-03-02 179 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