Модели сумок из трех слов в НЛП CountVectorizer/TfidfTransformer/HashVectorizer

машинное обучение

1. CountVectorizer

CountVectorizerКласс преобразует слова в тексте в частотную матрицу слов. Например, матрица содержит один элементa[i][j]a[i][j], что значитjjслово вiiЧастота слов под текстом класса. это проходитfit_transformФункция подсчитывает количество вхождений каждого словаget_feature_names()Ключевые слова всех текстов в мешке слов можно получить с помощьюtoarray()Вы можете увидеть результат матрицы частот слов.

from sklearn.feature_extraction.text import CountVectorizer
#语料
corpus = [
    'This is the first document.',
    'This is the this second second document.',
    'And the third one.',
    'Is this the first document?'
]
#将文本中的词转换成词频矩阵
vectorizer = CountVectorizer()
print(vectorizer)
#计算某个词出现的次数
X = vectorizer.fit_transform(corpus)
print(type(X),X)
#获取词袋中所有文本关键词
word = vectorizer.get_feature_names()
print(word)
#查看词频结果
print(X.toarray())

результат:

  (0, 2)	1
  (0, 6)	1
  (0, 3)	1
  (0, 8)	1
  (1, 5)	2
  (1, 1)	1
  (1, 6)	1
  (1, 3)	1
  (1, 8)	2
  (2, 4)	1
  (2, 7)	1
  (2, 0)	1
  (2, 6)	1
  (3, 1)	1
  (3, 2)	1
  (3, 6)	1
  (3, 3)	1
  (3, 8)	1
['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third', 'this']
[[0 1 1 1 0 0 1 0 1]
 [0 1 0 1 0 2 1 0 2]
 [1 0 0 0 1 0 1 1 0]
 [0 1 1 1 0 0 1 0 1]]

2. TF-IDF

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

преимущество: Отфильтруйте некоторые распространенные, но несущественные слова.

tfidfi,j=tfi,j×idfi,jtfidf_{i,j} = tf_{i,j}\times idf_{i,j}

TF(Частота термина) указывает частоту, с которой определенное ключевое слово появляется во всей статье. (общее количество раз слово в статье/общее количество слов в статье);

tfi,j=ni,jknk,jt f_{i, j}=\frac{n_{i, j}}{\sum_{k} n_{k, j}}

IDF(Инверсная частота документа) означает вычисление инверсной частоты текста. Частота текста означает, сколько раз ключевое слово появляется во всех статьях всего корпуса. Обратная частота документа, также известная как обратная частота документа, является обратной частотой документа и в основном используется для уменьшения влияния некоторых общих слов во всех документах, но мало влияет на документ.

Официальная документация трансформатора

дефолт:

IDF(x)=logN+1N(x)+1+1IDF(x) = log\frac{N+1}{N(x)+1} + 1

здесь,NNобщее количество документов,N(x)N(x)содержать словоxxколичество документов.

Стандартное определение idf в учебнике:

IDF(x)=logNN(x)+1IDF(x) = log\frac {N}{N(x)+1}

в,NNобщее количество документов, представляющих корпус;N(x)N(x)обозначает слово, содержащееxxколичество документов.

Реализация Tfidf, как правило, сначала черезcountVectorizer, а затем пройтиtfidfTransformer, который преобразуется вtfidfвектор; также доступенTfidfVectorizerAPI.

Заявление:

TfidfTransformer(norm='l2', use_idf=True, smooth_idf=True, sublinear_tf=False)

Пример:

from sklearn.feature_extraction.text import TfidfVectorizer, TfidfTransformer, CountVectorizer
import numpy as np
#语料
cc = [
      'aa bb.',
      'aa cc.'
]
# method 1
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(cc)
print('feature',vectorizer.get_feature_names())
print(X.toarray())

результат:

feature ['aa', 'bb', 'cc']
[[0.57973867 0.81480247 0.        ]
 [0.57973867 0.         0.81480247]]

Стоит отметить, что корпус по умолчанию будет фильтровать отдельные символы как стоп-слова (stop_words).Если вам нужно сохранить слова, состоящие из отдельных символов, вы можете изменить метод сегментации слов:token_pattern='(?u)\\b\\w+\\b'

Кроме того, вышеизложенное также может быть реализовано следующим образом:

# method 2
vectorizer=CountVectorizer()#token_pattern='(?u)\\b\\w+\\b'
transformer = TfidfTransformer()
cntTf = vectorizer.fit_transform(cc)
print('feature', vectorizer.get_feature_names())
print(cntTf)
cnt_array = cntTf.toarray()
X = transformer.fit_transform(cntTf)
print(X.toarray())

