4

私はstackoverflowとGoogleでたくさん検索しましたが、これに対する最良の答えは見つかりませんでした。実は、(クローラーを使って)ウェブからニュースをクロールして収集するニュースリーダーシステムを開発し、ウェブサイトで類似または関連するニュースを見つけたいと思っています(ウェブサイトで重複したニュースが表示されないようにするため)

そのための最良の実例はGoogleニュースだと思います。これは、Webからニュースを収集し、関連するニュースや記事を分類して検索します。これが私がやりたいことです。

これを行うための最良のアルゴリズムは何ですか?

4

2 に答える 2

4

比較的簡単な解決策は、各ドキュメントのtf-idfベクトル(en.wikipedia.org/wiki/Tf*idf)を計算し、これらのベクトル間のコサイン距離(en.wikipedia.org/wiki/Cosine_similarity)を記事間の意味的距離の推定。

これはおそらくレーベンシュタイン距離よりも意味論的関係をよりよく捉え、計算がはるかに高速です。

于 2012-09-21T17:48:06.680 に答える
1

これは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は感情分析に非常に役立つことがわかりました。これにより、文の数を一般的なフレーズや単語の小さなリストに減らし、これに基づいて全体的な感情を計算できます。類似性についても同じことが機能するはずです。

于 2012-09-21T16:20:36.310 に答える