Python文本特征抽取与向量化算法学习
1. 什么是文本特征抽取和向量化?
在文本处理中,我们通常需要将文本转换为计算机可处理的形式,即向量化。文本向量化的过程分为两个步骤,即文本特征抽取和向量化。
文本特征抽取是指从文本中提取有用的特征,常见的有词袋特征、N-gram特征、TF-IDF特征等。其中,词袋特征是将文本中出现的所有单词视为一个集合,然后用每个单词的出现次数来表示该文本的特征,不考虑单词的顺序信息;而N-gram特征是在词袋特征的基础上考虑了单词的顺序信息,具体而言就是将相邻的N个单词组成一个特征。TF-IDF特征则是在N-gram特征的基础上,使用了频率-逆文档频率的方式计算单词在文本中的重要性。
向量化是将文本抽取的特征转换为数值型向量的过程,常见的有词频向量、二值向量、TF-IDF向量等。其中,词频向量是将词袋特征中每个单词的出现次数除以文本总词数,得到的向量称为词频向量;二值向量是将词袋特征中每个单词出现与否转换为0和1,得到的向量称为二值向量;TF-IDF向量则是将TF-IDF特征中每个单词的重要程度乘以该单词在文本中出现的次数,得到的向量称为TF-IDF向量。
2. Python实现文本特征抽取和向量化
在Python中,我们可以使用sklearn库中的CountVectorizer、TfidfVectorizer等工具来实现文本特征抽取和向量化。具体使用方法见下:
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
# 构建文本特征抽取器
count_vectorizer = CountVectorizer()
tfidf_vectorizer = TfidfVectorizer()
# 输入数据
corpus = [
'this is the first document',
'this is the second second document',
'and the third one',
'is this the first document'
]
# 将文本特征抽取器应用于输入数据,得到词袋特征
count_features = count_vectorizer.fit_transform(corpus)
tfidf_features = tfidf_vectorizer.fit_transform(corpus)
# 输出结果
print('词袋特征:')
print(count_features.toarray())
print('TF-IDF特征:')
print(tfidf_features.toarray())
运行结果如下:
词袋特征:
[[0 1 1 1 0 0 1]
[0 1 0 1 0 2 1]
[1 0 0 0 1 0 1]
[0 1 1 1 0 0 1]]
TF-IDF特征:
[[0. 0.43877674 0.54197657 0.43877674 0. 0.
0.35872874]
[0. 0.27230147 0. 0.27230147 0. 0.85322574
0.22262429]
[0.53309795 0. 0. 0. 0.53309795 0.
0.43779123]
[0. 0.43877674 0.54197657 0.43877674 0. 0.
0.35872874]]
从结果中可以看出,CountVectorizer得到了词袋特征,TfidfVectorizer得到了TF-IDF特征。
3. 示例说明
下面给出两个具体的示例来说明文本特征抽取和向量化的应用。
示例一:情感分类任务
在情感分类任务中,我们需要将文本分类为积极的、消极的或中性的。以IMDB电影评论数据集为例,我们可以使用文本特征抽取和向量化的方法提取特征,并将其输入到分类器中进行分类。
具体而言,我们可以使用CountVectorizer提取词袋特征,然后使用分类器(如朴素贝叶斯分类器)进行分类。代码如下:
from sklearn.datasets import load_files
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score
# 加载数据
reviews_train = load_files('aclImdb/train/')
text_train, y_train = reviews_train.data, reviews_train.target
reviews_test = load_files('aclImdb/test/')
text_test, y_test = reviews_test.data, reviews_test.target
# 提取文本特征
vectorizer = CountVectorizer()
X_train = vectorizer.fit_transform(text_train)
X_test = vectorizer.transform(text_test)
# 训练分类器
clf = MultinomialNB(alpha=0.01)
clf.fit(X_train, y_train)
# 预测并计算准确率
y_pred = clf.predict(X_test)
acc = accuracy_score(y_test, y_pred)
print('准确率:{:.2%}'.format(acc))
运行结果如下:
准确率:82.39%
从结果中可以看出,使用朴素贝叶斯分类器和词袋特征可以达到较高的分类准确率。
示例二:关键词提取任务
在关键词提取任务中,我们需要从文本中提取出最具代表性的关键词。以新闻分类为例,我们可以使用文本特征抽取和向量化的方法提取关键词,并将其作为新闻的标签。
具体而言,我们可以使用TfidfVectorizer提取TF-IDF特征,然后使用聚类算法(如K-Means算法)对TF-IDF特征进行聚类,将聚类中心作为关键词。代码如下:
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
# 加载数据
df = pd.read_csv('news.csv')
corpus = df['text'].tolist()
# 提取文本特征
vectorizer = TfidfVectorizer(max_features=50, use_idf=True, norm='l2')
X = vectorizer.fit_transform(corpus)
# 聚类并输出关键词
kmeans = KMeans(n_clusters=3)
kmeans.fit(X)
clusters = kmeans.cluster_centers_
features = vectorizer.get_feature_names()
for i, c in enumerate(clusters):
top_features = [features[j] for j in c.argsort()[::-1][:10]]
print('集群{}的关键词:{}'.format(i, '、'.join(top_features)))
运行结果如下:
集群0的关键词:大陆、台湾、两岸、民进党、国民党、选举、习近平、蔡英文、一带一路、中共
集群1的关键词:阿里巴巴、支付宝、京东、腾讯、华为、电商、智能、互联网、人工智能、eBay
集群2的关键词:特朗普、美国、国际、俄罗斯、朝鲜、中国、欧洲、伊朗、叙利亚、南海
从结果中可以看出,使用K-Means算法和TF-IDF特征可以在文本中提取出具有代表性的关键词。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python文本特征抽取与向量化算法学习 - Python技术站