Любой учебник или код для Tf Idf в Java - PullRequest
3 голосов
/ 25 декабря 2009

Я ищу простой класс Java, который может вычислить вычисление TF-IDF. Я хочу сделать тест на сходство 2 документов. Я нашел так много БОЛЬШОГО API, который использовал класс tf-idf. Я не хочу использовать большой JAR-файл, просто чтобы сделать мой простой тест. Пожалуйста помоги ! Или, по крайней мере, если кто-то может сказать мне, как найти TF? а ИДФ? Я посчитаю результаты :) ИЛИ ЖЕ Если вы можете сказать мне хороший Java-учебник для этого. Пожалуйста, не говорите мне за поиск Google, я уже сделал в течение 3 дней и не мог найти ничего :( Пожалуйста, также не отсылайте меня на Lucene: (

Ответы [ 3 ]

8 голосов
/ 25 декабря 2009

Термин Частота - это квадратный корень из числа случаев, когда термин встречается в конкретном документе.

Частота обратных документов - это (журнал (общее количество документов, деленное на количество документов, содержащих термин)) плюс один в случае, если термин встречается ноль раз - если это произойдет, очевидно, не пытайтесь разделить на ноль.

Если из этого ответа не ясно, для каждого документа указывается TF и ​​IDF для каждого термина.

А затем TF-IDF (термин, документ) = TF (термин, документ) * IDF (термин)

Наконец, вы используете модель векторного пространства для сравнения документов, где каждый член является новым измерением, а "длина" части вектора, указывающей в этом измерении, является вычислением TF-IDF. Каждый документ является вектором, поэтому рассчитайте два вектора, а затем вычислите расстояние между ними.

Итак, чтобы сделать это в Java, читайте файл по одной строке за раз с помощью FileReader или чего-то еще и разделяйте на пробелы или любые другие разделители, которые вы хотите использовать - каждое слово является термином. Подсчитайте, сколько раз каждый термин появляется в каждом файле, и количество файлов, в которых появляется каждый термин. Затем у вас есть все необходимое для выполнения вышеуказанных вычислений.

И так как мне больше нечего делать, я посмотрел формулу векторного расстояния. Вот, пожалуйста:

D=sqrt((x2-x1)^2+(y2-y1)^2+...+(n2-n1)^2)

Для этой цели x1 - это TF-IDF для термина x в документе 1.

Редактировать: в ответ на ваш вопрос о том, как считать слова в документе:

  1. Читайте файл построчно с помощью ридера, например, new BufferedReader(new FileReader(filename)) - вы можете вызывать BufferedReader.readLine() в цикле while, каждый раз проверяя наличие нуля.
  2. Для каждой строки позвоните line.split("\\s") - это разделит вашу строку на пробел и даст вам массив всех слов.
  3. Для каждого слова добавьте 1 к количеству слов для текущего документа. Это можно сделать с помощью HashMap.

Теперь, после вычисления D для каждого документа, у вас будут значения X, где X - количество документов. Сравнение всех документов друг с другом означает только X ^ 2 сравнения - это не должно занять особенно много времени для 10000. Помните, что два документа БОЛЬШЕ похожи, если абсолютное значение разницы между их значениями D меньше. Тогда вы можете вычислить разницу между D для каждой пары документов и сохранить их в очереди с приоритетами или в какой-либо другой отсортированной структуре, так чтобы самые похожие документы всплыли наверх. Есть смысл?

0 голосов
/ 26 декабря 2009

agazerboy, В блоге Суджита Пала дается подробное описание расчета TF и ​​IDF. Проверяя результаты WRT, я предлагаю вам начать с небольшого корпуса (скажем, 100 документов), чтобы вы могли легко увидеть, правы ли вы. Для 10000 документов использование Lucene начинает выглядеть действительно рациональным выбором.

0 голосов
/ 25 декабря 2009

Хотя вы специально просили не ссылаться на Lucene, позвольте мне указать вам точный класс. Класс, который вы ищете, это DefaultS Similarity . Он имеет чрезвычайно простой API для расчета TF и ​​IDF. Смотрите код java здесь . Или вы могли бы просто реализовать себя, как указано в документации DefaultS Similarity.

          TF = sqrt(freq)

и

          IDF = log(numDocs/(docFreq+1)) + 1.

Функции log и sqrt используются для демпфирования фактических значений. Использование необработанных значений может сильно искажать результаты.

...