Метод извлечения текстовых функций в sklearn

машинное обучение
Метод извлечения текстовых функций в sklearn

Это 20-й день моего участия в августовском испытании обновлений. Узнайте подробности события:Испытание августовского обновления

Что такое извлечение признаков?

Извлечение признаков заключается в уменьшении размерности некоторых исходных входных данных или рекомбинации исходных признаков для последующего использования.

Например: Мы знаем, что иногда исходные данные имеют множество признаков, причем некоторые из них сильно коррелированы, а некоторые не связаны с конечной целью. Нам нужно удалить функции, которые не связаны между собой. (уменьшить измерение данных) Для изображений каждое изображение содержит много данных. В настоящее время вычисление необработанных данных напрямую будет очень медленным, что не очень хорошо для нас, чтобы работать в режиме реального времени. Нам нужно извлечь новые функции. (уменьшить измерение данных) Мы получаем новую функцию с помощью многомерных функций исходных данных и, наконец, используем эту новую функцию для принятия решений. (Организация существующих функций данных)

Что делает извлечение признаков?

  1. Уменьшить размеры данных
  2. Извлечение или сортировка допустимых функций для последующего использования

Методы извлечения признаков в sklearn

sklearn в настоящее время включает методы для извлечения функций из текста и изображений.

метод инструкция
feature_extraction.DictVectorizer(*[, …]) Извлечение признаков из словаря
feature_extraction.FeatureHasher([…]) Хэш функции

Извлечение текстовых признаков

метод инструкция
feature_extraction.text.CountVectorizer(*[, …]) Преобразование набора текстовых документов в матрицу частоты терминов
feature_extraction.text.HashingVectorizer(*) Векторизация набора текстовых документов с помощью трюков хеширования
feature_extraction.text.TfidfTransformer(*) Преобразуйте разреженную матрицу, сгенерированную CountVectorizer, в матрицу признаков TF-IDF.
feature_extraction.text.TfidfVectorizer(*[, …]) Преобразование исходной коллекции документов в матрицу признаков TF-IDF

DictVectorizer - загружать функции из словаря

Класс DictVectorizer можно использовать для преобразования данных в стандартный Python.dictСписок объектов представляет собой массив функций представления, преобразованный в форму NumPy/SciPy, используемую оценщиками scikit-learn.

Хотя не особенно быстро, PythondictИмеет следующие преимущества: простота использования, разреженность (отсутствующие функции не нужно сохранять), а имена функций сохраняются в дополнение к значениям функций.

DictVectorizer используется для категориальных функций путем реализации «горячего» кодирования. Категориальные функции имеют форму пар атрибут-значение, где значения ограничены неупорядоченным списком соответствующих требований (например, идентификаторы субъектов, типы объектов, теги, имена и т. д.).

В следующем примере «город» является категориальным атрибутом, а «температура» — традиционным числовым признаком:


>>> measurements = [
...     {'city': 'Dubai', 'temperature': 33.},
...     {'city': 'London', 'temperature': 12.},
...     {'city': 'San Francisco', 'temperature': 18.},
... ]

>>> from sklearn.feature_extraction import DictVectorizer
>>> vec = DictVectorizer()

>>> vec.fit_transform(measurements).toarray()
array([[ 1.,  0.,  0., 33.],
       [ 0.,  1.,  0., 12.],
       [ 0.,  0.,  1., 18.]])

>>> vec.get_feature_names()
['city=Dubai', 'city=London', 'city=San Francisco', 'temperature']

FeatureHasher - хэш функции

FeatureHasher — это высокоскоростной векторизованный класс с малым объемом памяти. Он использует метод, называемый хешированием признаков (или «хеш-трюком»).

Этот класс является заменой DictVectorizer и CountVectorizer с низким объемом памяти для крупномасштабного (онлайн) обучения и ситуаций с нехваткой памяти.

Выход FeatureHasher всегда представляет собой матрицу scipy.sparse в формате CSR.

>>> from sklearn.feature_extraction import FeatureHasher
>>> hasher = FeatureHasher(n_features=10)
>>> D = [{'dog': 1, 'cat':2, 'elephant':4},{'dog': 2, 'run': 5}]
>>> f = hasher.transform(D)
>>> f.toarray()
array([[ 0.,  0., -4., -1.,  0.,  0.,  0.,  0.,  0.,  2.],
       [ 0.,  0.,  0., -2., -5.,  0.,  0.,  0.,  0.,  0.]])

Параметры: n_features — количество признаков (столбцов) в выходной матрице. При линейном обучении небольшое количество признаков может легко привести к коллизиям хэшей, в то время как большое количество признаков приводит к большой размерности коэффициентов.

