- 對語料庫分詞,并統(tǒng)計詞頻(去掉common-words)。輸入目標詞語計算出相關(guān)度高的前十文本,并考慮算法耗時問題。數(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對應(yīng)的value是一個字典,該字典的key為文件名稱,value為該文件出現(xiàn)最外層key對應(yīng)的word的頻數(shù)(>=1)。統(tǒng)計僅僅由數(shù)值和字母構(gòu)成的word且不包括stopwords,結(jié)果用于下面函數(shù)。searchRelativePaper
給處幾個關(guān)鍵單詞,統(tǒng)計出現(xiàn)這些單詞的在每篇文章中出現(xiàn)的頻數(shù)之和,降序排列結(jié)果,給出前10的文章文件夾名稱。statQueryTime
統(tǒng)計不同查詢關(guān)鍵字個數(shù)與查詢時間花費之間關(guān)系,采取又放回的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 應(yīng)該均為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ù)之間關(guān)系
統(tǒng)查詢結(jié)果最大值為0(沒有)、極少(出現(xiàn)次數(shù)之和 x : 0 < x <= 1 * n , n為給處關(guā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)一個遞增關(guān)系。
- 當總查詢結(jié)果為empty時, 查詢時間和輸入關(guān)鍵字個數(shù)影響關(guān)系可以忽略。另外兩種情況,都會隨著查詢關(guān)鍵字個數(shù)的提升,查詢時間明顯增加。
余弦相似度計算相似性
在上面統(tǒng)計詞頻的基礎(chǔ)上,利用前1000個高頻詞匯構(gòu)建每篇文章的特征向量。然后利用余弦相似度計算query詞匯與每篇文章的相似度(tutorial-11assignment3.pdf在github pool目錄下,介紹了如何構(gòu)建特征向量以及余弦相識度計算公式)。
代碼
下面分別用兩組代碼檢測: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詞匯的相似度才高,利用余弦相似度很好解決了這點。