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)
    

      

      

      

  • 相关阅读:
    Swift入门篇-Hello World
    Swift入门篇-swift简介
    Minecraft 插件 world edit 的cs 命令
    搭建本地MAVEN NEXUS 服务
    MC java 远程调试 plugin 开发
    企业内部从零开始安装docker hadoop 提纲
    javascript 命令方式 测试例子
    ca des key crt scr
    JSF 抽象和实现例子 (函数和属性)
    form 上传 html 代码
  • 原文地址:https://www.cnblogs.com/68xi/p/11675796.html
Copyright © 2011-2022 走看看