Извлечение признаков
Цель
-
Использование DictVectorizer для реализации числовых и дискретных характеристик категорий
-
Используйте CountVectorizer для количественной оценки текстовых функций
-
Используйте TfidfVectorizer для количественной оценки текстовых функций
-
Расскажите о разнице между двумя методами выделения текстовых признаков
определение
Извлечение признаков заключается в任意数据
(например, текст или изображения)转换为可用于机器学习的数字特征
Примечание. Собственное значение предназначено для того, чтобы компьютер лучше понимал данные.
-
字典特征提取(特征离散化)
-
文本特征提取
-
图像特征提取(深度学习)
API извлечения функций
sklearn.feature_extraction
Извлечение функций словаря
эффект:对字典数据进行特征值化
- sklearn.feature_extraction.DictVectorizer(sparse=True,…)
- DictVectorizer.fit_transform(X) X: словарь или итератор, содержащий словарь, возвращаемое значение: возврат разреженной матрицы
- DictVectorizer.inverse_transform(X) X: массив массив или разреженная матрица Возвращаемое значение: формат данных до преобразования
- DictVectorizer.get_feature_names() возвращает имена категорий
применение
Выполните извлечение признаков для следующих данных
data = [{'city': '北京', 'temperature': 100}, {'city': '上海', 'temperature': 60}, {'city': '深圳', 'temperature': 30}]
Анализ процесса
-
Создать экземпляр класса DictVectorizer
-
Вызовите метод fit_transform для ввода данных и преобразования (обратите внимание на формат возврата).
def dict_demo():
"""
字典特征值提取
:return:
"""
data = [{'city': '北京', 'temperature': 100}, {'city': '上海', 'temperature': 60}, {'city': '深圳', 'temperature': 30}]
# 1. 实例化一个转换器 默认返回 sparse矩阵 将非0值按位置表示出来 以节省内存 提高加载效率
transfer = DictVectorizer(sparse=False)
# 应用场景:数据集中类别特征值较多;将数据集的特征-》字典类型;DictVectorizer转换;本身拿到的就是字典
# 2. 调用fit_transform()
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
print("特征名字:\n", transfer.get_feature_names())
return None
Обратите внимание на результат без добавленного параметра sparse=False.
Этот результат не то, что вы хотите видеть, поэтому добавьте параметры, чтобы получить желаемый результат, здесь мы называем эту технику обработки данных профессиональным названием"one-hot
"кодирование.
Суммировать
Горячее кодирование будет выполняться для функций с информацией о категории.
Извлечение текстовых признаков
作用
: Собственное значение текстовых данных
-
sklearn.feature_extraction.text.CountVectorizer(stop_words=[])
- Матрица частоты возвращаемых слов
-
CountVectorizer.fit_transform(X) X: текст или итерируемый объект, содержащий текстовые строки Возвращаемое значение: возвращает разреженную матрицу
-
CountVectorizer.inverse_transform(X) X: массив массив или разреженная матрица Возвращаемое значение: формат данных до преобразования
-
CountVectorizer.get_feature_names() возвращаемое значение: список слов
-
sklearn.feature_extraction.text.TfidfVectorizer
применение
Выполните извлечение признаков для следующих данных
data = ["life is short, i like python", "life is too long i dislike python"]
Анализ процесса
-
Создать экземпляр класса CountVectorizer
-
Вызовите метод fit_transform для ввода данных и преобразования (обратите внимание на формат возврата, используйте toarray() для массива массива преобразования разреженных матриц)
def count_demo():
"""
文本特征值抽取
:return:
"""
data = ["life is short, i like python", "life is too long i dislike python"]
# 1、实例化一个转换器类
transfer = CountVectorizer()
# 演示停用词
# transfer = CountVectorizer(stop_words=["is", "too"])
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new.toarray())
print("特征名字:\n", transfer.get_feature_names())
# 2、调用fit_transform
return None
Вопрос: А если заменить данные на китайский?
Выяснилось, что английский по умолчанию разделяется пробелами. Фактически, достигнут эффект сегментации слов, поэтому нам нужно выполнить обработку сегментации слов на китайском языке.
В следующем коде необходимо заранее сделать пробелы в тексте.
def count_chinese_demo():
"""
中文文本特征值抽取
:return:
"""
data = ["我 爱 北京 天安门", "天安门 上 太阳 升"]
data2 = ["我爱北京天安门", "天安门上太阳升"]
# 1、实例化一个转换器类
transfer = CountVectorizer()
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new.toarray())
print("特征名字:\n", transfer.get_feature_names())
# 2、调用fit_transform
return None
Смотрите ниже для лучшего решения
Сегментация слова цзеба
- jieba.cut()
- Возвращает генератор слов
Необходимо установить библиотеку jieba
pip install jieba
анализ случая
data = ["在过去两个月里,我和60多位小伙伴进行了1对1的一小时沟通;",
"TA绝大多数是想要尝试副业变现的朋友。",
"从一线城市到三线城市,从宝妈到职场人,从职场到体制内。"]
анализировать
-
Подготовьте предложения и используйте jieba.cut для сегментации слов.
-
Создать экземпляр CountVectorizer
-
Превратите результат сегментации слов в строку в качестве входного значения fit_transform.
def count_word(text):
"""
进行中文分词 我爱北京天安门-》我 爱 北京 天安门
:param text:
:return:
"""
a = " ".join(list(jieba.cut(text)))
print(a)
return a
def count_chinese_demo2():
"""
中文文本特征值抽取 自动分词
:return:
"""
data = ["在过去两个月里,我和60多位小伙伴进行了1对1的一小时沟通;",
"TA绝大多数是想要尝试副业变现的朋友。",
"从一线城市到三线城市,从宝妈到职场人,从职场到体制内。"]
# 1、实例化一个转换器类
transfer = CountVectorizer(stop_words=["从宝妈"])
data_new = transfer.fit_transform(count_word(item) for item in data)
print("data_new:\n", data_new.toarray())
print("特征名字:\n", transfer.get_feature_names())
# 2、调用fit_transform
return None
Вопрос. Что делать, если слово или фраза часто встречается в нескольких статьях?
Извлечение текстовых признаков Tf-idf
Основная идея TF-IDF заключается в следующем: если слово или фраза имеет высокую вероятность появления в статье и редко встречается в других статьях, считается, что слово или фраза имеет хорошую способность различать категории и является пригодные для использования.Классификация.
Роль TF-IDF: используется для оценки важности слова для набора документов или документа в корпусе.
формула
Частота термина (tf) относится к частоте, с которой данное слово появляется в документе.
Частота обратного документа (idf) — это мера универсальной важности слова. IDF определенного слова можно разделить на общее количество документов, содержащих это слово. Количество файлов, а затем возьмем логарифм по основанию 10 от полученного частного, чтобы получить
Конечный результат можно понимать как степень важности.
Примечание. Если общее количество слов в документе равно 100, а слово «очень» встречается 5 раз, то частота слова «очень» в документе составляет 5/100 = 0,05. Частота документов (IDF) рассчитывается путем деления общего количества документов в наборе документов на количество документов, в которых встречается слово «очень». Итак, если слово «очень» встречается в 1000 документов, а общее количество документов равно 10 000 000, частота обратного документа равна lg(10 000 000 / 1 0000) = 3. Окончательная оценка «очень» для tf-idf этого документа составляет 0,05 * 3 = 0,15.
кейс
def tfidf_demo():
"""
用TF-IDF方法进行文本特征值抽取
:return:
"""
data = ["在过去两个月里,我和60多位小伙伴进行了1对1的一小时沟通;",
"TA绝大多数是想要尝试副业变现的朋友。",
"从一线城市到三线城市,从宝妈到职场人,从职场到体制内。"]
transfer = TfidfVectorizer(stop_words=["从宝妈"])
data_new = transfer.fit_transform(count_word(item) for item in data)
print("data_new:\n", data_new.toarray())
print("特征名字:\n", transfer.get_feature_names())
return None
Важность Tf-idf
Алгоритм классификационного машинного обучения для классификации статей на ранней стадии обработки данных