Извлечение текстовых признаков

CountVectorizer — матрица частот терминов

CountVectorizer — это метод извлечения текстовых признаков. Для каждого обучающего текста учитывается только частота каждого слова в этом обучающем тексте.

Класс CountVectorizer имеет множество параметров, которые разделены на три этапа обработки: предварительная обработка, токенизация и генерация n-грамм.

>>> from sklearn.feature_extraction.text import CountVectorizer
>>> texts=["dog cat fish","dog cat cat","fish bird", 'bird']
>>> cv = CountVectorizer() # 创建词袋数据结构
>>> cv_fit=cv.fit_transform(texts)
>>> print(cv.get_feature_names()) # 列表形式呈现文章生成的词典
['bird', 'cat', 'dog', 'fish']
>>> print(cv.vocabulary_) # 字典形式呈现,key:词,value:词频
{'dog': 2, 'cat': 1, 'fish': 3, 'bird': 0}
>>> print(cv_fit.toarray()) # 词频矩阵
array([[0, 1, 1, 1],
       [0, 2, 1, 0],
       [1, 0, 0, 1],
       [1, 0, 0, 0]])

CountVectorizer преобразует слова в тексте в матрицу частот слов с помощью функции fit_transform, Элемент матрицы a[i][j] представляет частоту слов j-го слова под i-м текстом, то есть количество раз каждого появляется слово. Ключевые слова всех текстов можно увидеть с помощью get_feature_names(), а результат матрицы частоты слов можно увидеть с помощью toarray().

HashingVectorizer

HashingVectorizer использует приемы хеширования для векторизации текста.

Функции

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

>>> 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)
>>> X
<4x16 sparse matrix of type '<class 'numpy.float64'>'
        with 16 stored elements in Compressed Sparse Row format>
>>> X.toarray()
array([[-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.        ]])

TfidfTransformer

TfidfTransformer — это вес tf-idf каждого слова в матрице частоты слов, созданной CountVectorizer.

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


>>> from sklearn.feature_extraction.text import TfidfTransformer
>>> transformer = TfidfTransformer(smooth_idf=False)
>>> transformer
TfidfTransformer(smooth_idf=False)
>>> 
>>> counts = [[3, 0, 1],
...           [2, 0, 0],
...           [3, 0, 0],
...           [4, 0, 0],
...           [3, 2, 0],
...           [3, 0, 2]]
>>> 
>>> tfidf = transformer.fit_transform(counts)
>>> tfidf
<6x3 sparse matrix of type '<class 'numpy.float64'>'
        with 9 stored elements in Compressed Sparse Row format>
>>> 
>>> tfidf.toarray()
array([[0.81940995, 0.        , 0.57320793],
       [1.        , 0.        , 0.        ],
       [1.        , 0.        , 0.        ],
       [1.        , 0.        , 0.        ],
       [0.47330339, 0.88089948, 0.        ],
       [0.58149261, 0.        , 0.81355169]])

TfidfVectorizer

TfidfVectorizer принимает текстовые данные и выполняет извлечение признаков набора слов и преобразование TF-IDF.

TfidfVectorizer эквивалентен комбинации CountVectorizer и TfidfTransformer.

>>> corpus = [
...     'This is the first document.',
...     'This is the second second document.',
...     'And the third one.',
...     'Is this the first document?',
... ]
>>> from sklearn.feature_extraction.text import TfidfVectorizer
>>> vectorizer = TfidfVectorizer()
>>> result = vectorizer.fit_transform(corpus)
>>> result.toarray()
array([[0.        , 0.43877674, 0.54197657, 0.43877674, 0.        ,
        0.        , 0.35872874, 0.        , 0.43877674],
       [0.        , 0.27230147, 0.        , 0.27230147, 0.        ,
        0.85322574, 0.22262429, 0.        , 0.27230147],
       [0.55280532, 0.        , 0.        , 0.        , 0.55280532,
        0.        , 0.28847675, 0.55280532, 0.        ],
       [0.        , 0.43877674, 0.54197657, 0.43877674, 0.        ,
        0.        , 0.35872874, 0.        , 0.43877674]])

Суммировать

sklearn поддерживает преобразование текста в матрицу частот слов (CountVectorizer), матрицу TF-IDF (TfidfVectorizer), хэш-матрицу (HashingVectorizer), эти три метода являются методами модели мешков слов, среди которых:TfidfVectorizerЭтот метод позволяет уменьшить интерференцию высокочастотных и малоинформативных слов и применяется чаще.

Справочная статья