1. CountVectorizer
CountVectorizer
Класс преобразует слова в тексте в частотную матрицу слов.
Например, матрица содержит один элемент, что значитслово вЧастота слов под текстом класса. это проходит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(термин частота-обратная частота документа) — это метод взвешивания текста, который использует статистическое мышление, то есть количество вхождений текста и частоту документа во всем корпусе для расчета важности слов.
преимущество: Отфильтруйте некоторые распространенные, но несущественные слова.
TF(Частота термина) указывает частоту, с которой определенное ключевое слово появляется во всей статье. (общее количество раз слово в статье/общее количество слов в статье);
IDF(Инверсная частота документа) означает вычисление инверсной частоты текста. Частота текста означает, сколько раз ключевое слово появляется во всех статьях всего корпуса. Обратная частота документа, также известная как обратная частота документа, является обратной частотой документа и в основном используется для уменьшения влияния некоторых общих слов во всех документах, но мало влияет на документ.
Официальная документация трансформатора
дефолт:
здесь,общее количество документов,содержать словоколичество документов.
Стандартное определение idf в учебнике:
в,общее количество документов, представляющих корпус;обозначает слово, содержащееколичество документов.
Реализация Tfidf, как правило, сначала черезcountVectorizer
, а затем пройтиtfidfTransformer
, который преобразуется вtfidf
вектор; также доступенTfidfVectorizer
API.
Заявление:
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.
Основы теории информации 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: