PostgreSQL詞頻統計 ts stat

2021-10-02 07:20:27 字數 2748 閱讀 8820

在全文檢索中,詞頻統計是乙個比較常見的需求。例如我們需要分析兩個文字的相似性時使用的tf(term frequency 詞頻)/idf(inverse document frequency 逆向文字頻率)演算法就需要統計詞頻。

那麼pg中如何在一堆文字中,找到熱詞,或者對詞頻進行分析呢?

pg內建的ts_stat函式可以實現該功能,ts_stat函式用法如下:

ts_stat(sqlquery text

,[ weights text,]

out word text

,out ndoc integer

,out nentry integer

)returns setof record

其中的幾個引數分別是:

sqlquery:是包含sql查詢的文字值,該查詢必須返回單個tsvector列。

word text:詞的值。

ndoc integer:單詞出現的文件數。

nentry integer:單詞出現的總數。

例子:

1、建立生成隨機字串的函式

bill=

# create or replace function gen_rand_str(int) returns text as $$

bill$# select substring(md5(random()::text), 4, $1);

bill$# $$ language sql strict stable;

create

function

2、建立生成若干個隨機詞的函式

bill=

# create or replace function gen_rand_tsvector(int,int) returns tsvector as $$

bill$# select array_to_tsvector(array_agg(gen_rand_str($1))) from generate_series(1,$2);

bill$# $$ language sql strict;

create

function

3、建立測試表,並寫入測試資料

bill=

# create table ts_test(id int, info tsvector);

create

table

bill=

# insert into ts_test select generate_series(1,100000), gen_rand_tsvector(4,10);

insert

0100000

4、檢視詞頻,總共出現了多少次,在多少篇文字(多少條記錄**現過)

bill=

# select * from ts_stat('select info from ts_test')

bill-

# order by nentry desc, ndoc desc, word

bill-

# limit 10;

word | ndoc | nentry

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

4b1c |35|

355a11 |35|

35 a181 |34|

34 f6a2 |34|

3426f2 |32|

324f3b |32|

32 d561 |32|

320d4c |31|

31126e |31|

3122f5 |31|

31(10rows

)

5、再寫入一批測試資料,檢視詞頻,總共出現了多少次,在多少篇文字(多少條記錄**現過)

bill=

# insert into ts_test select generate_series(1,100000), gen_rand_tsvector(2,10);

insert

0100000

bill=

# select * from ts_stat('select info from ts_test')

bill-

# order by nentry desc, ndoc desc, word

bill-

# limit 10;

word | ndoc | nentry

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

ae |

4051

|4051

c0 |

4010

|4010

e2 |

4009

|4009

d9 |

3967

|3967

6a |

3964

|396419|

3956

|3956

bb |

3955

|3955

f7 |

3951

|395115|

3937

|3937

dd |

3935

|3935(10

rows

)

PTA 詞頻統計

請編寫程式,對一段英文文字,統計其中所有不同單詞的個數,以及詞頻最大的前10 的單詞。所謂 單詞 是指由不超過80個單詞字元組成的連續字串,但長度超過15的單詞將只擷取保留前15個單詞字元。而合法的 單詞字元 為大小寫字母 數字和下劃線,其它字元均認為是單詞分隔符。輸入給出一段非空文字,最後以符號 ...

詞頻統計(上機)

include include include define error 1 define ok 0 const int word length 250 定義單個單詞最大長度 typedef int status 定義儲存單詞及其出現次數的結構體 typedef struct nodewordnod...

hamlet詞頻統計

part2 code 10.1calhamlet.py def gettext txt open hamlet.txt r read 將文字中的英文本母全部轉為小寫字母 txt txt.lower return txt hamlettxt gettext words hamlettxt.split ...