Поиск похожих / связанных текстовых алгоритмов
Я много искал в stackru и Google, но не нашел лучшего ответа на это. На самом деле, я собираюсь разработать систему чтения новостей, которая будет сканировать и собирать новости из Интернета (с помощью сканера), а затем я хочу найти похожие или похожие новости на веб-сайтах (чтобы предотвратить отображение дублированных новостей на веб-сайте)
Я думаю, что лучшим примером для этого является Новости Google, он собирает новости из Интернета, а затем классифицирует их и находит соответствующие новости и статьи. Это то, что я хочу сделать.
Какой лучший алгоритм для этого?
2 ответа
Относительно простым решением является вычисление вектора tf-idf (en.wikipedia.org/wiki/Tf*idf) для каждого документа, а затем использование косинусного расстояния (en.wikipedia.org/wiki/Cosine_simility) между этими векторами в качестве оценка семантической дистанции между статьями.
Это, вероятно, будет захватывать семантические отношения лучше, чем расстояние Левенштейна, и будет намного быстрее вычисляться.
Это один: 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 ОЧЕНЬ полезным в анализе настроений, благодаря которому я могу сократить количество предложений в небольшой список общих фраз и / или слов и рассчитать общее настроение на основе этого. То же самое должно работать на сходство.