Pandas-文本特征构造

在这里插入图片描述

前言

文本特征是指从文本中提取出的有意义的特征,常见的文本特征有词频、tf-idf、n-gram等。在机器学习领域,文本特征是非常重要的一种特征,因为文本数据是一种非常常见的数据形式。本文将从tf-idf、中文分词、类别特征构造法等方面介绍文本特征的相关知识。

一、tf-idf

tf-idf是文本处理中常用的一种特征提取方法,其全称为Term Frequency-Inverse Document
Frequency,即词频-逆文本频率。它的核心思想是将词语在文本中出现的频率与该词语在整个文本集合中出现的文本数的比值进行计算,从而衡量一个词语在文本中的重要程度。

tf-idf的公式如下:

t f i d f ( t , d , D ) = t f ( t , d ) ∗ i d f ( t , D ) tfidf(t,d,D) = tf(t,d) * idf(t,D) tfidf(t,d,D)=tf(t,d)idf(t,D)

其中, t t t表示某个词语, d d d表示某个文本, D D D表示整个文本集合。 t f ( t , d ) tf(t,d) tf(t,d)表示词语 t t t在文本 d d d中出现的频率, i d f ( t , D ) idf(t,D) idf(t,D)表示词语 t t t在整个文本集合 D D D中出现的文本数的倒数,即:

i d f ( t , D ) = l o g ∣ D ∣ d f ( t , D ) idf(t,D) = log \frac{|D|}{df(t,D)} idf(t,D)=logdf(t,D)D

其中, ∣ D ∣ |D| D表示整个文本集合中的文本数, d f ( t , D ) df(t,D) df(t,D)表示包含词语 t t t的文本数。

tf-idf的应用非常广泛,可以用于文本分类、信息检索、文本聚类等任务。下面使用sklearn的TfidfVectorizer构造一个真实案例。

首先,使用pandas缓存里的20类新闻数据集:

import pandas as pd
from sklearn.datasets import fetch_20newsgroups
import urllib.request
from sklearn.datasets import fetch_20newsgroups
# 将数据集转换为DataFrame
df = pd.DataFrame({'text': newsgroups.data, 'target': newsgroups.target})
print(df.head())
newsgroups = fetch_20newsgroups() #获取数据集
# 将数据集转换为DataFrame
df = pd.DataFrame({'text': newsgroups.data, 'target': newsgroups.target})
print(df.head())

输出结果:

在这里插入图片描述
如果无法下载数据集,需要更新sklearn到最新版本,或者使用vpn代理

# 使用vpn代理
proxy_support = urllib.request.ProxyHandler({'https':'https://127.0.0.0:7890'})
opener = urllib.request.build_opener()
urllib.request.install_opener(opener)
newsgroups = fetch_20newsgroups() #重新下载

TfidfVectorizer和TfidfTransformer类来进行文本特征提取和转换

from sklearn.feature_extraction.text import TfidfVectorizer, TfidfTransformer

# 创建一个TfidfVectorizer对象,指定停用词为英文
tfidf_vectorizer = TfidfVectorizer(stop_words='english')

# 使用TfidfVectorizer对象的fit_transform方法对文本数据进行特征提取
tfidf_features = tfidf_vectorizer.fit_transform(df['text'])

# 创建一个TfidfTransformer对象,用于对提取出的特征进行转换
transformer = TfidfTransformer()

# 使用TfidfTransformer对象的fit_transform方法对特征进行转换
result = transformer.fit_transform(tfidf_features)

# 输出tf-idf值和文档数量、单词数量
print('tf-idf值:',np.array(tfidf_features.data))
print('文档数量:',tfidf_features.shape[0],'单词数量:',tfidf_features.shape[1])

输出结果:
在这里插入图片描述

这段代码的作用是将文本数据转换为TF-IDF特征向量,以便于机器学习算法进行处理。其中,TfidfVectorizer类用于将文本数据转换为文本矩阵,TfidfTransformer类用于对提取出的特征进行转换。

查询tf-idf值最高的单词