результат:

feature ['aa', 'bb', 'cc']
# 第一个数字表示第几个文档;第二个数字表示第几个feature,结果表示相应的词频。
  (0, 1)        1
  (0, 0)        1
  (1, 2)        1
  (1, 0)        1
[[0.57973867 0.81480247 0.        ]
 [0.57973867 0.         0.81480247]]

понять большеTfidfTransformerоперации и выполнить простую декомпозицию для достижения этой функции:

# method 3
vectorizer=CountVectorizer()
cntTf = vectorizer.fit_transform(cc)
tf = cnt_array/np.sum(cnt_array, axis = 1, keepdims = True)
print('tf',tf)
idf = np.log((1+len(cnt_array))/(1+np.sum(cnt_array,axis = 0))) + 1
print('idf', idf)
t = tf*idf
print('tfidf',t)
print('norm tfidf', t/np.sqrt(np.sum(t**2, axis = 1, keepdims=True)))

результат:

tf [[0.5 0.5 0. ]
 [0.5 0.  0.5]]
idf [1.         1.40546511 1.40546511]
tfidf [[0.5        0.70273255 0.        ]
 [0.5        0.         0.70273255]]
norm tfidf [[0.57973867 0.81480247 0.        ]
 [0.57973867 0.         0.81480247]]

Это,TfidfTransformerПо умолчанию полученный вектор делится по нормализованной норме 2.

vнорма=vv2=vv12+v22++vn2v_{\text {norm }}=\frac{v}{\|v\|_{2}}=\frac{v}{\sqrt{v_{1}^{2}+v_{2}^{2}+\cdots+v_{n}^{2}}}

Основы теории информации TF-IDF

Вес каждого ключевого слова (Key Word) w в запросе (Query) должен отражать, сколько информации предоставляет запрос слова. Простой способ — использовать количество информации каждого слова в качестве его веса.在这里插入图片描述

Однако, если частотность TF двух слов одинакова, одно является общим словом в конкретной статье, а другое слово разбросано по нескольким статьям, очевидно, первое слово имеет более высокое разрешение, и вес должен быть выше. .

在这里插入图片描述

3. HashingVectorizer

грамматика

HashingVectorizer(alternate_sign=True, analyzer='word', binary=False,
         decode_error='strict', dtype=<class 'numpy.float64'>,
         encoding='utf-8', input='content', lowercase=True,
         n_features=1048576, ngram_range=(1, 1), non_negative=False,
         norm='l2', preprocessor=None, stop_words=None, strip_accents=None,
         token_pattern='(?u)\\b\\w\\w+\\b', tokenizer=None)

Функции

Обычный CountVectorizer существует, но когда тезаурус большой, он занимает много памяти, поэтому использование техники хеширования и хранение скомпилированной матрицы в разреженной матрице может очень хорошо решить эту проблему.

Псевдокод реализации:

 function hashing_vectorizer(features : array of string, N : integer):
     x := new vector[N]
     for f in features:
         h := hash(f)
         x[h mod N] += 1
     return x

Этот псевдокод не учитываетhashВ случае конфликта фактическая реализация будет более сложной.

from sklearn.feature_extraction.text import HashingVectorizer
corpus = [
     'This is the first document.',
     'This document is the second document.',
     'And this is the third one.',
     'Is this the first document?',
 ]
vectorizer = HashingVectorizer(n_features=2**4)
X = vectorizer.fit_transform(corpus)
print(X.toarray())
print(X.shape)

результат:

[[-0.57735027  0.          0.          0.          0.          0.
   0.          0.         -0.57735027  0.          0.          0.
   0.          0.57735027  0.          0.        ]
 [-0.81649658  0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.40824829
   0.          0.40824829  0.          0.        ]
 [ 0.          0.          0.          0.         -0.70710678  0.70710678
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.        ]
 [-0.57735027  0.          0.          0.          0.          0.
   0.          0.         -0.57735027  0.          0.          0.
   0.          0.57735027  0.          0.        ]]
(4, 16)

4. Резюме

В общем, эти три метода представляют собой модели мешка слов, где, благодаряtfidfvectorizerЭтот метод позволяет уменьшить интерференцию высокочастотных и малоинформативных слов и применяется чаще.


reference:

  1. (рекомендуется) sklearn tfidf;
  2. TF-IDF blog;
  3. Блог Цзяньпин Лю;
  4. (рекомендуется) Официальный сайт Sklearn Извлечение функций;
  5. Изучение извлечения текстовых функций sklearn;
  6. wiki, feature hashing;
  7. Красота математики У Цзюня