2012-09-21 34 views
3

我在stackoverflow和Google搜索了很多,但是我沒有找到最好的答案。 實際上,我打算開發一個新聞閱讀器系統,用於抓取並從網絡收集新聞,然後,我想在網站中找到類似或相關的新聞(爲了防止在網站上顯示重複的新聞)尋找類似/相關的文本算法

我認爲最好的例子是Google新聞,它收集來自網絡的新聞,然後分類並找到相關的新聞和文章。這是我想要做的。

這樣做的最佳算法是什麼?

+1

在我看來,你可以使用貝葉斯網絡,但一個好的網絡並非如此微不足道的實施。 –

+0

我們可以聊聊天:http://chat.stackexchange.com/rooms/21749/nlp-for-news –

回答

3

一個相對簡單的解決方案是爲每個文檔計算一個tf-idf矢量(en.wikipedia.org/wiki/Tf*idf),然後使用餘弦距離(en.wikipedia.org/wiki/Cosine_similarity)這些向量作爲文章之間語義距離的估計。

這可能會捕獲比Levenstein距離更好的語義關係,並且計算速度更快。

+0

我們可以聊天嗎:http://chat.stackexchange.com/rooms/21749/nlp-for-news –

1

這是一個:http://en.wikipedia.org/wiki/Levenshtein_distance

public static SqlInt32 ComputeLevenstheinDistance(SqlString firstString, SqlString secondString) 
{ 
    int n = firstString.Value.Length; 
    int m = secondString.Value.Length; 
    int[,] d = new int[n + 1,m + 1]; 

    // Step 1 
    if (n == 0) 
    { 
     return m; 
    } 

    if (m == 0) 
    { 
     return n; 
    } 

    // Step 2 
    for (int i = 0; i <= n; d[i, 0] = i++) 
    { 
    } 

    for (int j = 0; j <= m; d[0, j] = j++) 
    { 
    } 

    // Step 3 
    for (int i = 1; i <= n; i++) 
    { 
     //Step 4 
     for (int j = 1; j <= m; j++) 
     { 
      // Step 5 
      int cost = (secondString.Value[j - 1] == firstString.Value[i - 1]) ? 0 : 1; 

      // Step 6 
      d[i, j] = Math.Min(Math.Min(d[i - 1, j] + 1, d[i, j - 1] + 1), d[i - 1, j - 1] + cost); 
     } 
    } 
    // Step 7 
    return d[n, m]; 
} 

這是非常方便的在手頭的任務:http://code.google.com/p/boilerpipe/

另外,如果你需要減少的話來分析的數量,試試這個:http://ots.codeplex.com/

我發現OTS在情感分析中非常有用,藉此我可以將句子數量減少爲一小部分常見短語和/或單詞,並根據此計算總體情緒。相同也應該起作用。

+1

如果可以收集新聞比比皆是「沙」,關於「傷心」的人和「瘋狂「的奶牛。對於「自動填充」或拼寫檢查建議,這可能是好的,但不能提取單詞的含義! –