np.array(tfidf_vectorizer.get_feature_names_out())[result.toarray().argmax(1)]

输出结果:
在这里插入图片描述

中文分词

中文分词是将中文文本按照一定规则切分成一个个词语的过程。由于中文没有像英文一样的空格分隔符,因此需要使用专门的分词工具进行处理。常用的中文分词工具有jieba、snownlp等。这里以jieba为例

下面使用jieba对一段中文文本进行分词:

import jieba

text = '我爱真理'
cut_text = jieba.cut(text)
print(list(cut_text))

运行结果为:

['我', '爱', '真理']

可以看到,jieba将输入的中文文本按照词语切分,并返回一个包含所有词语的列表。这个列表可以作为后续文本特征提取的输入。

二、类别特征构造法

类别特征是指具有离散取值的特征,比如性别、颜色等。在文本特征中,类别特征也非常常见,比如作者、地点、时间等。构造类别特征的方法有很多种,下面介绍两种常用的方法:情感分析和命名实体识别特征构造。

  1. 情感分析特征构造

情感分析是指对文本进行情感倾向性分析的过程,通常将文本分为积极、中性和消极三种情感。为了构造情感分析特征,可以使用情感词典,将文本中出现的情感词语进行统计。情感词典是一种包含了各种情感词语及其情感极性的词典,可以手动构建,也可以使用已有的情感词典。下面以哈工大情感词典为例,构造情感分析特征。

首先,读取情感词典:

import pandas as pd

sentiment_dict = pd.read_csv('https://raw.githubusercontent.com/fighting41love/funNLP/master/data/情感词典/情感词汇本体.xlsx', 
                             sep='\t', header=None, names=['word', 'weight'])

其中,情感词典中的每个词语都有一个情感极性权重,通常为正数、负数或0,表示该词语对应的情感倾向。

接着,对每个文本进行情感分析特征构造:

def get_sentiment_feature(text):
    sentiment_words = [word for word in jieba.cut(text) if word insentiment_dict['word'].values]
    pos_words = [word for word in sentiment_words if sentiment_dict[sentiment_dict['word']==word]['weight'].values>0]
    neg_words = [word for word in sentiment_words if sentiment_dict[sentiment_dict['word']==word]['weight'].values<0]
    return len(pos_words), len(neg_words)

news_df['pos_words'], news_df['neg_words'] = zip(*news_df['news'].apply(get_sentiment_feature))

其中,get_sentiment_feature函数使用了jieba进行分词,并统计了每个文本中积极和消极情感词语的数量。最后,将这些数量作为情感分析特征添加到原始数据集中。

  1. 命名实体识别特征构造

命名实体识别是指对文本中的命名实体进行识别和分类的过程,命名实体包括人名、地名、组织机构名、时间、数字等。为了构造命名实体识别特征,可以使用开源工具进行命名实体识别,如Stanford NER、LTP等。以Stanford NER为例,构造命名实体识别特征。

首先,安装Stanford NER并加载模型:

!pip install stanfordcorenlp

from stanfordcorenlp import StanfordCoreNLP

nlp = StanfordCoreNLP(r'stanford-ner-4.2.0', lang='zh')

接着,对每个文本进行命名实体识别特征构造:

def get_ner_feature(text):
    ner_result = nlp.ner(text)
    ner_dict = dict(ner_result)
    person_count = list(ner_dict.values()).count('PERSON')
    location_count = list(ner_dict.values()).count('LOCATION')
    organization_count = list(ner_dict.values()).count('ORGANIZATION')
    return person_count, location_count, organization_count

news_df['person_count'], news_df['location_count'], news_df['organization_count'] = zip(*news_df['news'].apply(get_ner_feature))

其中,get_ner_feature函数使用了Stanford NER对文本中的命名实体进行识别,并统计了人名、地名、组织机构名的数量。最后,将这些数量作为命名实体识别特征添加到原始数据集中。

三、其他文本特征知识点和案例

除了tf-idf、中文分词、类别特征构造法之外,文本特征还有很多其他的知识点和案例。

  1. N-gram特征

