В обработке естественного языка любую текстовую проблему необходимо преобразовать в форму, которую можно смоделировать. Простой текст можно преобразовать в функции с помощью различных методов, таких как Пакет слов (BOW), TF-IDF или встраивание слов. В последнем блоге серии Text Feature Extraction мы изучали CountVectorizer с нуля и его варианты использования для классификации текста. Мы расшифровали там, что у него есть главный недостаток - отсутствие смыслового значения. CountVectorizer учитывает количество слов для создания функции, поэтому не принимает во внимание структуру и порядок предложений. Кроме того, это приводит к большой разреженной матрице. Таким образом, TF-IDF вступает в игру.

В этой серии блогов подробно рассматривается методика TF-IDF. Итак, приступим.

Цель

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

Интуиция

  • Слово, встречающееся несколько раз, подразумевает его важность (TF).
  • Но в то же время, если он слишком часто появляется в нескольких документах, он может не иметь отношения к делу (IDF). Эти слова мы можем обозначать как стоп-слова, такие как the, this и т. Д.

Теория и концепция

  • TF-IDF (термин «частота-обратная частота документа») отображает важность слова. Это вычисление скалярного произведения TF и ​​IDF. Перед этим давайте сначала разберемся с терминами по отдельности.
  • Частота термина (TF):
    - Он демонстрирует важность слова для документа с интуицией, что чем больше термин в документе, тем выше важность.

  • Частота обратного документа (IDF):
    - показывает, насколько термин актуален на самом деле. Необязательно, чтобы термин, часто используемый в некоторых документах, мог быть релевантным, например, стоп-слова (the that, of и т. Д.). Стоп-слова не раскрывают контекст, поэтому их следует избегать. IDF работает таким образом, что игнорирует их.
    - Он наказывает слово, часто встречающееся в документах.
    - Оценка IDF выше для соответствующего термина, но меньший вес для стоп-слова
    - Учитывается натуральная логарифмическая функция, также известная как log e

  • В двух словах, значение TFIDF относится к документу, а IDF зависит от корпуса
  • Вычисление TF-IDF вручную отличается от TF-IDF Sklearn.
    Разница: термин TF остается прежним, в то время как термин IDF отличается. Давайте нырнем!
    Стандартный TF-IDF
    Стандартные обозначения показаны ниже, где N - это документы в корпусе, а n - это документы, содержащие термин m.

Sklearn TF-IDF
По определению, Tfidf должен работать как указанная выше формула, но Sklearn обеспечивает более сложные вычисления. TfidfVectorizer и TfidfTransformer вычисляют иначе, чем стандарт, следующим образом:
- Добавление 1 к числителю
- Добавление 1 к знаменателю для предотвращения деления нуля
- Добавление 1 ко всему члену журнала как константа для сглаживания
- Полученные векторы TF * IDF, затем нормализованные с помощью L2 (евклидово)

Если вам интересно узнать больше, посетите эту ссылку на StackOverflow и блог с подробными сведениями.

Процесс

Давайте перейдем к делу и изучим этапы построения модели TF-IDF. Мы будем использовать стандартное обозначение уравнение-3.

corpus = «Она любит путешествовать», «Она прекрасна»

  1. Вычислить TF: см. уравнение 1.

TF_doc2 («есть») = 1/3
TF_doc2 («прекрасный») = 1/3

2. Вычислить IDF: см. Уравнение-3.

IDF («is») = log (2/2) = 0
IDF («lovely») = log (2/1) = 0,30
Как ясно видно, вес «is» меньше, чем «прекрасный». Таким образом, прекрасное кажется более актуальным.

  • Точечное произведение слова TF и ​​IDF:

TF-IDF («есть») = TF. IDF = (1/3) * 0 = 0
TF-IDF («прекрасный») = (1/3) * 0,3 = 0,09

Результаты показали, что слово «есть» не имеет значения, в то время как «прекрасный» имеет некоторое значение. Прочитав только слово «прекрасный», можно различить предложение.

Сводка результатов выглядит следующим образом:

Реализация

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

  1. Вручную
  • Давайте создадим наш корпус предложений и переведем их в нижний регистр, чтобы не различать «это» и «это».
doc = "She is a wanderlust”, “She is lovely”
#Convert into lowercase
doc = list(map(str.lower, doc))
  • Создайте набор слов для каждого документа в корпусе
