zoukankan      html  css  js  c++  java
  • tf–idf算法解释及其python代码

    tf–idf算法python代码实现

    这是我写的一个tf-idf的简单实现的代码,我们知道tfidf=tf*idf,所以可以分别计算tf和idf值在相乘,首先我们创建一个简单的语料库,作为例子,只有四句话,每句表示一个文档

      

    copus=['我正在学习计算机','它正在吃饭','我的书还在你那儿','今天不上班']
    

      由于中文需要分词,jieba分词是python里面比较好用的分词工具,所以选用jieba分词,文末是jieba的链接。首先对文档进行分词:

      

    import jieba
    copus=['我正在学习计算机','它正在吃饭','我的书还在你那儿','今天不上班']
    copus= [[word for word in jieba.cut(doc)] for doc in copus]
    print(copus)
    

      输出结果:

       

    [['我', '正在', '学习', '计算机'], ['它', '正在', '吃饭'], ['我', '的', '书', '还', '在', '你', '那儿'], ['今天', '不', '上班']]
    

      文档变成我们想要的格式了,然后开始词频统计,计算tf值,这里用Counter类来把每篇文档都转换成词和词频的字典,其实就已经得到tf值了

       

    tf = []
    for doc in copus:
    tf.append(Counter(doc))
    print(tf)
    

      输出结果:

       

    [Counter({'我': 1, '正在': 1, '学习': 1, '计算机': 1}), Counter({'它': 1, '正在': 1, '吃饭': 1}), Counter({'的': 1, '书': 1, '你': 1, '在': 1, '那儿': 1, '我': 1, '还': 1}), Counter({'今天': 1, '不': 1, '上班': 1})]
    

      计算idf值

       

    import math
    from collections import defaultdict
    idf = defaultdict(int)
    for doc in tf:
        for word in doc:
            idf[word] += 1
    for word in idf:
        idf[word] = math.log(len(idf)/(idf[word]+1))
    print(idf)
    

      

      输出结果:

       

    defaultdict(<class 'int'>, {'的': 2.0149030205422647, '正在': 1.6094379124341003, '学习': 2.0149030205422647, '计算机': 2.0149030205422647, '今天': 2.0149030205422647, '书': 2.0149030205422647, '那儿': 2.0149030205422647, '它': 2.0149030205422647, '不': 2.0149030205422647, '在': 2.0149030205422647, '吃饭': 2.0149030205422647, '我': 1.6094379124341003, '你': 2.0149030205422647, '还': 2.0149030205422647, '上班': 2.0149030205422647})
    

      

      

    剩下的事情就很简单了,只需要把tf和idf相乘就可以了。

    下面是一个tfidf的实现代码

       

    from collections import Counter,defaultdict
    import jieba
    import math
     
    def file2list(file):
        '''
        把文件转换成列表,并对数据进行简单的预处理
        '''
        with open(file) as f:
            corpus = f.readlines()
            corpus = [[word.replace('
    ','') for word in jieba.cut(line)] for line in corpus if line.strip()]
        return corpus
    #c = file2list('E:hei.txt')
    def get_tf(corpus):
        return [Counter(doc) for doc in corpus]#用Counter函数把每篇文档转换成词和词频的字典
    def get_idf(tf_dict):
        idf = defaultdict(int)
        for doc in tf_dict:
            for word in doc:
                idf[word] += 1
        for word in idf:
            idf[word] = math.log(len(idf)/(idf[word]+1))#idf的公式
        return idf
     
    def get_tfidf(doc_id,file):
        '''doc_id是语料库中文档的id,file是txt的路径'''
        corpus = file2list(file)
        tf = get_tf(corpus)
        idf = get_idf(tf)
        if doc_id > len(tf):
            print("doc_id should smaller than %i"%len(tf))
        else:
            id_tf= tf[doc_id-1]
            for word in id_tf:
                id_tf[word] = id_tf[word]*idf[word]#计算tfidf值
            print(id_tf)
    

      

      

      

  • 相关阅读:
    jdk1.8StreamApi
    Python 【类的创建和类的实例化】
    Python【网络编程】
    Python 【图片转字符画】
    echarts 【图表的基本使用】
    Java 【Math】
    Java 【循环语句】
    Java 【instanceof使用】
    java【第三课 条件语句】
    Java【第二课 扫描仪 & 布尔数据类型】
  • 原文地址:https://www.cnblogs.com/68xi/p/11675796.html
Copyright © 2011-2022 走看看