English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
This article shares the specific code for Python text feature extraction and vectorization for everyone's reference, as follows
Suppose we just watched Christopher Nolan's epic 'Interstellar'. Imagine how to let the machine automatically analyze the reviews of the movie by the audience to determine whether it is 'praise' (positive) or 'slam' (negative)?
Such problems belong to sentiment analysis problems. The first step in dealing with such problems is to convert text into features.
Therefore, in this chapter, we will only learn the first step, how to extract features from text and vectorize them.
Since the processing of Chinese involves segmentation issues, this article uses a simple example to explain how to use Python's machine learning library to extract features from English.
1. Подготовка данных
Python's sklearn.datasets supports reading all classified texts from a directory. However, the directory must be organized according to the rule of one folder per label name. For example, the dataset used in this article has 2 labels, one is 'net', and the other is 'pos', and there are 6 text files under each directory. The directory is as follows:
neg
1.txt
2.txt
......
pos
1.txt
2.txt
....
Содержание 12 файлов обобщено следующим образом:
neg: shit. waste my money. waste of money. sb movie. waste of time. a shit movie. pos: nb! nb movie! nb! worth my money. I love this movie! a nb movie. worth it!
2. Текстовые характеристики
Как извлечь эмоциональное отношение из этих английских текстов и классифицировать их?
Самый直观ый способ - это извлечь слова. Обычно认为, многие ключевые слова могут отражать отношение говорящего. Например, в этом простом наборе данных легко заметить, что все, кто сказал 'shit', определенно принадлежат к классу neg.
Конечно, данные набора都是为了方便描述而简单设计的. В реальной жизни одно и то же слово часто может иметь двусмысленное отношение. Но все же есть основания相信, что чем больше определенное слово встречается в классе neg, тем больше вероятность, что оно выражает негативное отношение.
Мы также注意到, что некоторые слова毫无意义 для классификации эмоций. Например, в данных выше слова «of», «I» и т.д. Эти слова имеют имя, называемое «}}Stop_Word」(стоп-слова). Эти слова можно полностью игнорировать в статистике. Очевидно, что игнорирование этих слов позволяет оптимизировать объем памяти для хранения частот записи и ускорить процесс создания.
Каждая частота слова как важная характеристика также имеет проблему. Например, в данных выше слова «movie»出现5次, но количество的出现正反两面的次数差不多, не имеет различия. А слово «worth» появилось 2 раза, но только в классе pos,显然具有很强的情感色彩, то есть высокий уровень различия.
Таким образом, нам нужно ввестиTF-IDF(Term Frequency-Inverse Document Frequency,Частота слова и обратная частота встречаемости файлаДальнейшее рассмотрение каждого слова.
TF (частота слова)Рассчитывается очень просто, это частота встречаемости слова Nt в документе t. Например, в документе «I love this movie» частота слова «love» составляет 1/4. Если удалить стоп-слова «I» и «it», то частота составит 1/2.
IDF (обратная частота встречаемости файла)Значение заключается в том, что для某一个 слова t, количество документов Dt, в которых оно появилось, составляет процент от всех тестовых документов D, и затем берем натуральный логарифм.
Например, слово «movie» появилось 5 раз, а количество документов в всего 12, поэтому IDF = ln(5/12).
Конечно, IDF используется для подчеркивания слов, которые出现 редко, но имеют сильные эмоциональные коннотации. Например, у слова «movie» IDF = ln(12/5) = 0,88, что значительно меньше, чем у слова «love» IDF = ln(12/1) = 2,48.
TF-IDFПросто умножьте их вместе. Таким образом, мы получаем TF-IDF для каждого слова в каждом документе, что и есть текстовые характеристики, которые мы извлекаем.
3. Векторизация
С учетом вышеупомянутых основ, мы можем векторизовать документы. Давайте сначала посмотрим на код, а затем разберем значение векторизации:
# -*- coding: utf-8 -*- import scipy as sp import numpy as np from sklearn.datasets import load_files from sklearn.cross_validation import train_test_split from sklearn.feature_extraction.text import TfidfVectorizer '''''Загрузка набора данных, разделение набора данных на 80% для обучения и 20% для тестирования''' movie_reviews = load_files('endata') doc_terms_train, doc_terms_test, y_train, y_test\ = train_test_split(movie_reviews.data, movie_reviews.target, test_size = 0.3) '''''Векторное пространство модели с BOOL-функциональными характеристиками, внимание, для тестовых образцов используется интерфейс transform''' count_vec = TfidfVectorizer(binary = False, decode_error = 'ignore',\ stop_words = 'english') x_train = count_vec.fit_transform(doc_terms_train) x_test = count_vec.transform(doc_terms_test) x = count_vec.transform(movie_reviews.data) y = movie_reviews.target print(doc_terms_train) print(count_vec.get_feature_names()) print(x_train.toarray()) print(movie_reviews.target)
Результат выполнения таков:
[b'waste of time.', b'a shit movie.', b'a nb movie.', b'I love this movie!', b'shit.', b'worth my money.', b'sb movie.', b'worth it!']
['love', 'money', 'movie', 'nb', 'sb', 'shit', 'time', 'waste', 'worth']
[[ 0. 0. 0. 0. 0. 0. 0.70710678 0.70710678 0. ]]
[ 0. 0. 0.60335753 0. 0. 0.79747081 0. 0. 0. ]
[ 0. 0. 0.53550237 0.84453372 0. 0. 0. 0. 0. ]
[ 0.84453372 0. 0.53550237 0. 0. 0. 0. 0. 0. ]
[ 0. 0. 0. 0. 0. 1. 0. 0. 0. ]
[ 0.76642984 0. 0. 0. 0. 0. 0. 0.64232803]
[ 0. 0. 0.53550237 0. 0.84453372 0. 0. 0. 0. ]
[ 0. 0. 0. 0. 0. 0. 0. 1. ]]
[1 1 0 1 0 1 0 1 1 0 0 0]
Выход Python выглядит очень хаотично. Вот таблица, которую я создал:
Из таблицы выше можно сделать следующие выводы:
1. Фильтрация стоп-слов.
При инициализации count_vec мы передаем stop_words = 'english', что означает использование стандартного английского списка стоп-слов. Вы можете использовать count_vec.get_stop_words() для просмотра всех встроенных стоп-слов TfidfVectorizer. Естественно, вы можете передать свой собственный список стоп-слов (например, 'movie')
2. Расчет TF-IDF.
Здесь расчет частот слов использует TfidfVectorizer из sklearn. Этот класс наследуется от CountVectorizer, на котором основан базовый расчет частот слов, и добавлены такие функции, как TF-IDF.
Мы обнаружим, что результаты расчета здесь отличаются от наших предыдущих расчетов. Потому что при создании count_vec по умолчанию передается max_df=1, поэтому TF-IDF were规格化的, чтобы все значения были ограничены в диапазоне [0,1].
3. Результат count_vec.fit.transform представляет собой огромную матрицу. Мы можем увидеть, что в таблице есть много нулей, поэтому sklearn internally использует спarsity matrix. В этом примере данные较小. Если читатель интересуется, он может попробовать использовать реальные данные, используемые исследователями в области машинного обучения,来自Cornell University:http://www.cs.cornell.edu/people/pabo/movie-review-data/. Этот сайт предоставляет множество наборов данных, среди которых несколько баз данных около 2M, около 700 примеров положительных и отрицательных. Этот масштаб данных также не велик, его можно запустить за 1 минуту,建议大家试一试. Но要注意, что эти наборы данных могут содержать незаконные символы. Поэтому при создании count_vec передается decode_error = 'ignore', чтобы пропустить эти незаконные символы.
Результаты в таблице выше представляют собой результат 8 характеристик 8 образцов для обучения. Этот результат можно классифицировать с использованием различных алгоритмов классификации.
Вот и все, что есть в этой статье, я надеюсь, что это поможет вам в изучении, и希望大家多多支持呐喊教程。
Заявление: содержание этой статьи взято из Интернета, авторские права принадлежат соответствующему автору. Контент предоставлен пользователями Интернета, загружен самостоятельно, сайт не owns авторские права, не underwent人工编辑处理, и не несет ответственности за связанные с этим юридические вопросы. Если вы обнаружите涉嫌版权的内容, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма, пожалуйста, замените # на @) для сообщения о нарушении, и предоставьте соответствующие доказательства. Если факт будет подтвержден, сайт немедленно удалил涉嫌侵权的内容。