LSA鏈接:
下面是完整的算法。如果你有SVD,你就是那裏的大部分。上面的文章比我更好地解釋它。
假設:
- 您的SVD功能會給降序排列的奇異值和奇異向量。如果沒有,你必須做更多的雜技。
中號:由d(文檔)語料庫矩陣,W(字)(W行,d欄)。這些可以是原始計數,或tfidf或其他。停用詞可能會或可能不會被消除,詞幹可能會發生(Landauer說停用詞不要幹,但對tfidf是)。
U,Sigma,V = singular_value_decomposition(M)
U: w x w
Sigma: min(w,d) length vector, or w * d matrix with diagonal filled in the first min(w,d) spots with the singular values
V: d x d matrix
Thus U * Sigma * V = M
# you might have to do some transposes depending on how your SVD code
# returns U and V. verify this so that you don't go crazy :)
然後reductionality ....實際LSA本文提出一個很好的近似的基礎,是保持足夠的載體中,使得它們的奇異值的總奇異值的50%以上。
更多succintly ...(僞)
Let s1 = sum(Sigma).
total = 0
for ii in range(len(Sigma)):
val = Sigma[ii]
total += val
if total > .5 * s1:
return ii
這將返回之前的新的基礎,這是分(d,W)的排名,我們現在會近似與{} II。
(這裏, ' - >素,而不是轉置)
我們創建新矩陣:U',Sigma公司 'V',與尺寸寬x II,II X II,和ii X d。
這就是LSA算法的本質。例如,這個結果矩陣U'* Sigma'* V'可用於'改進'的餘弦相似性搜索,或者您可以爲其中的每個文檔選擇前3個單詞。這是不是一個簡單的tf-idf是一個辯論的問題。
對我來說,由於多義性和主題太多的數據集,LSA在現實世界中的數據集表現不佳。它的數學/概率基礎是不健全的(它假定正常的ish(高斯)分佈,這對於字數是沒有意義的)。
您的里程數一定會有所不同。
使用LSA標記(一個方法!)
構建U '西格瑪' V」使用SVD和減速啓發式
通過手維數減少的基質,看通過U '矩陣,並提出描述每個「主題」的術語。例如,如果該矢量的最大部分是「布朗克斯,洋基隊,曼哈頓」,那麼「紐約市」可能是一個很好的術語。將這些保存在關聯數組或列表中。這一步應該是合理的,因爲矢量的數量是有限的。
假設你有一個文檔向量(v1)的單詞,那麼v1 * t(U')將爲該文檔提供最強的「主題」。選擇最高的3個,然後按上一步計算出的「主題」。
「我已經爲奇異值分解實現」 http://stackoverflow.com/questions/960060/singular-value-decomposition-svd-in-php – Ben 2009-06-19 10:11:33
對不起,我現在添加鏈接。 – caw 2009-06-19 13:48:25
這與PHP有什麼關係? – Novelocrat 2009-06-20 04:08:46