在全文檢索中,詞頻統計是乙個比較常見的需求。例如我們需要分析兩個文字的相似性時使用的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 ...