词袋模型与TF-IDF模型

特征提取方法有两大主要方式,一种是词袋模型,还有一种就是TF-IDF 模型(term frequency-inverse document frequency,词频与逆向文件频率)

1、词袋模型

1.1 词袋和词集

文本特征提取有两个非常重要的模型
词集模型:单词构成的集合,集合自然每个元素只能有一个,也就是词集中的每个单词都只有一个
词袋模型:在词集的基础上,如果一个单词在文档中出现不止一次,统计其出现的次数。

二者本质上的区别,词袋是在词集的基础上增加了频率的维度,词集只关注有和没有,而词袋还关注出现了多少次。

1.2 实践

现在我们来进行词袋模型的实践:

首先来导入相关的函数库:

import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer

导入数据

data = pd.read_csv("./dataset/Movies_dirty.csv")
data['Movie description'] = data.iloc[:,1]+' '+data.iloc[:,-1]#合并两列数据

这里我使用的是movie的数据集,包括movie的name,director,year,…,description属性,只使用name和description两个属性,并对这两列数据进行合并。如果找不到相关数据也可以随便用一个简单的数据集来实验。

corpus = []
for i in data['Movie description']:
    corpus.append(i)

在这里插入图片描述

将数据放到列表中,显示部分,两个逗号之间表示一条数据。

词袋模型:

vectorizer = CountVectorizer(min_df=1)
X = vectorizer.fit_transform(corpus)
feature_names = vectorizer.get_feature_names_out()
# print(feature_names,len(feature_names))
X_feature = X.toarray()
print(X_feature,len(X_feature))
print(data.shape)

在这里插入图片描述

完整代码:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.feature_extraction.text import CountVectorizer

data = pd.read_csv("./dataset/Movies_dirty.csv")
data['Movie description'] = data.iloc[:,1]+' '+data.iloc[:,-1]
corpus = []
for i in data['Movie description']:
    corpus.append(i)
print(corpus)
vectorizer = CountVectorizer(min_df=1)
X = vectorizer.fit_transform(corpus)
feature_names = vectorizer.get_feature_names_out()
# print(feature_names,len(feature_names))
X_feature = X.toarray()
print(X_feature,len(X_feature))
print(data.shape)

2、TF-IDF

2.1 TF-IDF描述

TF-IDF是一种统计方法,用以评估某一字词对于一个文件集成或一个语料库的重要程度。
字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在预料库中出现的频率成反比下降。
TF-IDF加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或者评级。

TF-IDF的主要思想:
如果某个词或短语在一篇文章中出现的频率TF(Term Frequency,词频),词频高,并且在其他文章中很少出现,
则认为此词或者短语具有很好的类别区分能力,适合用来分类。

TF-IDF 实际上就是:TF*IDF。
TF表示词条在文档中出现的频率,IDF(inverter document frequency,逆向文件频率)的主要思想就是:如果包含词条t的文档越少,也就是n越少,IDF越大,则说明词条t具有很好的类别区分能力。

如果某一类文档C中包含词条t的文档数为m,而其他类包含t的文档总数为k,显然所有包含t的文档数为n = m+k,当m大的时候,n也大,按照IDF公式得到的IDF的值会小,就说明该 词条t类别区分能力不强。但实际上,如果一个词条在一个类的文档中频繁出现,则说明该词条能够很好的代表这个类的文本的特征,这样的词条应该赋予较高的权重,并选来作为该类文本的特征词以区别于其他类文档。

2.2 实践

在sklearn中实现了TF-IDF算法,实例化TfidfTransformer即可。

导入相关库

from sklearn.feature_extraction.text import TfidfTransformer
transformer = TfidfTransformer(smooth_idf=False)
tfidf = transformer.fit_transform(X_feature).toarray()
print(tfidf,len(tfidf),len(tfidf[0]))

TF-IDF模型通常和词袋模型配合使用,对词袋模型生成的数组进一步处理。
在这里插入图片描述

最后附上完整代码,及词袋模型和TF-IDF模型的结合,输出特征:

"""
将movie的name和description合并
利用词袋模型和TF-IDF进行特征化

"""
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.feature_extraction.text import CountVectorizer,TfidfTransformer

data = pd.read_csv("./dataset/Movies_dirty.csv")
data['Movie description'] = data.iloc[:,1]+' '+data.iloc[:,-1]
corpus = []
for i in data['Movie description']:
    corpus.append(i)
# print(corpus)
vectorizer = CountVectorizer(min_df=1)
transformer = TfidfTransformer(smooth_idf=False)
X = vectorizer.fit_transform(corpus)
feature_names = vectorizer.get_feature_names_out()
# print(feature_names,len(feature_names))
X_feature = X.toarray()
tfidf = transformer.fit_transform(X_feature).toarray()
print(X_feature,len(X_feature))
# print(data.shape)
print(tfidf,len(tfidf),len(tfidf[0]))

本次的学习就到这里啦,希望小张的这篇博文能够帮助到需要的小伙伴!!

Guess you like

Origin blog.csdn.net/baidu_41797613/article/details/121268152