У меня есть набор данных, который представляет 1000 документов и все слова, которые появляются в нем. Таким образом, строки представляют документы, а столбцы представляют слова. Так, например, значение в ячейке обозначает время, когда слово встречается в документе . Теперь я должен найти «веса» слов, используя метод tf / idf, но на самом деле я не знаю, как это сделать. Может кто-нибудь помочь мне?
r
data-mining
feature-selection
азбука
источник
источник
Ответы:
В Википедии есть хорошая статья на эту тему, дополненная формулами. Значения в вашей матрице - это термин частоты. Вам просто нужно найти idf:
(log((total documents)/(number of docs with the term))
и умножить 2 значения.В R вы можете сделать это следующим образом:
Вот наборы данных:
Вы также можете посмотреть на idf каждого термина:
источник
log((number of docs)/(number of docs containing the term))
. Вы также можете просто отфильтровать редкие термины.есть пакет tm (text mining) http://cran.r-project.org/web/packages/tm/index.html, который должен делать именно то, что вам нужно:
R - функциональный язык, поэтому чтение кода может быть сложным (например, х в терминах)
источник
В вашем коде есть ошибка: colSums вычисляет количество вхождений в корпусе, а не количество текстов со словом.
Версия вычислений такая:
источник
Существует новый пакет R, который может сделать это: textir: обратная регрессия для анализа текста
Соответствующая команда
tfidf
, пример из руководства:источник
Я опаздываю на эту вечеринку, но я играл с концепциями tc-idf (я хочу подчеркнуть слово «концепция», потому что я не следовал никаким книгам для реальных вычислений; так что они могут быть несколько непонятными, и определенно это легче сделать с помощью таких пакетов, как
{tm: Text Mining Package}
, как уже упоминалось), и я думаю, что то, что я получил, может быть связано с этим вопросом, или, в любом случае, это может быть хорошим местом для публикации.SET-UP: У меня есть корпус из
5
длинных пунктов , взятых из печатных средств массовой информации,text 1
через5
такие , как The New York Times . Предположительно, это очень маленькое «тело», крошечная библиотека, так сказать, но записи в этой «цифровой» библиотеке не случайны: первая и пятая записи имеют отношение к футболу (или «футбол» для «социального клуба») (?) где-то здесь), а точнее о самой великой команде сегодня. Так, например,text 1
начинается как ...Очень хорошо! С другой стороны, вы определенно хотите пропустить содержимое трех записей между ними. Вот пример (
text 2
):Так что же делать, чтобы любой ценой избежать «серфинга» от
text 1
доtext 2
, продолжая радоваться литературе о всемогущем «Барселоне»text 5
?TC-IDF: Я выделил слова в каждом
text
в длинные векторы. Затем посчитали частоту каждого слова, создав пять векторов (по одному для каждогоtext
), в которыхtext
были подсчитаны только слова, встречающиеся в соответствующем - все остальные слова, принадлежащие другимtext
s, были оценены в ноль. В первом фрагментеtext 1
, например, его вектор будет иметь значение 1 для слова «Месси», а для «Трампа» - 0. Это была часть tc .Часть idf также рассчитывалась отдельно для каждого
text
, и в результате было получено 5 «векторов» (я думаю, что я рассматривал их как фреймы данных), содержащих логарифмические преобразования количества документов (к сожалению, от нуля до пяти, учитывая нашу небольшую библиотеку ) содержащее данное слово как в:text
text
text
СРАВНЕНИЯ: Теперь это был просто вопрос выполнения точечных произведений среди этих «векторов важности слова».
Как и ожидалось, скалярное произведение
text 1
сtext 5
было13.42645
, аtext 1
vtext2
было только2.511799
.Неуклюжий код R (нечего имитировать) находится здесь .
Опять же, это очень элементарная симуляция, но я думаю, что это очень наглядно.
источник