
Содержание статьи
от Mayank Tripathi

Компьютеры хорошо разбираются с числами, но не очень хорошо с текстовыми данными. Одним из наиболее широко используемых методов обработки текстовых данных является TF-IDF. В этой статье мы узнаем, как это работает и каковы его особенности.
Из нашей интуиции мы считаем, что появляющиеся чаще слова должны иметь больший вес в анализе текстовых данных, но это не всегда так. Такие слова, как the, will и you называются стоп-слово — наиболее встречаются в корпусе текста, но имеют очень мало значения. Слова, встречающиеся редко, на самом деле помогают различать данные и имеют больший вес.
Введение в TF-IDF
TF-IDF расшифровывается как «Частота термина – инверсная частота данных». Сначала мы узнаем, что означает этот термин математически.
Периодичность терминов (tf): дает нам частоту слова по каждому документу в корпусе. Это отношение количества встреч слова в документе к общему количеству слов в этом документе. Она увеличивается с увеличением количества встреч этого слова в документе. У каждого документа есть свой tf.

Обратная частота данных (idf): используется для расчета веса редких слов во всех документах в корпусе. Редко встречающиеся в корпусе слова имеют высокий балл IDF. Это задается уравнением ниже.

Сочетая эти два, мы получаем оценку TF-IDF(w) для слова в документе в корпусе. Это произведение tf и idf:


Для более ясного понимания возьмем пример.
1: Автомобиль едет по дороге.
Предложение 2: Грузовик едет по шоссе.
В этом примере каждое предложение представляет собой отдельный документ.
Теперь мы вычислим TF-IDF для двух вышеуказанных документов, представляющих наш корпус.

Из приведенной выше таблицы мы видим, что TF-IDF общепринятых слов был равен нулю, что показывает, что они не являются значимыми. С другой стороны, TF-IDF для «автомобиль», «грузовик», «дорога» и «шоссе» отличны от нуля. Эти слова имеют большее значение.
Использование Python для вычисления TF-IDF
Теперь давайте кодировать TF-IDF на Python с нуля. После этого мы увидим, как мы можем использовать sklearn для автоматизации процесса.
Функция computeTF
вычисляет оценку TF для каждого слова в корпусе по документу.


Функция computeIDF
Вычисляет оценку IDF для каждого слова в корпусе.


Функция computeTFIDF
ниже вычисляется оценка TF-IDF для каждого слова путём умножения баллов TF и IDF.

Выход, полученный вышеуказанным кодом для набора документов D1 и D2, такой же, как и то, что мы вычислили вручную выше в таблице.

Вы можете перейти по этой ссылке для полной реализации.
sklearn
Теперь мы увидим, как мы можем реализовать это с помощью sklearn в Python.
Во-первых, мы будем импортировать TfidfVectorizer
от sklearn.feature_extraction.text
:

Теперь мы инициализируем vectorizer
а затем вызовите fit и трансформируйте над ним, чтобы вычислить оценку TF-IDF для текста.

Под капотом sklearn fit_transform выполняет следующее fit
и transform
функции. Их можно найти в официальной библиотеке sklearn на GitHub.
def fit(self, X, y=None):
"""Learn the idf vector (global term weights)
Parameters
----------
X : sparse matrix, [n_samples, n_features]
a matrix of term/token counts
"""
if not sp.issparse(X):
X = sp.csc_matrix(X)
if self.use_idf:
n_samples, n_features = X.shape
df = _document_frequency(X)
# perform idf smoothing if required
df += int(self.smooth_idf)
n_samples += int(self.smooth_idf)
# log+1 instead of log makes sure terms with zero idf don't get
# suppressed entirely.
idf = np.log(float(n_samples) / df) + 1.0
self._idf_diag = sp.spdiags(idf, diags=0, m=n_features,
n=n_features, format="csr")
return self
def transform(self, X, copy=True):
"""Transform a count matrix to a tf or tf-idf representation
Parameters
----------
X : sparse matrix, [n_samples, n_features]
a matrix of term/token counts
copy : boolean, default True
Whether to copy X and operate on the copy or perform in-place
operations.
Returns
-------
vectors : sparse matrix, [n_samples, n_features]
"""
if hasattr(X, 'dtype') and np.issubdtype(X.dtype, np.floating):
# preserve float family dtype
X = sp.csr_matrix(X, copy=copy)
else:
# convert counts or binary occurrences to floats
X = sp.csr_matrix(X, dtype=np.float64, copy=copy)
n_samples, n_features = X.shape
if self.sublinear_tf:
np.log(X.data, X.data)
X.data += 1
if self.use_idf:
check_is_fitted(self, '_idf_diag', 'idf vector is not fitted')
expected_n_features = self._idf_diag.shape[0]
if n_features != expected_n_features:
raise ValueError("Input has n_features=%d while the model"
" has been trained with n_features=%d" % (
n_features, expected_n_features))
# *= doesn't work
X = X * self._idf_diag
if self.norm:
X = normalize(X, norm=self.norm, copy=False)
return X
В вышеприведенном коде следует отметить, что вместо журнала n_samples к n_samples было добавлено 1 для вычисления оценки IDF. Это гарантирует, что слова с нулевой оценкой IDF не скрываются полностью.
Получен выход в виде скошенной матрицы, нормализуемой, чтобы получить следующий результат.

Таким образом мы увидели, как мы можем легко кодировать TF-IDF всего за 4 строчки с помощью sklearn. Теперь мы понимаем, насколько мощным является TF-IDF как инструмент для обработки текстовых данных из корпуса. Чтобы узнать больше о sklearn TF-IDF, вы можете воспользоваться этой ссылкой.
Счастливого кодирования!
Спасибо, что прочли эту статью. Обязательно поделитесь им, если вы считаете это полезным.
Чтобы узнать больше о программировании, вы можете подписаться на меня, чтобы получать уведомления каждый раз, когда я создаю новую публикацию.
На здоровье!
Кроме того, давайте подключимся Twitter, Linkedin, Github и Facebook.