2009-06-18 118 views
9

我想在PHP中實現潛在語義分析(LSA),以便找出文本的主題/標籤。LSA - 潛在語義分析 - 如何在PHP中進行編碼?

這是我認爲我必須做的。 這是正確的嗎?我怎樣才能在PHP中編碼?我如何確定選擇哪些單詞?

我不想使用任何外部庫。 I've already an implementation for the Singular Value Decomposition (SVD)

  1. 提取給定文本中的所有單詞。
  2. 加權單詞/短語,例如與tf–idf。如果加權過於複雜,只需要發生次數。
  3. 構建矩陣:列是數據庫中的一些文檔(越多越好?),行都是唯一字,值是出現次數或權重。
  4. 做奇異值分解(SVD)。
  5. 使用矩陣S(SVD)中的值進行降維(如何?)。

我希望你能幫助我。非常感謝您提前!

+1

「我已經爲奇異值分解實現」 http://stackoverflow.com/questions/960060/singular-value-decomposition-svd-in-php – Ben 2009-06-19 10:11:33

+0

對不起,我現在添加鏈接。 – caw 2009-06-19 13:48:25

+0

這與PHP有什麼關係? – Novelocrat 2009-06-20 04:08:46

回答

7

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標記(一個方法!)

  1. 構建U '西格瑪' V」使用SVD和減速啓發式

  2. 通過手維數減少的基質,看通過U '矩陣,並提出描述每個「主題」的術語。例如,如果該矢量的最大部分是「布朗克斯,洋基隊,曼哈頓」,那麼「紐約市」可能是一個很好的術語。將這些保存在關聯數組或列表中。這一步應該是合理的,因爲矢量的數量是有限的。

  3. 假設你有一個文檔向量(v1)的單詞,那麼v1 * t(U')將爲該文檔提供最強的「主題」。選擇最高的3個,然後按上一步計算出的「主題」。

0

這一切都看起來不錯,直到最後一步。 SVD的通常表示法是返回三個矩陣A = USV *。 S是一個對角矩陣(意思是對角線上的所有零),在這種情況下,基本上給出了每個維度捕獲原始數據的量度。數字(「奇異值」)將會下降,並且您可以查找有多少維度有用的下拉菜單。否則,你只需要選擇一個任意數字N來表示需要多少維度。

這裏我有點模糊。在降維空間中的術語(單詞)的座標或者是U或V,我認爲取決於它們是否在輸入矩陣的行或列中。另一方面,我認爲這些字的座標將是U的行,即U的第一行對應於輸入矩陣的第一行,即第一個字。然後,您只需將該行的前N列作爲縮小空間中的單詞座標。

HTH

更新:

這個過程至今沒有確切地告訴你如何挑選出來的標籤。我從來沒有聽說過有人使用LSI來選擇標籤(機器學習算法可能更適合於任務,比如說決策樹)。 LSI告訴你兩個詞是否相似。這是分配標籤的很長一段時間。

有兩個任務 - a)要使用的標記集是什麼? b)如何選擇最好的三個標籤?我對LSI如何幫助您回答(a)沒有太多的瞭解。您可以手動選擇一組標籤。但是,如果您使用LSI,標籤可能應該是文檔中出現的單詞。然後,對於(b),您要挑選與文檔中找到的單詞最接近的標籤。你可以嘗試一些實現它的方法。在文檔中選擇最接近任意單詞的三個標籤,其中標籤的座標(其在U中的行)和單詞的座標(其在U中的行)之間的餘弦相似度(參見維基百科)測量其接近度。

1

這個答案不是直接針對海報的問題,而是針對如何自動添加新聞項目的元問題。OP提到了命名實體識別,但我相信它們意味着更多沿着自動標籤的路線。如果他們真的是NER,那麼這個反應是豬食:)

考慮到這些限制(600個/天,100-200字/項),與不同的來源,這裏有一些標記選項:

  1. 用手。一個分析師可以輕鬆地做這些每天600,這可能在幾個小時。像亞馬遜的Mechanical Turk,或者讓用戶這樣做,也可能是可行的。擁有一定數量的「手動標記」,即使只有50或100個,也是比較下面自動生成的方法得到您的一個很好的基礎。

  2. Dimentionality減少,使用LSA,主題的模型(隱含狄利克雷分佈),等等....我已經在現實世界中的數據集的運氣真的很差,LSA,我很不滿意它的統計基礎。 LDA我發現好多了,並且有一個incredible mailing list,它對如何將主題分配給文本有最好的想法。

  3. 簡單的啓發式...如果您有實際的新聞項目,然後利用新聞項目的結構。重點放在第一句話,拋出所有常用詞(停用詞),並從前兩句中選擇最好的三個名詞。或者,把第一句話中的所有名詞都拿出來,看看你能得到什麼。如果文本全部是英文的,那麼就對整個文本做詞性分析,看看你能得到什麼。通過結構化的項目,如新聞報道,LSA和其他與訂單無關的方法(tf-idf)會拋出大量信息。

祝你好運!

(如果你喜歡這個答案,也許重新標記,以適應它的問題)

0

有一個額外的在link text做這一切在PHP中的危險SO線程。

具體來說,在本文中有一個關於Latent Semantic Mapping的鏈接,它描述瞭如何獲得文本的結果「主題」。