cv = CountVectorizer()
count_occurrences = cv.fit_transform(corpus)
#For doc1
bagOfWords_1 = dict.fromkeys(cv.get_feature_names())
for ind,key in enumerate(bagOfWords_1):
    bagOfWords_1[key] = count_occurrences.toarray()[0][ind]
bagOfWords_1
Out[2]:
{'is': 1, 'lovely': 0, 'she': 1, 'wanderlust': 1}
#For doc2
bagOfWords_2 = dict.fromkeys(cv.get_feature_names())
for ind,key in enumerate(bagOfWords_2):
    bagOfWords_2[key] = count_occurrences.toarray()[1][ind]
bagOfWords_2
Out[3]:
{'is': 1, 'lovely': 1, 'she': 1, 'wanderlust': 0}
  • Вычислить TF
def compute_tf(bow, doc):
    tf_dict ={}
    doc_count = len(doc)
    for word, count in bow.items():
        tf_dict[word] = count/doc_count
    return tf_dict
tf_doc1 = compute_tf(bagOfWords_1, corpus[0].split(' '))
tf_doc2 = compute_tf(bagOfWords_2, corpus[1].split(' '))
tf_doc1
Out[4]:
{'is': 0.25, 'lovely': 0.0, 'she': 0.25, 'wanderlust': 0.25}
  • Вычислить IDF
def compute_idf(docs):    
    N = len(docs)
    idfDict = dict.fromkeys(docs[0].keys(),0)
    for doc in docs:
        for word, val in doc.items():
            if val > 0:
                idfDict[word] +=1 
    
    for word, val in idfDict.items():
        # standard notation
        idfDict[word] = math.log(N / float(val))
        #sklearn notation
        #idfDict[word] = (math.log((N+1) / (val+1))) + 1
    return idfDict
idfs = compute_idf([bagOfWords_1,bagOfWords_2])
idfs
Out[5]:
{'is': 0.0,
 'lovely': 0.6931471805599453,
 'she': 0.0,
 'wanderlust': 0.6931471805599453}
  • Вычислить TF * IDF
def compute_tfidf(tf,idf):
    tfidf = {}
    for word, tfVal in tf.items():
        tfidf[word] = tfVal * idf[word]
    return tfidf
tfidf_doc1 = compute_tfidf(tf_doc1, idfs)
tfidf_doc2 = compute_tfidf(tf_doc2, idfs)
tfidf_doc1
Out[6]:
{'is': 0.0, 'lovely': 0.0, 'she': 0.0, 'wanderlust': 0.17328679513998632}

2. Sklearn
Вышеуказанные шаги можно выполнить всего несколькими строками кода. Scikit-learn предоставляет библиотеку под названием TfidfVectorizer, которая вычисляет веса Tfidf.

vectorizer = TfidfVectorizer()
vectors = vectorizer.fit_transform(corpus).todense()
vectors
"""
matrix([[0.50154891, 0.        , 0.50154891, 0.70490949],
        [0.50154891, 0.70490949, 0.50154891, 0.        ]])
"""

Недостатки

  • Понимание контекста
    Методам BagOfWords и TFIDF не хватает понимания контекста. TFIDF может расшифровать структуру предложения, но не контекст.
  • Большой словарный запас
    В случае большого словарного запаса функции становятся настолько объемными, что бросают вызов памяти и времени.

Чтобы преодолеть указанные выше недостатки, появилась новая функция извлечения слов, которая называется «Встраивание слов». Давайте узнаем об этом в статье «Извлечение функций текста» (3/3): модель встраивания слов.

Ознакомьтесь с моим репозиторием на GitHub, в котором резюмируется весь продемонстрированный здесь код.

Кроме того, вы можете узнать больше о том, как разработать модель TF-IDF для прогнозирования настроений в обзорах фильмов через этот репозиторий GitHub.

использованная литература





Чем« TF-IDF Sklearn отличается от стандартного TF-IDF ?
Давайте посмотрим на различия и шаг за шагом проанализируем применяемый подход. для вычисления TF-IDF Sklearn в сторонуdatascience.com »



Не стесняйтесь подписываться на этого автора, если вам понравился блог, потому что этот автор заверяет вас, что вы снова вернетесь с более интересными материалами, связанными с ML / AI.
Спасибо,
Удачного обучения! 😄

Можно связаться через LinkedIn.