TF-IDF算法介绍及实现

目录

1、TF-IDF算法介绍

(1)TF是词频(Term Frequency)

(2) IDF是逆向文件频率(Inverse Document Frequency)

(3)TF-IDF实际上是:TF * IDF

2、TF-IDF应用

3、Python3实现TF-IDF算法

4、NLTK实现TF-IDF算法

5、Sklearn实现TF-IDF算法

6、Jieba实现TF-IDF算法

7、TF-IDF算法的不足

8、TF-IDF算法改进——TF-IWF算法


1、TF-IDF算法介绍

       TF-IDF(term frequency–inverse document frequency,词频-逆向文件频率)是一种用于信息检索(information retrieval)与文本挖掘(text mining)的常用加权技术

       TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。

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

(1)TF是词频(Term Frequency)

        词频(TF)表示词条(关键字)在文本中出现的频率

        这个数字通常会被归一化(一般是词频除以文章总词数), 以防止它偏向长的文件。

        公式:           即:

        其中 ni,j 是该词在文件 dj 中出现的次数,分母则是文件 dj 中所有词汇出现的次数总和;

(2) IDF是逆向文件频率(Inverse Document Frequency)

        逆向文件频率 (IDF) :某一特定词语的IDF,可以由总文件数目除以包含该词语的文件的数目再将得到的商取对数得到

如果包含词条t的文档越少, IDF越大,则说明词条具有很好的类别区分能力。

        公式:         

        其中,|D| 是语料库中的文件总数 |{j:ti∈dj}| 表示包含词语 ti 的文件数目(即 ni,j≠0 的文件数目)。如果该词语不在语料库中,就会导致分母为零,因此一般情况下使用 1+|{j:ti∈dj}|

        即:

(3)TF-IDF实际上是:TF * IDF

       某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。

       公式:

     

       注:  TF-IDF算法非常容易理解,并且很容易实现,但是其简单结构并没有考虑词语的语义信息,无法处理一词多义与一义多词的情况。

2、TF-IDF应用

     (1)搜索引擎;(2)关键词提取;(3)文本相似性;(4)文本摘要

3、Python3实现TF-IDF算法

注意:该代码tf计算使用的是整个语料,这里只是举个简单的例子,大家在写的时候按文档计算词频即可!我这里就不做修改了

# -*- coding: utf-8 -*-
from collections import defaultdict
import math
import operator

