我在近一年前研究了LSI和主題建模,所以我所說的應該只是一個指針,給你一個關於在哪裏看的總體思路。
有很多不同的方法可以實現不同程度的成功。這是information retrieval領域中的一個難題。您可以搜索topic modeling以瞭解不同的選項和最先進的技術。
如果單詞可能以不同的形式出現,那麼您肯定需要一些預處理和規範化。如何NLTK和詞幹之一:
>>> from nltk.stem.lancaster import LancasterStemmer
>>> st = LancasterStemmer()
>>> st.stem('applied')
'apply'
>>> st.stem('applies')
'apply'
你有術語的詞彙,我要打電話方面也是一堆文件。我將探索一種非常基本的技術,根據術語對文檔進行排名。你可以閱讀更多更復雜的方法,但是如果你不是在尋找過於複雜和嚴格的東西,我認爲這可能就足夠了。
這被稱爲矢量空間IR模型。術語和文檔都轉換爲k維空間中的向量。爲此,我們必須構建一個逐個文檔的矩陣。這是在其中的數字表示在文件的術語的頻率的樣品基質:
![enter image description here](https://i.stack.imgur.com/RlewF.jpg)
到目前爲止,我們有使用3×4矩陣,其中每個文件可通過3維陣列(每列)來表達。但隨着術語數量的增加,這些陣列變得太大而且越來越稀疏。此外,還有許多詞彙,如I
或and
,這些詞彙在大多數文檔中都沒有添加太多語義內容。所以你可能想忽略這些類型的單詞。對於龐大和稀疏的問題,您可以使用稱爲SVD的數學技術,該技術可縮小矩陣,同時保留其包含的大部分信息。
此外,我們在上面的圖表中使用的數字是原始計數。另一種技術是使用布爾值:1表示存在,0表示文檔中沒有術語的零。但是,這些假設單詞具有相同的語義權重。實際上,稀有詞比常見詞有更多體重。因此,編輯初始矩陣的一種好方法是使用排名函數如tf-id爲每個詞指定相對權重。如果現在我們已經將SVD應用到了我們的加權逐個文檔矩陣,我們可以構造k維查詢矢量,它們只是一個權重項的數組。如果我們的查詢包含同一個術語的多個實例,則會使用頻率和術語權重的乘積。
我們需要做的事情有些簡單。我們通過分析它們的cosine similarities將查詢向量與文檔向量進行比較,這將成爲文檔相對於查詢排序的基礎。
您可能想要搜索術語「詞彙化」 - 將單詞的幾種形式組合在一個標題下(引理或根)。如果你掃描[machine-learning](http://stackoverflow.com/questions/tagged/machine-learning)標籤,你會發現很多工具參考:MLlib,SciKit Learn,SCLearn等。一個相當新的一個是開源的是可信分析平臺(我在軟件團隊中)。 – Prune