В приложении для интеллектуального анализа текста одним простым подходом является использование эвристики для создания векторов в виде компактных разреженных представлений документов. Это хорошо для настройки пакета, когда весь корпус известен априори, так как для требуется весь корпусi d f
где - термин, - документ, - корпус документа, а (не показан) - словарь.д д т
Однако, как правило, новые документы поступают со временем. Один из вариантов - продолжать использовать существующий до пор, пока не будет получено определенное количество новых документов, и пересчитать его. Однако это кажется довольно неэффективным. Кто-нибудь знает схему постепенного обновления, которая (возможно, приблизительно) сходится к значению, если все данные были просмотрены заранее? Или, в качестве альтернативы, есть другая мера, которая отражает то же понятие, но может быть вычислена поэтапно?
Существует также связанный с этим вопрос о том, остается ли хорошей мерой с течением времени. Поскольку idf охватывает понятие частоты слов в корпусе, вполне возможно, что более старые документы в корпусе (скажем, например, что мой корпус включает в себя более 100 лет журнальных статей), поскольку частоты разных слов меняются со временем. В этом случае может быть целесообразно выбрасывать старые документы, когда приходят новые, по сути, используя скользящее окно . Можно что при вычислении новых векторов можно также сохранить все предыдущие векторы , а затем, если мы хотим получить документы, скажем, 1920–1930 гг., Мы можем использовать рассчитанный по документам в этом диапазоне дат. Имеет ли этот подход смысл?я д е я д е я д п
Edit: Существует отдельный , но связанный с этим вопрос о словаре . Со временем появятся новые словарные термины, которых раньше не было, поэтомунужно будет расти, и, следовательно, длина вектора . Кажется, что это не будет проблемой, так как нули могут быть добавлены к старым векторам .| T | я д ф я д ф
Ответы:
Хорошо, спасибо Штеффену за полезные комментарии. Я думаю, что ответ довольно прост в конце. По его словам, все, что нам нужно сделать, это сохранить текущий знаменатель (назовите его ):z
Теперь, учитывая новый документ , мы обновляем знаменатель просто:d∗
Затем мы должны были бы пересчитать на основе нового вектора .tf−idf idf
Аналогично, чтобы удалить старый документ, мы уменьшаем числитель аналогичным образом.
Это делает означает , что мы должны либо хранить весь матрицу, а также матрицы (удвоение требования к памяти), или мы должны вычислить оценку при необходимости (увеличение вычислительных затрат). Я не вижу никакого способа обойти это.tf tf−idf tf−idf
Во второй части вопроса, эволюции векторов течением времени, кажется, что мы можем использовать описанный выше метод и сохранить набор «ориентирных» векторов (знаменателей) для разных диапазонов дат (или, возможно, подмножеств содержимого) , Конечно, - это плотный вектор длины словаря, поэтому его хранение будет занимать много памяти; однако это, вероятно, предпочтительнее, чем пересчет векторов когда это необходимо (что снова потребовало бы сохранения матрицы или вместо ).з з я д ф т фidf z z idf tf
источник