"""
函数说明:创建数据样本
Returns:
    dataset - 实验样本切分的词条
    classVec - 类别标签向量
"""
def loadDataSet():
    dataset = [ ['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],    # 切分的词条
                   ['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],
                   ['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],
                   ['stop', 'posting', 'stupid', 'worthless', 'garbage'],
                   ['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],
                   ['quit', 'buying', 'worthless', 'dog', 'food', 'stupid'] ]
    classVec = [0, 1, 0, 1, 0, 1]  # 类别标签向量,1代表好,0代表不好
    return dataset, classVec


"""
函数说明:特征选择TF-IDF算法
Parameters:
     list_words:词列表
Returns:
     dict_feature_select:特征选择词字典
"""
def feature_select(list_words):
    #总词频统计
    doc_frequency=defaultdict(int)
    for word_list in list_words:
        for i in word_list:
            doc_frequency[i]+=1

    #计算每个词的TF值
    word_tf={}  #存储没个词的tf值
    for i in doc_frequency:
        word_tf[i]=doc_frequency[i]/sum(doc_frequency.values())

    #计算每个词的IDF值
    doc_num=len(list_words)
    word_idf={} #存储每个词的idf值
    word_doc=defaultdict(int) #存储包含该词的文档数
    for i in doc_frequency:
        for j in list_words:
            if i in j:
                word_doc[i]+=1
    for i in doc_frequency:
        word_idf[i]=math.log(doc_num/(word_doc[i]+1))

    #计算每个词的TF*IDF的值
    word_tf_idf={}
    for i in doc_frequency:
        word_tf_idf[i]=word_tf[i]*word_idf[i]

    # 对字典按值由大到小排序
    dict_feature_select=sorted(word_tf_idf.items(),key=operator.itemgetter(1),reverse=True)
    return dict_feature_select

if __name__=='__main__':
    data_list,label_list=loadDataSet() #加载数据
    features=feature_select(data_list) #所有词的TF-IDF值
    print(features)
    print(len(features))

运行结果:

4、NLTK实现TF-IDF算法

from nltk.text import TextCollection
from nltk.tokenize import word_tokenize

#首先,构建语料库corpus
sents=['this is sentence one','this is sentence two','this is sentence three']
sents=[word_tokenize(sent) for sent in sents] #对每个句子进行分词
print(sents)  #输出分词后的结果
corpus=TextCollection(sents)  #构建语料库
print(corpus)  #输出语料库

#计算语料库中"one"的tf值
tf=corpus.tf('one',corpus)    # 1/12
print(tf)

#计算语料库中"one"的idf值
idf=corpus.idf('one')      #log(3/1)
print(idf)

#计算语料库中"one"的tf-idf值
tf_idf=corpus.tf_idf('one',corpus)
print(tf_idf)

运行结果:

5、Sklearn实现TF-IDF算法

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer

x_train = ['TF-IDF 主要 思想 是','算法 一个 重要 特点 可以 脱离 语料库 背景',
           '如果 一个 网页 被 很多 其他 网页 链接 说明 网页 重要']
x_test=['原始 文本 进行 标记','主要 思想']

#该类会将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频
vectorizer = CountVectorizer(max_features=10)
#该类会统计每个词语的tf-idf权值
tf_idf_transformer = TfidfTransformer()
#将文本转为词频矩阵并计算tf-idf
tf_idf = tf_idf_transformer.fit_transform(vectorizer.fit_transform(x_train))
#将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重
x_train_weight = tf_idf.toarray()

#对测试集进行tf-idf权重计算
tf_idf = tf_idf_transformer.transform(vectorizer.transform(x_test))
x_test_weight = tf_idf.toarray()  # 测试集TF-IDF权重矩阵

print('输出x_train文本向量:')
print(x_train_weight)
print('输出x_test文本向量:')
print(x_test_weight)

运行结果:

6、Jieba实现TF-IDF算法

import jieba.analyse

text='关键词是能够表达文档中心内容的词语,常用于计算机系统标引论文内容特征、
信息检索、系统汇集以供读者检阅。关键词提取是文本挖掘领域的一个分支,是文本检索、
文档比较、摘要生成、文档分类和聚类等文本挖掘研究的基础性工作'

keywords=jieba.analyse.extract_tags(text, topK=5, withWeight=False, allowPOS=())
print(keywords)

运行结果:

注:

  • jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
  • sentence 为待提取的文本
  • topK 为返回几个 TF/IDF 权重最大的关键词,默认值为 20
  • withWeight 为是否一并返回关键词权重值,默认值为 False
  • allowPOS 仅包括指定词性的词,默认值为空,即不筛选

7、TF-IDF算法的不足

TF-IDF 采用文本逆频率 IDF 对 TF 值加权取权值大的作为关键词,但 IDF 的简单结构并不能有效地反映单词的重要程度和特征词的分布情况,使其无法很好地完成对权值调整的功能,所以 TF-IDF 算法的精度并不是很高,尤其是当文本集已经分类的情况下。

在本质上 IDF 是一种试图抑制噪音的加权,并且单纯地认为文本频率小的单词就越重要,文本频率大的单词就越无用。这对于大部分文本信息,并不是完全正确的。IDF 的简单结构并不能使提取的关键词, 十分有效地反映单词的重要程度和特征词的分布情 况,使其无法很好地完成对权值调整的功能。尤其是在同类语料库中,这一方法有很大弊端,往往一些同类文本的关键词被盖。

TF-IDF算法实现简单快速,但是仍有许多不足之处:

(1)没有考虑特征词的位置因素对文本的区分度,词条出现在文档的不同位置时,对区分度的贡献大小是不一样的。

(2)按照传统TF-IDF,往往一些生僻词的IDF(反文档频率)会比较高、因此这些生僻词常会被误认为是文档关键词。

(3)传统TF-IDF中的IDF部分只考虑了特征词与它出现的文本数之间的关系,而忽略了特征项在一个类别中不同的类别间的分布情况。

(4)对于文档中出现次数较少的重要人名、地名信息提取效果不佳。

8、TF-IDF算法改进——TF-IWF算法

详细改进方法参看论文:改进的 TF-IDF 关键词提取方法

 

本人博文NLP学习内容目录:

一、NLP基础学习

1、NLP学习路线总结

2、TF-IDF算法介绍及实现

3、NLTK使用方法总结

4、英文自然语言预处理方法总结及实现

5、中文自然语言预处理方法总结及实现

6、NLP常见语言模型总结

7、NLP数据增强方法总结及实现

8、TextRank算法介绍及实现

9、NLP关键词提取方法总结及实现

10、NLP词向量和句向量方法总结及实现

11、NLP句子相似性方法总结及实现

12、NLP中文句法分析

二、NLP项目实战

1、项目实战-英文文本分类-电影评论情感判别

2、项目实战-中文文本分类-商品评论情感判别

3、项目实战-XGBoost与LightGBM文本分类

4、项目实战-TextCNN文本分类实战

5、项目实战-Bert文本分类实战

6、项目实战-NLP中文句子类型判别和分类实战

交流学习资料共享欢迎入QQ群:955817470

  • 374
    点赞
  • 2224
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 48
    评论
<h3>回答1:</h3><br/>TF-IDF算法是一种常用的文本处理算法,可以用于计算文本中每个单词的重要程度。在Python中,可以使用scikit-learn库来实现TF-IDF算法。为了改进TF-IDF算法的效果,可以考虑以下几点: 1. 去除停用词:停用词是指在文本中频繁出现但没有实际意义的词语,如“的”、“是”等。在TF-IDF算法中,去除停用词可以减少噪声,提高算法的准确性。 2. 调整权重:TF-IDF算法中,词频和逆文档频率的权重默认是相等的,但实际上不同的文本可能需要不同的权重。可以通过调整权重来提高算法的效果。 3. 使用n-gram模型:n-gram模型是指将文本中的词语按照一定的顺序组合成n个词语的模型。使用n-gram模型可以更好地捕捉文本中的语义信息,提高算法的准确性。 4. 使用词根还原:词根还原是指将单词还原为其原始形式,如将“running”还原为“run”。使用词根还原可以减少单词形态的差异,提高算法的准确性。 以上是TF-IDF算法改进的一些方法,可以根据具体情况选择适合自己的方法来实现算法。 <h3>回答2:</h3><br/>TF-IDF算法是信息检索中常用的一种技术,它能够帮助我们对文本数据进行快速、准确的搜索。它的核心思想是通过计算每个单词在文档集合中出现的频率和逆文档频率,来权衡单词的重要程度,从而得出每份文档的关键词。这样,我们就能用这些关键词来快速地判断一份文档与搜索实例的相关性。 Python作为一种广泛使用的编程语言,在实现TF-IDF算法方面具有一定优势。下面就来介绍一下如何改进Python实现TF-IDF算法。 1. 加载数据 首先,需要将文本数据加载到Python中。常用的方法是使用pandas库中的read_csv函数。 2. 预处理 在计算TF-IDF之前,需要进行一些预处理。首先要将所有文本都转换成小写字母,以避免大小写带来的误差。同时,还需要去除一些停用词,例如“the”、“a”、“an”等等。这些词并不会对文本的相关性产生太大的影响,反而会干扰计算。 3. 分词 将文本进行分词,是TF-IDF算法的一个重要步骤。在Python中,可以使用NLTK(自然语言工具包)来进行分词操作。NLTK提供了许多分词方法,例如最简单的word_tokenize函数。此外,还可以使用正则表达式的方法进行分词,更加灵活。 4. 计算词频 计算每个单词在文档集合中的频率,是TF-IDF算法的第一部分。在Python中,可以使用collections库的Counter函数来计算单词出现的次数。 5. 计算逆文档频率 计算每个单词的逆文档频率,是TF-IDF算法的第二部分。在Python中,可以使用math库的log函数来计算自然对数。然后,将所有文档中的单词频率除以单词的逆文档频率,即可得到TF-IDF值。 6. 排序 对计算出的TF-IDF值进行排序,并筛选出一定数量的关键词。在Python中,可以使用pandas库的sort_values函数进行排序。此外,也可以使用Python自带的sorted函数,更加灵活。 总之,TF-IDF算法在Python中的实现,需要依次进行数据加载、预处理、分词、计算词频、计算逆文档频率、排序等一系列步骤。通过适当的改进,可以使这些步骤更加高效、精确。这样,就能够为我们提供更加可靠、快速的检索服务。 <h3>回答3:</h3><br/>tf-idf算法是一种常用的文本挖掘算法,用于计算文档中每个词语的重要性,它基于两个统计量:词频(term frequency)和逆文档频率(inverse document frequency)。在实际应用中,tf-idf算法往往需要与其他算法一起使用,以提高算法的准确性和效率。 为了改进tf-idf算法的python实现,我们可以从以下几个方面入手: 1. 数据预处理:在使用tf-idf算法之前,需要对文本数据进行预处理,包括分词、去停用词、词干提取等。可以使用已有的分词库,如jieba分词库,来对文本进行分词,并使用NLTK库来对文本进行预处理。 2. 选择合适的权重计算方法:如果使用普通的TF-IDF算法,容易忽略一些重要的词语。因此,我们可以使用改进的TF-IDF算法,如Okapi BM25、Full-tF、Bidirectional TF-IDF、Sensitive TF-IDF等,来计算每个词语的权重。 3. 使用稀疏矩阵压缩数据:当文本数据量非常大时,使用稀疏矩阵压缩数据可以减少内存占用,提高算法的运行效率。可以使用Python的SciPy库来实现稀疏矩阵。 4. 优化算法实现tf-idf算法实现可以使用多线程技术,以提高算法的运行速度。可以使用Python的线程库,如threading和multiprocessing,来实现多线程计算。 总之,改进tf-idf算法的python实现可以通过优化数据预处理、选择合适的权重计算方法、使用稀疏矩阵压缩数据和优化算法实现这几个方面来实现。这些改进可以提高算法的准确性和效率,使得tf-idf算法更加适用于实际应用场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 48
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Asia-Lee

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值