Термин Частота - это квадратный корень из числа случаев, когда термин встречается в конкретном документе.
Частота обратных документов - это (журнал (общее количество документов, деленное на количество документов, содержащих термин)) плюс один в случае, если термин встречается ноль раз - если это произойдет, очевидно, не пытайтесь разделить на ноль.
Если из этого ответа не ясно, для каждого документа указывается 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.
Редактировать: в ответ на ваш вопрос о том, как считать слова в документе:
- Читайте файл построчно с помощью ридера, например,
new BufferedReader(new FileReader(filename))
- вы можете вызывать BufferedReader.readLine()
в цикле while, каждый раз проверяя наличие нуля.
- Для каждой строки позвоните
line.split("\\s")
- это разделит вашу строку на пробел и даст вам массив всех слов.
- Для каждого слова добавьте 1 к количеству слов для текущего документа. Это можно сделать с помощью
HashMap
.
Теперь, после вычисления D для каждого документа, у вас будут значения X, где X - количество документов. Сравнение всех документов друг с другом означает только X ^ 2 сравнения - это не должно занять особенно много времени для 10000. Помните, что два документа БОЛЬШЕ похожи, если абсолютное значение разницы между их значениями D меньше. Тогда вы можете вычислить разницу между D для каждой пары документов и сохранить их в очереди с приоритетами или в какой-либо другой отсортированной структуре, так чтобы самые похожие документы всплыли наверх. Есть смысл?