N-gram特征是指将文本按照N个词语为一组进行切分,并将每组词语作为一个特征。常见的N-gram有单个词语的unigram、两个词语的bigram、三个词语的trigram等。N-gram特征可以捕捉到词语之间的关联性,适用于语言模型和文本分类等任务。

下面以sklearn的CountVectorizer为例,构造N-gram特征:

from sklearn.feature_extraction.text import CountVectorizer

ngram_vectorizer = CountVectorizer(ngram_range=(1,3))
ngram_features = ngram_vectorizer.fit_transform(news_df['news'])

其中,ngram_range参数指定了N-gram的范围,这里选择了1到3个词语。ngram_features是一个稀疏矩阵,表示每个文本中每个N-gram的出现次数。

  1. 主题模型特征

主题模型是一种无监督学习方法,可以对文本进行主题分析和聚类。主题模型可以将文本表示为一些主题的组合,每个主题包含了一些词语的概率分布。常见的主题模型有潜在狄利克雷分配(LDA)、隐含语义分析(LSA)等。

下面以sklearn的LatentDirichletAllocation为例,构造主题模型特征:

from sklearn.decomposition import LatentDirichletAllocation

lda = LatentDirichletAllocation(n_components=10, max_iter=50, learning_method='online', learning_offset=50.,
                                random_state=0)
lda_features = lda.fit_transform(tfidf_features)

其中,n_components参数指定了主题的数量,max_iter参数指定了迭代次数,learning_method参数指定了学习方法,这里选择了online方法,learning_offset参数指定了学习率。

lda_features是一个矩阵,表示每个文本对每个主题的概率值。

  1. 单词重要性特征

单词重要性特征是指根据某种规则或算法,对每个单词进行赋权,以反映其在文本中的重要性。常见的单词重要性特征有TextRank、Rake等。

下面以TextRank为例,构造单词重要性特征:

import jieba.analysefrom jieba.analyse.textrank import TextRank

textrank = TextRank()
textrank_features = []
for text in news_df['news']:
    keywords = textrank.extract_tags(text, topK=20, withWeight=True, allowPOS=('ns', 'n', 'vn', 'v'))
    keyword_dict = dict(keywords)
    keyword_list = []
    for word in jieba.cut(text):
        if word in keyword_dict.keys():
            keyword_list.append(keyword_dict[word])
        else:
            keyword_list.append(0)
    textrank_features.append(keyword_list)

其中,extract_tags函数使用了TextRank算法,从文本中提取出权重最高的20个关键词,allowPOS参数指定了需要保留的词性。接着,将每个词语的权重作为单词重要性特征添加到列表中。

textrank_features是一个矩阵,表示每个文本中每个词语的权重值。

总结

本文介绍了文本特征的相关知识,包括tf-idf、中文分词、类别特征构造法等。其中,tf-idf是常用的文本特征提取方法,可以用于文本分类、信息检索、文本聚类等任务;中文分词是对中文文本进行处理的重要步骤,可以提高文本处理的准确性和效率;类别特征构造法可以将离散特征转化为数字特征,便于机器学习算法处理。除此之外,还介绍了N-gram特征、主题模型特征、单词重要性特征等其他文本特征知识点和案例。在实际应用中,根据不同的任务和数据集,可以选择合适的文本特征提取方法和特征构造方法,以提高模型的性能和效果。

参考文献:

  1. Bird, S., Klein, E., & Loper, E. (2009). Natural language processing with Python: analyzing text with the natural language toolkit. O’Reilly Media, Inc.

  2. Manning, C. D., Raghavan, P., & Schütze, H. (2008). Introduction to information retrieval. Cambridge University Press.

  3. Blei, D. M., Ng, A. Y., & Jordan, M. I. (2003). Latent dirichlet allocation. Journal of machine Learning research, 3(Jan), 993-1022.

  4. TextRank算法原理及实现. https://www.cnblogs.com/LittleHann/p/10993659.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄昏中起飞的猫头鹰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值