[Scikit-learn Tutorial] 03.01 Обработка текста: извлечение признаков

искусственный интеллект
[Scikit-learn Tutorial] 03.01 Обработка текста: извлечение признаков

Добро пожаловать на главный сайт Jizhi:Jizhi, двигатель, ведущий к эре интеллекта



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

  • Чтение текстового содержимого и информации о классификации с жесткого диска
  • Извлечение векторов признаков из текстовой информации, которые можно использовать в процессах машинного обучения.

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

получить файл данных

Во-первых, давайте разберемся с набором данных, который мы собираемся использовать. Набор данных, используемый в этой статье, называется «20 групп новостей» и представляет собой набор данных, который часто используется для машинного обучения и обработки естественного языка. Он содержит почти 20 000 новостей в 20 новостных категориях, а его официальный профиль можно найти по адресу http://qwone.com/~jason/20Newsgroups/.

Есть несколько способов получить этот набор данных, простой способ — использовать встроенные функции sclearn.sklearn.datasets.fetch_20newsgroups. Эта функция может автоматически загружать данные «20 видов телеконференций» из Интернета и читать их, пример следующий. Чтобы сэкономить время вычислений и обработки, мы выбираем только четыре из 20 классификаций для последующего анализа.

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

from sklearn.datasets import fetch_20newsgroups
# 选取需要下载的新闻分类
categories = ["alt.atheism", "soc.religion.christian",
              "comp.graphics", "sci.med"]
# 下载并获取训练数据
twenty_train = fetch_20newsgroups(subset="train",
    categories=categories, shuffle=True, random_state=42)
# 显示训练数据的分类
twenty_train.target_names

Конечно, наш более распространенный метод — загрузить нужные нам данные прямо из сети. Мы можем использовать библиотеку urllib, предоставленную Python, для загрузки и распаковки пакета данных. Загрузка файлов из Интернета может быть выполнена с помощьюurllib.request.urlretrieveэта функция. Обычно пакеты данных, которые мы загружаем, представляют собой сжатые файлы, в настоящее время мы можем использоватьtarfileЭта библиотека сделана, как показано в следующем примере.

# 从网络下载数据包
from urllib import request
request.urlretrieve("http://jizhi-10061919.cos.myqcloud.com/sklearn/20news-bydate.tar.gz", "data.tar.gz")
# 解压下载的数据包
import tarfile
tar = tarfile.open("data.tar.gz", "r:gz")
tar.extractall()
tar.close()
# 选取需要下载的新闻分类
categories = ['alt.atheism','soc.religion.christian',
              'comp.graphics', 'sci.med']
# 从硬盘获取训练数据
from sklearn.datasets import load_files
twenty_train = load_files('20news-bydate/20news-bydate-train',
        categories=categories,
        load_content = True,
        encoding='latin1',
        decode_error='strict',
        shuffle=True,random_state=42)
# 显示训练数据的分类
print(twenty_train.target_names)

Как показано выше, после завершения загрузки пакета мы можем использоватьsklearn.datasets.load_filesчтобы получить данные. Мы также собрали только четыре категории текстовых данных для анализа и проверили некоторую информацию о прочитанных текстовых данных, чтобы определить, что данные были прочитаны.

Извлечение текстовых функций

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

Мешки слов

Одним из наиболее распространенных методов извлечения текстовых признаков является использование модели набора слов, которая выражается следующим образом: Дайте фиксированный числовой идентификатор всем вхождениям слов в документах обучающего набора (то есть создайте словарь, проиндексированный целыми числами для всех слов). за каждый документ#i, считать каждое словоwявления и записать их вX[i, j]как функция#jзначение ,jпредставляет позицию слова w в словаре

Модель мешка слов предполагает, что каждый набор данных существует.n_featuresразных слов, и это число обычно превышает 100 000. В чем проблема с этим? Учтите, что если количество выборок (то есть количество документов) равно 10000, а функции хранятся в виде 32-битных чисел с плавающей10000\times100000\times4\textrm{bytes}=4\textrm{GB}, а все 4 ГБ должны храниться в памяти компьютера, что практически невозможно для современных компьютеров.

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

