赞
踩
特征词,通常指的是能够代表文本内容核心意义和主题的词汇。它们是文本中最具有代表性、最能够概括文本主旨和内容的词语。文本特征词选择,也称为关键词提取,是自然语言处理(NLP)中的一项重要任务,它的目的是从文本数据中识别出最能代表文本内容的词语。这些特征词能够用于概括主题,为文本分析、信息检索、内容摘要等应用提供基础。
词频(Term Frequency, TF)指的是某个词在文本中出现的次数。这个概念基于一个直观的假设:一个词在文本中出现次数越多,就越能反映该文本的主题或内容。
词频的计算公式为:
T
F
(
t
,
d
)
=
词t在文档d中出现次数
文档d的总词数
TF(t,d) = \frac{\text{词t在文档d中出现次数}}{\text{文档d的总词数}}
TF(t,d)=文档d的总词数词t在文档d中出现次数
高频词对文本来说重要的原因:
主题标示:文本中出现次数较多的词往往与该文本的主题密切相关。通过识别这些高频词,可以快速了解文本的大致内容或领域。
信息检索:在信息检索系统中,高频词可以作为关键词,帮助改善搜索结果的相关性。搜索引擎会利用这些词来索引和排列文档,以便用户能够找到他们感兴趣的内容。
内容摘要:自动生成文本摘要时,高频词可以指示哪些信息是重要的。摘要算法可能会优先考虑包含高频词的句子,因为这些句子更有可能概括文本的主要信息。
情感分析:在进行情感分析时,特定的高频词可能表达了文本的情感倾向,如积极或消极的评价和情绪。
然而,也值得注意的是,并不是所有高频词都具有同等的信息价值。例如,一些常用词(如“的”,“是”,“在”等)虽然出现频率高,但对于理解文本的主题或情感并没有太大帮助,这些词通常被视为停用词,在文本处理时需要过滤掉。再比如,文章《我的叔叔于勒》,其中“叔叔”、“于勒”这两个词出现的次数一样多,很显然的是,这两个词在这篇文章的价值或者重要性却是不一样的,“叔叔”是很常见的词,并不足以概括这篇文章的主题,相对而言,“于勒”不那么常见,但对这篇文章却是独一无二,是具有价值的,则可以代表这篇文章的主题。
IDF(Inverse Document Frequency,逆文档频率)是一种用于量化词语在文档集合或语料库中的普遍重要性的指标。如果某个词不常见,但是它在这篇文章中多次出现,那么它很可能就反映了这篇文章的特性,也就是这篇文章的关键词。
IDF的计算公式通常为:
I
D
F
(
t
)
=
log
(
语料库中文档的总数
包含词语
t
的文档数量
)
IDF(t) = \log\left(\frac{语料库中文档的总数}{包含词语 t 的文档数量}\right)
IDF(t)=log(包含词语t的文档数量语料库中文档的总数)
TF-IDF值是通过将词频(TF)和逆文档频率(IDF)结合起来计算得到的。这个值用于反映一个词对于一个文档集合中的某一文档的重要程度。
T
F
−
I
D
F
(
t
,
d
)
=
T
F
(
t
,
d
)
×
I
D
F
(
t
)
TF-IDF(t,d)=TF(t,d)×IDF(t)
TF−IDF(t,d)=TF(t,d)×IDF(t)
其中:
T
F
(
t
,
d
)
是词
t
在文档
d
中的词频。
I
D
F
(
t
)
是词
t
的逆文档频率。
其中: TF(t,d) 是词 t 在文档 d 中的词频。 IDF(t) 是词 t 的逆文档频率。
其中:TF(t,d)是词t在文档d中的词频。IDF(t)是词t的逆文档频率。
举个例子:
以文章《我的叔叔于勒》为例,假设语料库中文档总数为10000,包含“我的”的文档数量为1000,包含“叔叔”的文档数量为100,包含“于勒”的文档数量为10,文章《我的叔叔于勒》总词数为300个,其中“叔叔”、“于勒”在文章中出现的次数均为30次,“我的”在文章中出现的次数为50次。那么:
“我的”在文章《我的叔叔于勒》的TF-IDF值为:
T
F
(
我的
,
我的叔叔于勒
)
=
词“我的”在文档《我的叔叔于勒》中出现次数
文档《我的叔叔于勒》的总词数
=
50
300
=
1
6
TF(我的,我的叔叔于勒) = \frac{\text{词“我的”在文档《我的叔叔于勒》中出现次数}}{\text{文档《我的叔叔于勒》的总词数}}=\frac{\text{50}}{\text{300}}=\frac{\text{1}}{\text{6}}
TF(我的,我的叔叔于勒)=文档《我的叔叔于勒》的总词数词“我的”在文档《我的叔叔于勒》中出现次数=30050=61
I
D
F
(
我的
)
=
log
(
语料库中文档的总数
包含词语“我的”的文档数量
)
=
log
(
10000
1000
)
=
1
IDF(我的) = \log\left(\frac{语料库中文档的总数}{包含词语“我的” 的文档数量}\right) =\log\left(\frac{10000}{1000}\right)=1
IDF(我的)=log(包含词语“我的”的文档数量语料库中文档的总数)=log(100010000)=1
T
F
−
I
D
F
(
我的
,
我的叔叔于勒
)
=
T
F
(
“我的”
,
《我的叔叔于勒》
)
×
I
D
F
(
我的
)
=
1
6
×
1
=
0.17
TF-IDF(我的,我的叔叔于勒)=TF(“我的”,《我的叔叔于勒》)×IDF(我的)=\frac{\text{1}}{\text{6}}×1=0.17
TF−IDF(我的,我的叔叔于勒)=TF(“我的”,《我的叔叔于勒》)×IDF(我的)=61×1=0.17
“叔叔”在文章《我的叔叔于勒》的TF-IDF值为:
T
F
(
叔叔
,
我的叔叔于勒
)
=
词“叔叔”在文档《我的叔叔于勒》中出现次数
文档《我的叔叔于勒》的总词数
=
30
300
=
1
10
TF(叔叔,我的叔叔于勒) = \frac{\text{词“叔叔”在文档《我的叔叔于勒》中出现次数}}{\text{文档《我的叔叔于勒》的总词数}}=\frac{\text{30}}{\text{300}}=\frac{\text{1}}{\text{10}}
TF(叔叔,我的叔叔于勒)=文档《我的叔叔于勒》的总词数词“叔叔”在文档《我的叔叔于勒》中出现次数=30030=101
I
D
F
(
叔叔
)
=
log
(
语料库中文档的总数
包含词语“叔叔”的文档数量
)
=
log
(
10000
100
)
=
2
IDF(叔叔) = \log\left(\frac{语料库中文档的总数}{包含词语“叔叔” 的文档数量}\right) =\log\left(\frac{10000}{100}\right)=2
IDF(叔叔)=log(包含词语“叔叔”的文档数量语料库中文档的总数)=log(10010000)=2
T
F
−
I
D
F
(
叔叔
,
我的叔叔于勒
)
=
T
F
(
“叔叔”
,
《我的叔叔于勒》
)
×
I
D
F
(
叔叔
)
=
1
10
×
2
=
0.2
TF-IDF(叔叔,我的叔叔于勒)=TF(“叔叔”,《我的叔叔于勒》)×IDF(叔叔)=\frac{\text{1}}{\text{10}}×2=0.2
TF−IDF(叔叔,我的叔叔于勒)=TF(“叔叔”,《我的叔叔于勒》)×IDF(叔叔)=101×2=0.2
“于勒”在文章《我的叔叔于勒》的TF-IDF值为:
T
F
(
于勒
,
我的叔叔于勒
)
=
词“于勒”在文档《我的叔叔于勒》中出现次数
文档《我的叔叔于勒》的总词数
=
30
300
=
1
10
TF(于勒,我的叔叔于勒) = \frac{\text{词“于勒”在文档《我的叔叔于勒》中出现次数}}{\text{文档《我的叔叔于勒》的总词数}}=\frac{\text{30}}{\text{300}}=\frac{\text{1}}{\text{10}}
TF(于勒,我的叔叔于勒)=文档《我的叔叔于勒》的总词数词“于勒”在文档《我的叔叔于勒》中出现次数=30030=101
I
D
F
(
于勒
)
=
log
(
语料库中文档的总数
包含词语“于勒”的文档数量
)
=
log
(
10000
10
)
=
3
IDF(于勒) = \log\left(\frac{语料库中文档的总数}{包含词语“于勒” 的文档数量}\right) =\log\left(\frac{10000}{10}\right)=3
IDF(于勒)=log(包含词语“于勒”的文档数量语料库中文档的总数)=log(1010000)=3
T
F
−
I
D
F
(
于勒
,
我的叔叔于勒
)
=
T
F
(
“于勒”
,
《我的叔叔于勒》
)
×
I
D
F
(
于勒
)
=
1
10
×
3
=
0.3
TF-IDF(于勒,我的叔叔于勒)=TF(“于勒”,《我的叔叔于勒》)×IDF(于勒)=\frac{\text{1}}{\text{10}}×3=0.3
TF−IDF(于勒,我的叔叔于勒)=TF(“于勒”,《我的叔叔于勒》)×IDF(于勒)=101×3=0.3
这样计算得到的TF-IDF值,既反映了词在单个文档中的重要性,也考虑了词在整个文档集合中的罕见程度。在这个基础上,得到的TF-IDF值越高,词对于文档的重要性就越大。这是因为它不仅在该文档中频繁出现,而且在其他文档中不那么常见。相反,如果一个词在文档集合中普遍出现,它的TF-IDF值会比较低,表明这个词对于特定文档的区分度不高。
TF-IDF是一个在文本挖掘和信息检索领域广泛使用的技术,蛤它有着明显的优点和一些潜在的缺点:
优点:
反映词的重要性:TF-IDF通过词频和逆文档频率的组合,能够量化词在特定文档中的重要性,而非整个语料库中的普遍性。
区分文档特征:TF-IDF对于区分文档内容非常有效,可以作为特征向量的权重,在文档分类、聚类以及其他机器学习任务中提供良好的基线结果。
自动过滤停用词:由于停用词在所有文档中普遍出现,其IDF值会很低,TF-IDF能自然地降低这些词的权重。
缺点:
忽视词序和语义:TF-IDF只关注词的频率,而不考虑词在文本中的位置、上下文和词序,这限制了它在捕获语言的复杂性方面的能力。
无法处理同义词和多义词:不同的词可能具有相同的意思,同一个词在不同的上下文中可能有不同的意思,TF-IDF无法区分这些差异。
需大量文档:为了有效计算IDF部分,TF-IDF需要足够多的文档来估计词的普遍性。在文档数量较少的数据集上,IDF的效果会受限。
不能识别新词:对于在训练集中未出现过的词,TF-IDF无法赋予合适的权重,可能导致对这些词的重要性评估不准确。
import jieba.analyse import pandas as pd # 设置停用词典的路径 stop_words_path = r"stopwords.txt" # 使用set_stop_words方法设置停用词典 jieba.analyse.set_stop_words(stop_words_path) # 接下来进行关键词提取,停用词典中的词将不会被包括在内 text = "自然语言处理是人工智能领域中的一项非常重要的技术。" keywords = jieba.analyse.extract_tags(text, topK=5, withWeight=True) print(keywords) # 文本数据替换为EXCEL表中“评论内容”列 # 加载EXCEL表 file_path = r"douban_comments.xlsx" df = pd.read_excel(file_path) # 自定义函数:对评论内容进行分词,并提取关键词 def extract_keywords(content): keywords = jieba.analyse.extract_tags(content, topK=5, withWeight=False) # 提取前5个关键词 return ' '.join(keywords) # 应用函数,提取每条评论的关键词 df['关键词'] = df['评论内容'].apply(extract_keywords) # 查看结果 print(df[['评论内容', '关键词']].head()) # 保存结果 output_path = r"douban_comments_processed.xlsx" df.to_excel(output_path, index=False)
这个示例代码中,jieba.analyse.extract_tags 方法用于提取关键词,其中topK参数指定返回的关键词数量。设置停用词典后,在关键词提取过程中,这些词将不被考虑。
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scikit-learn
TF-IDF算法示例代码:
from sklearn.feature_extraction.text import TfidfVectorizer import jieba # 示例文本数据 texts = [ "自然语言处理是人工智能领域中的一项非常重要的技术。", "深度学习在图像处理领域取得了巨大的成功。", "支持向量机是一种强大的分类算法。" ] # 使用jieba进行中文分词 texts_cut = [" ".join(jieba.cut(text)) for text in texts] # 创建TF-IDF转换器 vectorizer = TfidfVectorizer() # 转换文本数据为TF-IDF特征 tfidf_matrix = vectorizer.fit_transform(texts_cut) # 查看TF-IDF矩阵 # print(tfidf_matrix.toarray()) # 将TF-IDF矩阵转换为数组格式,打印出来 tfidf_array = tfidf_matrix.toarray() # 获取特征词列表 feature_names = vectorizer.get_feature_names() print(feature_names) # 输出每个文本的特征词的TF-IDF for i in range(len(texts)): print(f"文本{i+1}的特征词的TF-IDF:") feature_index = tfidf_matrix[i,:].nonzero()[1] # 获取 TF-IDF 矩阵中第 i 行中非零元素的列索引 tfidf_scores = zip(feature_index, [tfidf_matrix[i, x] for x in feature_index]) # 将 feature_index 和计算得到的 TF-IDF 值列表进行配对 # 获得每个非零词语的索引和对应的 TF-IDF 值 for w, s in [(feature_names[i], s) for (i, s) in tfidf_scores]: #逐个获取每个非零词语的词语和对应的 TF-IDF 值 print(w, s) # 选择每个文本的前5个关键词 for i in range(len(texts)): tfidf_scores = list(zip(feature_names, tfidf_matrix.toarray()[i])) tfidf_scores.sort(key=lambda x: x[1], reverse=True) top5 = tfidf_scores[:9] keywords = [word for word, _ in top5] print(f"文本{i+1}的前5个关键词:{keywords}")
读取EXCEL表文本数据,提取特征词,完整代码:
import pandas as pd import jieba from sklearn.feature_extraction.text import TfidfVectorizer # 读取Excel文件 df = pd.read_excel(r"douban_comments.xlsx") # 获取评论内容列 comments = df['评论内容'].tolist() # 对评论内容进行分词并计算TF-IDF值 tokenized_comments = [' '.join(jieba.cut(comment)) for comment in comments] vectorizer = TfidfVectorizer() X = vectorizer.fit_transform(tokenized_comments) # 获取特征词列表 feature_names = vectorizer.get_feature_names() # 计算每个文档中特征词的TF-IDF,并提取前5个关键词 tfidf_result = [] for i in range(len(comments)): tfidf_scores = list(zip(feature_names, X.toarray()[i])) tfidf_scores = [(word, tfidf) for word, tfidf in tfidf_scores if tfidf != 0] tfidf_scores.sort(key=lambda x: x[1], reverse=True) top5_keywords = [word for word, _ in tfidf_scores[:5]] keyword_tfidf = [f"{word}:{tfidf:.2f}" for word, tfidf in tfidf_scores] tfidf_result.append({ 'TF-IDF结果': ', '.join(keyword_tfidf), '前5个关键词': ', '.join(top5_keywords) }) # 将结果存入DataFrame result_df = pd.DataFrame(tfidf_result) # 将结果写入Excel文档 df['TF-IDF结果'] = result_df['TF-IDF结果'] df['前5个关键词'] = result_df['前5个关键词'] # 输出到Excel表 df.to_excel(r"douban_comments_processed.xlsx", index=False)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。