- 對語料庫分詞顿膨,并統(tǒng)計詞頻(去掉common-words)建椰。輸入目標詞語計算出相關度高的前十文本唆途,并考慮算法耗時問題料饥。數(shù)據(jù)在下面連接父目錄下(cranfield.tar.gz為語料庫需要解壓):
代碼
module
- os
獲取解壓的所有文件名稱 - nltk
用到textobject,創(chuàng)建一個自己的textObject宜狐,并用該對象的內(nèi)置方法統(tǒng)計每個word的頻次势告。 - re
nltk模塊分詞并不完全符合要求,利用re的正則匹配方法進一步提取word抚恒。 - pandas
創(chuàng)建時間序列的數(shù)據(jù)咱台,并用Series類的方法,整理結(jié)果數(shù)據(jù)俭驮。 - time
計算運行時間 - matplotlib
作圖module - numpy
數(shù)值計算模塊回溺,用到均值、求和以及隨機抽樣函數(shù)
function
wordCountDict
建立2層嵌套的字典混萝,最外層key為提取的word對應的value是一個字典遗遵,該字典的key為文件名稱,value為該文件出現(xiàn)最外層key對應的word的頻數(shù)(>=1)逸嘀。統(tǒng)計僅僅由數(shù)值和字母構成的word且不包括stopwords车要,結(jié)果用于下面函數(shù)。searchRelativePaper
給處幾個關鍵單詞崭倘,統(tǒng)計出現(xiàn)這些單詞的在每篇文章中出現(xiàn)的頻數(shù)之和翼岁,降序排列結(jié)果,給出前10的文章文件夾名稱司光。statQueryTime
統(tǒng)計不同查詢關鍵字個數(shù)與查詢時間花費之間關系琅坡,采取又放回的10次隨機抽樣期望代替目標值。
love & life為例查詢top10-DOC
1 | cranfield0640 | 4 |
---|---|---|
2 | cranfield0768 | 3 |
3 | cranfield0727 | 2 |
4 | cranfield0865 | 1 |
5 | cranfield0482 | 1 |
6 | cranfield0724 | 1 |
7 | cranfield0844 | 1 |
8 | cranfield0658 | 1 |
9 | cranfield0909 | 1 |
10 | cranfield1352 | 1 |
后10 應該均為0沒有統(tǒng)計意義
bottom 10 & top 10
bottom | count | top | count |
---|---|---|---|
ob | 1.0 | flow | 1732 |
nullify | 1.0 | pressure | 1120 |
inadmissable | 1.0 | number | 964 |
lina | 1.0 | results | 885 |
806 | 1.0 | boundary | 880 |
608 | 1.0 | mach | 813 |
shallower | 1.0 | theory | 777 |
cracking | 1.0 | layer | 720 |
objectionable | 1.0 | method | 674 |
428 | 1.0 | surface | 554.0 |
不僅僅這10個出現(xiàn)一次残家,因此這10個word不是唯一的答案榆俺。
words在campus出現(xiàn)頻數(shù)統(tǒng)計histogram
word出現(xiàn)頻率最高的為1750次,幾乎所有word頻都小于250次跪削,因此進一步考慮去值小于250的直方圖如下:
數(shù)據(jù)明顯還是集中在50谴仙,因此進一步看小于50樣本頻數(shù)直方圖:
總結(jié):絕大部分部分word頻數(shù)小于5次,很少一部分部分頻數(shù)取值在[50,250],極少大于250碾盐,單詞最大頻數(shù)為1732。
統(tǒng)計查詢時間與查詢詞語個數(shù)之間關系
統(tǒng)查詢結(jié)果最大值為0(沒有)揩局、極少(出現(xiàn)次數(shù)之和 x : 0 < x <= 1 * n , n為給處關鍵字的個數(shù))毫玖, 多( x > 3 * n)
num of words | empty | little | many |
---|---|---|---|
1 | 0.00110281 | 0.00227954 | 0.00209611 |
2 | 0.0009027 | 0.00309847 | 0.003008 |
3 | 0.000802159 | 0.00382876 | 0.00483092 |
- empty(沒有)、little(極少)、many(很多)這三者查詢時間呈現(xiàn)一個遞增關系付枫。
- 當總查詢結(jié)果為empty時, 查詢時間和輸入關鍵字個數(shù)影響關系可以忽略烹玉。另外兩種情況,都會隨著查詢關鍵字個數(shù)的提升阐滩,查詢時間明顯增加二打。
余弦相似度計算相似性
在上面統(tǒng)計詞頻的基礎上,利用前1000個高頻詞匯構建每篇文章的特征向量掂榔。然后利用余弦相似度計算query詞匯與每篇文章的相似度(tutorial-11assignment3.pdf在github pool目錄下继效,介紹了如何構建特征向量以及余弦相識度計算公式)。
代碼
下面分別用兩組代碼檢測:query: ['flow', 'number', 'layer']的結(jié)果:
結(jié)果now | 余弦相似度 | 結(jié)果before | 頻數(shù) |
---|---|---|---|
cranfield0050 | 0.281713 | cranfield0329 | 22.0 |
cranfield0899 | 0.271514 | cranfield1313 | 19.0 |
cranfield1302 | 0.256463 | cranfield0189 | 16.0 |
cranfield0335 | 0.255768 | cranfield0089 | 15.0 |
cranfield0343 | 0.254294 | cranfield0310 | 14.0 |
cranfield0668 | 0.238295 | cranfield0710 | 13.0 |
cranfield0192 | 0.235588 | cranfield1351 | 13.0 |
cranfield0004 | 0.234459 | cranfield0798 | 13.0 |
cranfield0310 | 0.231961 | cranfield1244 | 13.0 |
cranfield0089 | 0.231217 | cranfield0996 | 13.0 |
-
耗時:
詞頻統(tǒng)計:0.005005836486816406
余弦相似: 0.559490442276001 - 結(jié)論
兩者方法結(jié)果出入很大装获,且查詢時間后者是前者的100倍瑞信。但根據(jù)余弦相似度計算更科學,例如穴豫,A凡简,B兩篇文章都包含共同的查詢詞匯,但是A的詞匯量遠遠高于B精肃,那么A根據(jù)總體詞匯頻數(shù)統(tǒng)計大于B的可能很大秤涩,但是這并不是合理的,相反B與query詞匯的相似度才高司抱,利用余弦相似度很好解決了這點溉仑。