Обработка естественного языка (NLP) - это подраздел искусственного интеллекта, который занимается пониманием и обработкой человеческого языка.

TF * IDF - это метод поиска информации, который взвешивает частоту термина (TF) и его обратную частоту документа (IDF). Каждое слово или термин, встречающийся в тексте, имеет соответствующую оценку TF и ​​IDF.
Произведение оценок TF и ​​IDF термина называется весом TF * IDF этого термина. Проще говоря, чем выше показатель TF * IDF (вес), тем реже термин встречается в данном документе и наоборот.

Для термина t в документе d вес Wt, d термина t в документе d определяется как:

Wt, d = TFt, d log (N / DFt)

Где:

  • TFt, d - количество вхождений t в документе d.
  • DFt - количество документов, содержащих термин t.
  • N - общее количество документов в корпусе.

Нарушение TF * IDF вниз

Как рассчитывается TF * IDF? TF (частота термина) слова - это частота слова (то есть количество раз, которое оно встречается) в документе. Когда вы знаете TF, вы можете понять, слишком ли много вы используете термин или слишком мало.

Например, если документ из 100 слов содержит термин «книга» 16 раз, TF для слова «книга» - это

TF книга = 16/100, т. е. 0,16

IDF (обратная частота документа) слова - это мера того, насколько значим этот термин во всем корпусе.

Допустим, размер корпуса составляет 10 000 000 миллионов документов. Если предположить, что существует 0,4 миллиона документов, содержащих термин «книга», тогда IDF (т.е. журнал {DF}) дается делением общего количества документов (10 000 000) на количество документов. содержащие термин «книга» (400 000).

IDF (книга) = журнал (10 000 000/400 000) = 1,4

W книга = (TF * IDF) книга = 0,16 * 1,4 = 0,224

Кодирование

Давайте прямо сейчас приступим к написанию кода. Начнем с импорта необходимых библиотек.

import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer

В этой статье мы будем работать с двумя простыми документами, каждый из которых содержит по одному предложению.

documentA = 'the man went out for a walk'
documentB = 'the children sat around the fire'

Алгоритмы машинного обучения не могут работать напрямую с необработанным текстом. Скорее текст должен быть преобразован в числовые векторы. Типичный подход к извлечению характеристик из текста при обработке естественного языка - поместить все слова, которые появляются в тексте, в корзину. Такой подход называется моделью мешка слов или сокращенно BoW. Он называется «мешком» слов, потому что теряется любая информация о структуре предложения.

bagOfWordsA = documentA.split(' ')
bagOfWordsB = documentB.split(' ')

Преобразуя набор слов в набор, мы можем автоматически удалить любые повторяющиеся слова.

uniqueWords = set(bagOfWordsA).union(set(bagOfWordsB))

Затем мы создадим словарь слов и их вхождений для каждого документа в корпусе (коллекции документов).

numOfWordsA = dict.fromkeys(uniqueWords, 0)for word in bagOfWordsA:
    numOfWordsA[word] += 1numOfWordsB = dict.fromkeys(uniqueWords, 0)for word in bagOfWordsB:
    numOfWordsB[word] += 1

Еще одна проблема с методом мешка слов заключается в том, что он не принимает во внимание шум. Другими словами, определенные слова используются для создания предложений, но не придают тексту смысловой ценности. Например, наиболее часто используемым словом в английском языке является «the», что составляет 7% всех написанных или произнесенных слов. Вы не можете сделать никаких выводов о тексте, учитывая тот факт, что он содержит слово the. С другой стороны, такие слова, как хорошо и отлично, можно использовать для определения положительной оценки.

При обработке естественного языка бесполезные слова называются стоп-словами. Библиотека python набор инструментов естественного языка предоставляет список английских стоп-слов.

from nltk.corpus import stopwordsstopwords.words('english')

Часто при построении модели для понимания текста вы видите, что все стоп-слова удаляются. Другая стратегия - оценить относительную важность слов с помощью TF-IDF.

Частота сроков (TF)

Количество появлений слова в документе делится на общее количество слов в документе. Каждый документ имеет свою частоту использования.

Следующий код реализует частоту терминов в Python.

def computeTF(wordDict, bagOfWords):
    tfDict = {}
    bagOfWordsCount = len(bagOfWords)
    for word, count in wordDict.items():
        tfDict[word] = count / float(bagOfWordsCount)
    return tfDict

Следующие строки вычисляют частоту обращения к каждому из наших документов.

tfA = computeTF(numOfWordsA, bagOfWordsA)
tfB = computeTF(numOfWordsB, bagOfWordsB)

Обратная частота данных (IDF)

Журнал количества документов, разделенный на количество документов, содержащих слово w. Частота обратных данных определяет вес редких слов во всех документах в корпусе.

Следующий код реализует обратную частоту данных в Python.

def computeIDF(documents):
    import math
    N = len(documents)
    
    idfDict = dict.fromkeys(documents[0].keys(), 0)
    for document in documents:
        for word, val in document.items():
            if val > 0:
                idfDict[word] += 1
    
    for word, val in idfDict.items():
        idfDict[word] = math.log(N / float(val))
    return idfDict

IDF рассчитывается один раз для всех документов.

idfs = computeIDF([numOfWordsA, numOfWordsB])

Наконец, TF-IDF - это просто TF, умноженная на IDF.

def computeTFIDF(tfBagOfWords, idfs):
    tfidf = {}
    for word, val in tfBagOfWords.items():
        tfidf[word] = val * idfs[word]
    return tfidf

Наконец, мы можем вычислить оценки TF-IDF для всех слов в корпусе.

tfidfA = computeTFIDF(tfA, idfs)
tfidfB = computeTFIDF(tfB, idfs)df = pd.DataFrame([tfidfA, tfidfB])

Вместо того, чтобы вручную реализовывать TF-IDF самостоятельно, мы могли бы использовать класс, предоставляемый sklearn.

vectorizer = TfidfVectorizer()vectors = vectorizer.fit_transform([documentA, documentB])feature_names = vectorizer.get_feature_names()dense = vectors.todense()denselist = dense.tolist()df = pd.DataFrame(denselist, columns=feature_names)

Значения немного отличаются, потому что sklearn использует сглаженную версию IDF и различные другие небольшие оптимизации. В примере с большим количеством текста оценка за слово the будет значительно снижена.