机器学习:TF-IDF代码实现

TF-IDF

词频-逆文档频率(Term Frequency-Inverse Document Frequency,TF-IDF)是一种用于资讯检索与文本挖掘的常用加权技术;
TF-IDF是一种统计方法,用以评估一个字词对于一个文件集或一个语料库的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降;
在这里插入图片描述

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

词频(Term Frequency,TF):
指的是某一个给定的词语在该文件中出现的频率。这个数字是对词数的归一化,以防止偏向更长的文件。(同一个词语在长文件里可能会比短文件有更高的词数,而不管该词语是否重要)
在这里插入图片描述
逆向文件频率(Inverse Document Frequency,IDF)
是一个词语普遍重要性的度量,某一特定词语的IDF,可以由总文档数目除以包含该词语之文档的数目,再将得到的商取对数得到
在这里插入图片描述

代码实现

步骤:

0.引入依赖

# 0.引入依赖
import  numpy as np
import  pandas as pd

1.定义数据和预处理

#1.定义数据和预处理
docA ="The cat sat on my bed The man i hate it"
docB ="The dog sat on my knees The girl i like it"
bowA =docA.split(" ")
bowB =docB.split(" ")
print(bowA)
print(bowB)

# 构建词库
wordSet =set(bowA).union(set(bowB))
print(wordSet)

[‘The’, ‘cat’, ‘sat’, ‘on’, ‘my’, ‘bed’, ‘The’, ‘man’, ‘i’, ‘hate’, ‘it’]
[‘The’, ‘dog’, ‘sat’, ‘on’, ‘my’, ‘knees’, ‘The’, ‘girl’, ‘i’, ‘like’, ‘it’]
{‘girl’, ‘bed’, ‘dog’, ‘man’, ‘i’, ‘hate’, ‘on’, ‘cat’, ‘sat’, ‘knees’, ‘like’, ‘it’, ‘my’, ‘The’}

2.进行词数统计

# 2.进行词数统计
# 用统计字典来保存词出现的次数
wordDictA =dict.fromkeys(wordSet,0)
wordDictB =dict.fromkeys(wordSet,0)

#遍历文档,统计次数
for word in bowA:
    wordDictA[word] +=1
for word in bowB:
    wordDictB[word] +=1

print(pd.DataFrame([wordDictA,wordDictB],index=['docA','docB']))
  girl  bed  dog  man  i  hate  on  cat  sat  knees  like  it  my  The

docA 0 1 0 1 1 1 1 1 1 0 0 1 1 2
docB 1 0 1 0 1 0 1 0 1 1 1 1 1 2

3.0计算词频TF

#3.0计算词频TF
def computeTF( wordDict, bow ):
    # 用一个字典对象记录tf,把所有的词对应在bow文档里的tf都算出来
    tfDict = {}
    nbowCount = len(bow)
    for word, count in wordDict.items():
        tfDict[word] = count / nbowCount
    return tfDict

tfA = computeTF( wordDictA, bowA )
tfB = computeTF( wordDictB, bowB )
print(tfA)
print(tfB)

{‘hate’: 0.09090909090909091, ‘cat’: 0.09090909090909091, ‘i’: 0.09090909090909091, ‘dog’: 0.0, ‘man’: 0.09090909090909091, ‘The’: 0.18181818181818182, ‘like’: 0.0, ‘girl’: 0.0, ‘my’: 0.09090909090909091, ‘it’: 0.09090909090909091, ‘knees’: 0.0, ‘sat’: 0.09090909090909091, ‘on’: 0.09090909090909091, ‘bed’: 0.09090909090909091}
{‘hate’: 0.0, ‘cat’: 0.0, ‘i’: 0.09090909090909091, ‘dog’: 0.09090909090909091, ‘man’: 0.0, ‘The’: 0.18181818181818182, ‘like’: 0.09090909090909091, ‘girl’: 0.09090909090909091, ‘my’: 0.09090909090909091, ‘it’: 0.09090909090909091, ‘knees’: 0.09090909090909091, ‘sat’: 0.09090909090909091, ‘on’: 0.09090909090909091, ‘bed’: 0.0}

