当前位置:   article > 正文

文本特征词选择及TF-IDF算法应用_特征词识别

特征词识别

一、特征词选择概述

特征词,通常指的是能够代表文本内容核心意义主题的词汇。它们是文本中最具有代表性、最能够概括文本主旨和内容的词语。文本特征词选择,也称为关键词提取,是自然语言处理(NLP)中的一项重要任务,它的目的是从文本数据中识别出最能代表文本内容的词语。这些特征词能够用于概括主题,为文本分析、信息检索、内容摘要等应用提供基础。

  1. 特征词选择(关键词提取)的原因主要包括:
    降低维度:文本数据通常包含大量的词汇,直接处理这些数据会面临维度灾难。通过提取特征词,可以大幅减少数据的维度,简化模型的复杂度。
    提高效率:在处理大规模文本数据时,通过关注那些最能够代表文本内容的特征词,可以提高数据处理和分析的效率。
    增强理解:特征词有助于快速理解文本的主要内容和主题,对于文本摘要、关键词提取、主题识别等任务尤为重要。
  2. 特征词选择(关键词提取)的应用:
    搜索引擎优化(SEO):特征词选择有助于提取网页内容的关键词,从而优化搜索引擎的检索效果。
    文档分类和聚类:通过提取特征词,可以将文档根据其内容分组,用于新闻聚类、文档归档等。
    文本摘要:选取重要的特征词,辅助生成文本摘要,特别是在非监督学习的情况下。
    情感分析:特征词可以帮助确定文本的情感倾向,比如正面或负面评价。
    用户意图识别:在对话系统和推荐系统中,特征词的提取可以用来识别用户的意图和兴趣点。
  3. 特征词选择(关键词提取)的方法:
  • 基于统计的方法:
    TF-IDF(Term Frequency-Inverse Document Frequency):这种方法计算词语在文档中的频率与在语料库中的反向文件频率的乘积,用于评估词语在一份或多份文档中的重要性。
    词频(Term Frequency):简单地计算词在文档中出现的次数,认为出现次数越多的词越重要。
  • 基于图模型的方法:
    TextRank:类似于Google的PageRank算法,构建一个词语的图模型,通过投票或推荐机制,识别出图中重要性高的节点(词语)。
  • 基于深度学习的方法:
    使用词嵌入(Word Embedding)模型(如Word2Vec或BERT)来识别文本中的上下文相关性,然后选取与核心主题最相关的词。

二、TF-IDF算法原理

2.1 TF(Term Frequency,词频)

词频(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中出现次数
高频词对文本来说重要的原因:
主题标示:文本中出现次数较多的词往往与该文本的主题密切相关。通过识别这些高频词,可以快速了解文本的大致内容或领域。
信息检索:在信息检索系统中,高频词可以作为关键词,帮助改善搜索结果的相关性。搜索引擎会利用这些词来索引和排列文档,以便用户能够找到他们感兴趣的内容。
内容摘要:自动生成文本摘要时,高频词可以指示哪些信息是重要的。摘要算法可能会优先考虑包含高频词的句子,因为这些句子更有可能概括文本的主要信息。
情感分析:在进行情感分析时,特定的高频词可能表达了文本的情感倾向,如积极或消极的评价和情绪。
然而,也值得注意的是,并不是所有高频词都具有同等的信息价值。例如,一些常用词(如“的”,“是”,“在”等)虽然出现频率高,但对于理解文本的主题或情感并没有太大帮助,这些词通常被视为停用词,在文本处理时需要过滤掉。再比如,文章《我的叔叔于勒》,其中“叔叔”、“于勒”这两个词出现的次数一样多,很显然的是,这两个词在这篇文章的价值或者重要性却是不一样的,“叔叔”是很常见的词,并不足以概括这篇文章的主题,相对而言,“于勒”不那么常见,但对这篇文章却是独一无二,是具有价值的,则可以代表这篇文章的主题。

2.2 IDF(Inverse Document Frequency,逆文档频率)

IDF(Inverse Document Frequency,逆文档频率)是一种用于量化词语在文档集合或语料库中的普遍重要性的指标。如果某个词不常见,但是它在这篇文章中多次出现,那么它很可能就反映了这篇文章的特性,也就是这篇文章的关键词。
IDF的计算公式通常为:
I D F ( t ) = log ⁡ ( 语料库中文档的总数 包含词语 t 的文档数量 ) IDF(t) = \log\left(\frac{语料库中文档的总数}{包含词语 t 的文档数量}\right) IDF(t)=log(包含词语t的文档数量语料库中文档的总数)

2.3 TF-IDF

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) TFIDF(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 TFIDF(我的,我的叔叔于勒)=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 TFIDF(叔叔,我的叔叔于勒)=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 TFIDF(于勒,我的叔叔于勒)=TF(于勒,《我的叔叔于勒》)×IDF(于勒)=101×3=0.3

这样计算得到的TF-IDF值,既反映了词在单个文档中的重要性,也考虑了词在整个文档集合中的罕见程度。在这个基础上,得到的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无法赋予合适的权重,可能导致对这些词的重要性评估不准确。

四、TF-IDF算法应用

  1. 使用jieba.analyse模块jieba.analyse.extract_tags提取特征词(extract_tags方法是基于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)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

这个示例代码中,jieba.analyse.extract_tags 方法用于提取关键词,其中topK参数指定返回的关键词数量。设置停用词典后,在关键词提取过程中,这些词将不被考虑。

  1. 用sklearn.feature_extraction.text中的TfidfVectorizer来提取特征词
    Pycharm中在百度镜像安装scikit-learn:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scikit-learn
  • 1

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}")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

读取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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/567133
推荐阅读
相关标签
  

闽ICP备14008679号