前言
TF-IDF(Term Frequency-Inverse Document Frequency)是一种在信息检索和文本挖掘中常用的文本表示方法。它用于评估一个词对于一个文档集或语料库中某个特定文档的重要性。
TF(词频)衡量一个词在文档中出现的频率,而IDF(逆文档频率)衡量一个词的稀有程度。TF-IDF 的主要思想是,如果一个词在特定文档中经常出现,但在整个文档集合中并不常见,那么这个词对于该文档的重要性就很高。
TF-IDF 的计算公式如下:
TF-IDF(t,d,D)= TF(t,d)*IDF(t,D)
其中:
TF ( t, d )表示词项 t在文档 d中的词频(Term Frequency)。
IDF( t,D )表示词项 t的逆文档频率(Inverse Document Frequency),它可以通过以下公式计算:
IDF( t,D )=log(N/DF(t,d))
其中:
N是文档集合中文档的总数。
DF(t,d)是包含词项 t 的文档数目。
TF-IDF 值越高,表示词对于文档的重要性越高。在实际应用中,通常会对 TF-IDF 进行归一化,以防止文档长度的差异导致的偏差。
TF-IDF 主要用于信息检索、文本挖掘、文本相似度计算等任务,它能够帮助识别文档中重要的关键词,并在检索中提高相关性。
TF-IDF流程通常包括以下步骤:
文本 预 处 理: 包括分词和去停用词。
构建词频矩阵 : 计算每个文档中每个词的词频。
计算逆文档频率:计算每个词的逆文档频率。 计算TF-IDF值:将词频矩阵中的词频和逆文档频率相乘,得到TF-IDF矩阵。
其中分词和去停用词是在自然语言处理中文本预处理的两个重要步骤。这些步骤有助于提取文本中的有意义信息并减少噪音。以下是这两个步骤的简要说明:
1. 分词(Tokenization):
分词是将连续的文本切分成一个个有意义的单元,通常是词(word)。分词有助于理解文本的语义结构。中文和英文的分词方式有所不同。
中文分词:
- 对于中文文本,常用的分词工具有jieba、pkuseg等。例如,对于句子"我喜欢自然语言处理",中文分词后可能得到"我 喜欢 自然语言处理"。
英文分词:
- 对于英文文本,可以使用空格进行分词。例如,对于句子"I love natural language processing",英文分词后可能得到"I love natural language processing"。
2. 去停用词(Removing Stop Words):
停用词是指在文本中频繁出现但通常缺乏实际含义的词语,例如"的"、"是"、"在"等。在文本分析中,通常会去除这些停用词,以便突出文本中更重要的信息。
中文停用词:
- 中文停用词可以包括常用的虚词、介词等。例如:"的"、"是"、"在"等。
英文停用词:
- 英文停用词包括常见的连接词、代词等。例如:"the"、"is"、"in"等。
代码实现
import pandas as pd
data = pd.read_csv('中文外卖评论数据集.csv')
print(data.shape) # 打印数据集的形状
print(data.isnull().sum()) # 打印每列的缺失值数量
print(data.duplicated().sum()) # 打印重复的行数
data.head()
字段名称 | 字段类型 | 字段说明 |
Comment | 字符型 | 评论内容 |
Class | 数值型 | 评论类别 |
数据集为某电商平台上针对某款手机的评论,共两个字段,8186条数据。对评论进行分词、去停用词等数据清洗,最后采用TF-IDF算法构建词向量。
#加载停用词
def stopwordslist(filepath):
stopwords = [line.strip() for line in open(filepath, 'r', encoding='utf-8').readlines()]
return stopwords
stopwords = stopwordslist('哈工大中文停用词.txt')
读取指定文件中的中文停用词,并将这些停用词存储在名为
stopwords
的变量中,以供后续在自然语言处理任务中使用。停用词通常是在文本处理过程中被过滤掉的常见词语,因为它们通常不包含太多有用的信息。
import jieba
# 定义数据清洗函数
def data_cleaning(content_list):
# 初始化清洗后的文本列表
content_seg = []
# 初始化特殊字符、标点、数字、字母等,这些字符将被替换为空格
symbols = '-\\n~%≥℃|/?``【oaicite:0】``?↓#~_「♂!?\',、:;。《》()()·—.…,0123456789abcdefghijklnmopqrstuvwxyz'
# 循环处理输入的文本列表
for content in content_list:
# 去除特殊字符,将特殊字符替换为空格
for con in content:
if con in symbols:
content = content.replace(con, ' ')
# 使用结巴分词进行分词,cut_all=False表示采用精确模式
con_list = jieba.cut(content, cut_all=False)
result_list = []
# 去除停用词,\n、\u3000(全角空格)、空格也会被去除
for con in con_list:
if con not in stopwords and con != '\n' and con != '\u3000' and con != ' ':
result_list.append(con)
# 将分词后的结果用空格连接成字符串,存储到content_seg列表中
str1 = ' '.join(result_list)
content_seg.append(str1)
return content_seg
代码定义了一个名为
data_cleaning
的函数,用于对输入的文本列表进行清洗。清洗过程包括替换特殊字符为空格,中文分词(使用jieba库),过滤停用词、换行符、全角空格和空格,最终返回经过清洗后的文本列表。
#将评论转换为列表
contents = data['Comment'].tolist()
df = data_cleaning(contents)
data['分词去停用词结果'] = df
data.head()
from sklearn.feature_extraction.text import TfidfVectorizer
tfdif = TfidfVectorizer(stop_words=None, max_features=3000, min_df=2 ,analyzer='word')
t = tfdif.fit_transform(data['分词去停用词结果']) # 稀疏矩阵
t_weight = t.toarray() # 稠密矩阵
print(t_weight)
print(t.shape)
利用scikit-learn中的
TfidfVectorizer
将经过分词和去停用词处理的文本数据转化为TF-IDF特征矩阵。
TfidfVectorizer
是 scikit-learn 中用于将文本数据转换为 TF-IDF 特征矩阵的工具。以下是一些常用的参数以及它们的作用:
stop_words
:
- 作用: 用于指定停用词的集合,即那些在文本中频繁出现但通常不携带太多信息的词语。
- 默认值:
None
,表示不使用停用词。
max_features
:
- 作用: 限制特征的最大数量,只考虑按照词频降序排列的前 N 个特征。
- 默认值:
None
,表示不限制特征数量。
min_df
:
- 作用: 限制一个词语在文档中出现的最小次数,低于这个频次的词语将被忽略。
- 默认值:
1
,表示不忽略任何词语。
analyzer
:
- 作用: 指定特征生成的方式,可以选择'word'表示以词语为单位生成特征,或者'char'表示以字符为单位生成特征。
- 默认值:
'word'
。
ngram_range
:
- 作用: 指定生成的特征是单个词语还是多个词语的组合。例如,
ngram_range=(1, 2)
表示生成包含一个词和包含两个相邻词的特征。 - 默认值:
(1, 1)
,表示只生成包含一个词的特征。
use_idf
:
- 作用: 是否使用逆文档频率(IDF)来调整词语的权重。
- 默认值:
True
。
smooth_idf
:
- 作用: 是否对逆文档频率(IDF)进行平滑处理,防止分母为零的情况。
- 默认值:
True
。
sublinear_tf
:
- 作用: 是否使用子线性缩放 TF。
- 默认值:
False
。
这些参数可以根据具体的文本数据和任务需求进行调整,以获得更好的特征表示。在使用时,可以根据实际情况进行调优,观察模型性能的变化。