4.计算逆文档频率idf

def computeIDF(wordDictList):
    # 用一个字典对象保存idf结果,每个词作为key,初始值为0
    idfDict  =dict.fromkeys(wordDictList[0],0)
    N = len(wordDictList)

    import math
    for wordDict  in wordDictList:
        # 遍历字典中的每个词汇,统计Ni
        for  word,count in wordDict.items():
            if count > 0 :
                # 先把Ni增加1,存入到idfDict
                idfDict[word] += 1
    # 已经得到所有词汇i对应的Ni,现在根据公式把它替换成idf值
    for word ,ni  in idfDict.items():
        idfDict[word]   = math.log10((N+1)/(ni+1))        
    return idfDict    

idfs =computeIDF([wordDictA,wordDictB])
print(idfs)

{‘hate’: 0.17609125905568124, ‘cat’: 0.17609125905568124, ‘i’: 0.0, ‘dog’: 0.17609125905568124, ‘man’: 0.17609125905568124, ‘The’: 0.0, ‘like’: 0.17609125905568124, ‘girl’: 0.17609125905568124, ‘my’: 0.0, ‘it’: 0.0, ‘knees’: 0.17609125905568124, ‘sat’: 0.0, ‘on’: 0.0, ‘bed’: 0.17609125905568124}

5.计算TF-IDF

def computeTFIDF(tf,idfs):
    tfidf ={}
    for word,tfval in tf.items():
        tfidf[word] =tfval * idfs[word]
    return tfidf
tfidfA = computeTFIDF( tfA , idfs ) 
tfidfB = computeTFIDF( tfB , idfs )   
print(pd.DataFrame([ tfidfA , tfidfB ]) )
   hate       cat    i       dog       man  The      like      girl   my   it     knees  sat   on       bed

0 0.016008 0.016008 0.0 0.000000 0.016008 0.0 0.000000 0.000000 0.0 0.0 0.000000 0.0 0.0 0.016008
1 0.000000 0.000000 0.0 0.016008 0.000000 0.0 0.016008 0.016008 0.0 0.0 0.016008 0.0 0.0 0.000000

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
tf-idf是自然语言处理中一种常用的文本特征表示方法。tf代表词频(term frequency),idf代表逆文档频率(inverse document frequency)。 tf表示在一篇文档中一个词出现的频率。一般来说,一个词在一个文档中出现得越频繁,它对文档的特征表示的重要性越大。但是tf并没有考虑到词在整个语料库中出现的频率。 idf则通过一种统计方式,计算一个词在所有文档中出现的概率。公式为idf = log(总文档数/包含该词的文档数)。由于取对数,所以当一个词在所有文档中都出现时,它的idf值会很小,对于文档特征表示的重要性也会很小。而当一个词在少数文档中出现时,它的idf值会很大,对于特征表示的重要性也会很大。 tf-idf的计算方法为tf * idf,通过将tf和idf相乘可以得到每个词在文档中的tf-idf值。这个值越大则说明这个词对文档的特征表示的重要性越高。 tf-idf可以用于文本分类、信息检索、文本聚类等任务。在文本分类中,通过计算每个词的tf-idf值可以得到文档的特征表示,然后可以使用机器学习算法对文档进行分类。在信息检索中,可以通过计算查询词的tf-idf值来评估文档和查询之间的相关性。在文本聚类中,可以根据词的tf-idf值来度量文档之间的相似度,从而将相似的文档聚类在一起。 总之,tf-idf是一种常用的文本特征表示方法,可以用于自然语言处理中的各种任务。通过考虑词频和词在整个语料库中出现的频率,tf-idf可以帮助我们更好地理解和分析文本数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值