scipy.sparseМодели — это просто ряд структур данных, которые управляют этим процессом, и они также получаютscikit-learnслужба поддержки.

Пометка текста с помощью scikit-learn

Эффективный модуль обработки данных будет включать в себя такие функции, как текст и обработка, теги и стоп-слова (стоп-слова, которые относятся к служебным словам, которые не влияют на значение предложения, например, «的», «地» и т. д.). Данные преобразуются в вектор признаков, тем самым создавая словарь признаков данных.

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

from sklearn.feature_extraction.text import CountVectorizer
count_vect = CountVectorizer()
X_train_counts = count_vect.fit_transform(twenty_train.data)
# 打印特征相关信息
print("训练数据共有{0}篇, 词汇计数为{1}个".format(X_train_counts.shape[0], X_train_counts.shape[1]))
# 查看某个词语的计数
count = count_vect.vocabulary_.get(u'algorithm')
print("algorithm的出现次数为{0}".format(count))

От появления к частотному анализу

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

Чтобы устранить эти потенциальные различия, мы можем попробовать разделить количество раз, которое каждое слово встречается в документе, на общее количество слов в документе, и получившуюся новую функцию можно назватьtf, это,частота слов(Термин Частоты).

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

Мы называем эту модель «частота слов + вес» какtf-idf, это, "Term Frequency times Inverse Document FrequencyНиже мы кратко опишем их математическое значение.

tf, частота слова, относится к словуt_iв документеd_jВероятность появления в , можно рассчитать по следующей формуле:

[math]?$\textrm{tf}_{i,j}=\frac{n_{i,j}}{\sum_kn_{k,j}}?$[/math]

вn_{i,j}обратиться к слову в документеd_jколичество вхождений в[math]$\sum_kn_{k,j}$[/math]относится к файлуd_jКоличество вхождений всех слов в .

idf, частота обратного документа, относится к показателю общей важности слова, указывающему количество информации о слове. IDF можно получить, разделив общее количество документов на количество документов, содержащих термин, а затем взяв логарифм:

\textrm{idf}_i=\log \frac {|D|}{| \\{j:t_i\in d_j \\}|}

в|D|представляет общее количество файлов в данных,| \\{j:t_i\in d_j \\}|Указывает, что содержит словоt_iколичество файлов.

Наконец есть:

[math]?$\textrm{tfidf}_{i,j}= \textrm{tf}_{i,j}\times \textrm{idf}_i?$[/math]

tfиtf-idfможно рассчитать следующим образом.

from sklearn.feature_extraction.text import TfidfTransformer
# 使用TF-IDF提取文本特征
tf_transformer = TfidfTransformer(use_idf=False).fit(X_train_counts)
X_train_tf = tf_transformer.transform(X_train_counts)
# 查看特征结果
X_train_tf.shape

В приведенном выше коде мы сначала использовалиfit(..)метод для обработки необработанных текстовых данных, а затем используйтеtransform(..)метод преобразования лексической статистики вtf-idfМодель. На самом деле их можно объединить вместе, чтобы сэкономить вычисления, мы можем использовать что-то вроде следующегоfit_transform(..)метод достижения этого.

from sklearn.feature_extraction.text import TfidfTransformer
tfidf_transformer = TfidfTransformer()
X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)
# 查看特征结果
X_train_tfidf.shape

На данный момент мы закончили использоватьtf-idfВесь процесс извлечения функций данных модели из текстовых данных, мы обсудим, как использовать эти функции данных для обучения модели классификации текста, оценки и процесса оптимизации в следующем разделе.


(Содержание этого курса взято изScikit-Learn - Working With Text Data,Если воспроизводится, укажите источник. )


Рекомендуемое чтение

Поддразнивание мошенников электронной почты с помощью PaddlePaddle (конец)

Этот комментарий ядовит! ——Общая процедура для классификации текста

Я сделал робота по имени Серсея, но она просто хотела, чтобы сир Грегор убивал меня на каждом шагу.