TF-IDF算法实现

TF-IDF简介

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

                        ​​​​​​​        ​​​​​​​        TFIDF=TF\times IDF

        ● TF-IDF的主要思想:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类
        ● TF-IDF加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级

词频( Term Frequency , TF )

        指的是某一个给定的词语在该文件中出现的频率。这个数字是对词数的归一化,以防止偏向更长的文件。(同一个词语在 长文件里可能会比短文件有更高的词数,而不管该词语重要与否。)

                                                        TF_{i,j}=\frac{n_{i,j}}{n_{*,j}}

        其中TF_{i,j}表示词语i在文档j中出现的频率,n_{i,j}表示i在j中出现的次数, n_{*,j}表示文档j的总词数

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


        是一个词语 普遍重要性的度量,某一特定词语的IDF,可以由总文档数目除以包含该词语之文档的数目,再将得到的商取对数得到

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        IDF_{i}=log(\frac{N+1}{N_{i}+1})

        其中IDF_{i}表示词语i在文档集中的逆文档频率,N表示文档集中的文档总数,N_{i}表示文档集中包含了词语i的文档数

实现代码:

#TF-IDF算法实例
#0.引入依赖
import numpy as np
import pandas as pd
#1.定义数据和预处理

docA="The cat sat on my bed"
docB="THe dod sat on my knees"

bowA=docA.split(" ")
bowB=docB.split(" ")
#构建词库
wordSet=set(bowA).union(set(bowB))
print(wordSet)

#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

pd.DataFrame([wordDictA,wordDictB])
# 3. 计算词频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)

#4. 计算逆文档频率idf
def computeIDF(wordDictList):
    #用一个字典保存对象保存idf结果,每个词作为key,初始值为0
    idfDict=dict.fromkeys(wordDictList[0],0)
    N=len(wordDictList)
    import math

    for wordDictList in wordDictList:
        #遍历字典中的每个词汇,统计Ni
        for word,count in wordDictList.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])

#5. 计算TF-IDF
def computerTFIDF(tf,idfs):
    tfidf={}
    for word,tfval in tf.items():
        tfidf[word]=tfval*idfs[word]
    return tfidf
tfidfA=computerTFIDF(tfA,idfs)
tfidfB=computerTFIDF(tfB,idfs)
print(tfidfA)


 

你可能感兴趣的:(算法,人工智能)