spark計算單詞的相對頻率

2021-07-27 12:52:50 字數 3195 閱讀 1502

需求:

如果定義乙個單詞的鄰域為這個單詞的前兩個單詞和後兩個單詞,求的是每個鄰域單詞佔每個單詞鄰域的比重

如:w01,w02,w03,w04,w05

鄰域表:

單詞鄰域

w01w02,w03

w02w01,w03,w04

w03w01,w02,w03,w05

w04w02,w03,w05

w05w03,w04

那麼對於 w01而言,w02和 w03所佔的比重都是1/2

那麼對於 w02而言,w01,w03,w04所佔的比重都是1/3

以此類推…資料一般不會出現這種所有單詞只出現一次的情況

資料:

w01,w02,w03,w04,w05,w06,w07,w08,w09,w10,w01,w02,w03,w04,w05,w06,w07,w08,w09,w10
**:

import org.apache.spark.sql.

import org.apache.spark.sql.types.

object

relativefrequency yield (tokens(i), (tokens(j), 1))

})// 第一種方式

// (word, sum(word))

val totalbykey = pairs.map(t => (t._1, t._2._2)).reducebykey(_ + _)

// (word, (neighbour, sum(neighbour)))

val uniquepairs = pairs.groupbykey()

.flatmapvalues(_.groupby(_._1).mapvalues(_.unzip._2.sum))

// (word, ((neighbour, sum(neighbour)), sum(word)))

val joined = uniquepairs join totalbykey

// ((key, neighbour), sum(neighbour)/sum(word))

val relativefrequency = joined.map(t => (t._1, t._2._1._1, (t._2._1._2.todouble / t._2._2.todouble).formatted("%.2f")))

relativefrequency.foreach(println)

// 第二種方式,dataframe

val rfschema = structtype(structfield("word", stringtype, false) ::

structfield("neighbour", stringtype, false) ::

structfield("frequency", integertype, false) :: nil)

spark.createdataframe(pairs.map(t => row(t._1, t._2._1, t._2._2)), rfschema)

.createorreplacetempview("rftable")

spark.sql(

"""|select a.word,

| a.neighbour,

| (a.feq_total/b.total) rf

|from

| (select word,

| neighbour,

| sum(frequency) feq_total

| from rftable

| group by word,

| neighbour) a

|inner join

| (select word,

| sum(frequency) as total

| from rftable

| group by word) b on a.word = b.word

|order by a.word, a.neighbour

""".stripmargin).show()

spark.stop()

}}

結果:

+----+---------+-------------------+

|word|neighbour| rf|

+----+---------+-------------------+

| w01| w02|

0.3333333333333333|

| w01| w03|

0.3333333333333333|

| w01| w09|

0.16666666666666666|

| w01| w10|

0.16666666666666666|

| w02| w01|

0.2857142857142857|

| w02| w03|

0.2857142857142857|

| w02| w04|

0.2857142857142857|

| w02| w10|

0.14285714285714285|

| w03| w01|

0.25|

| w03| w02|

0.25|

| w03| w04|

0.25|

| w03| w05|

0.25|

| w04| w02|

0.25|

| w04| w03|

0.25|

| w04| w05|

0.25|

| w04| w06|

0.25|

| w05| w03|

0.25|

| w05| w04|

0.25|

| w05| w06|

0.25|

| w05| w07|

0.25|

+----+---------+-------------------+

計算單詞出現頻率

cat words.txt tr cs a z a z 012 tr a z a z sort uniq c sort k1nr k2 head 10 但是有時我們想查詢出某乙個單詞的出現頻率這時我們可以使用如下幾個命令 檔名稱 file 查詢單詞名稱 word 操作命令 1 more file g...

c語言計算單詞頻率

題目要求是找出一篇文章頻率最高的十個單詞,而且也可以是比較大的檔案,開始看的題目的要求,只是小小的構思了一下,想到應該用到檔案的讀寫,因為對c 檔案的讀寫不是很熟練,所以選擇使用c,本來想的是要用陣列來存放單詞,比如用乙個二維陣列存放單詞,再對應乙個一維陣列存放個數,然後對陣列進行排序來找出數目最多...

python 計算文字中每個單詞的出現頻率

計算文字中每個單詞的使用頻率,並從高到低進行排序 from string import punctuation 開啟資料匯入 text open text.txt def count text dic dict 建立新字典 for line in text word line.split 將字串分割...