tfidf代码实现

文章目录

  • 1. tfidf定义
  • 2. 代码实现
    • 2.1参考版
    • 2.2 第二版
    • 2.3 部分优化版

1. tfidf定义

逆词频词表
TF-IDF(term frequency–inverse document frequency,词频-逆向文件频率)是一种用于信息检索(information retrieval)与文本挖掘(text mining)的常用加权技术。
TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降
TF-IDF实际上是:TF * IDF
词频(TF)= 词在文本中出现的次数。 这个数字通常会被归一化(一般是词频除以文章总词数), 以防止它偏向长的文件。
逆向文档频率 (IDF) =log(语料库文档总数/(包含该词的文档数+1)) :某一特定词语的IDF,可以由总文件数目除以包含该词语的文件的数目,再将得到的商取对数得到。如果包含词条t的文档越少, IDF越大,则说明词条具有很好的类别区分能力

参考:https://blog.csdn.net/asialee_bird/article/details/81486700

2. 代码实现

2.1参考版

import math
import copy
from collections import Counter,defaultdict
copus = [['我', '正在', '学习', '计算机','我'], ['它', '正在', '吃饭'],
         ['我', '的', '书', '还', '在', '我', '那儿'], ['今天', '不', '上班']]
class Solution():
    def tfidf_(self,copus):
        """
        词频(TF)= 词在每个文本中出现的次数
        逆向文档频率 (IDF) =log(语料库文档总数/(包含该词的文档数+1))
        """
        tf = []
        """统计单个文档词频"""
        for doc in copus:
            tf.append(Counter(doc))
        idf = defaultdict(int)#defaultdict的作用是在于,当字典里的key不存在但被查找时,返回的不是keyError而是一个默认值0
        """统计包含该词的文档数"""
        for doc in tf:
            for word in doc:
                idf[word] += 1
        """计算逆向文档频率"""
        for word in idf:
            idf[word] = math.log(len(copus) / (idf[word] + 1))
        tfidf = copy.deepcopy(copus)
        for i, words in enumerate(tfidf):
            for j, word in enumerate(words):
                tfidf[i][j] = tf[i][word] * idf[word]#词在每个文档中出现的频次 * 该词的逆文档频次
        return tfidf
solu = Solution()
res = solu.tfidf_(copus)
print(res)

2.2 第二版

class Solution():
    def tfidf(self,docs):
        """
        词频(TF)= 词在每个文本中出现的次数
        逆向文档频率 (IDF) =log(语料库文档总数/(包含该词的文档数+1))
        """
        tf = []
        """计算tf"""
        for doc in docs:
            com_fre = {}
            for word in doc:
                if com_fre.get(word):com_fre[word] += 1
                else:com_fre[word] = 1
            tf.append(com_fre)
        """计算idf"""
        idf = defaultdict(int)#defaultdict的作用是在于,当字典里的key不存在但被查找时,返回的不是keyError而是一个默认值0
        for doc in tf:
            for word in doc:
                idf[word] += 1
        for word in idf:
            idf[word] = math.log(len(docs)/(idf[word] + 1))

        print(tf,"\n",idf,"\n")
        """计算tfidf"""
        copus = copy.deepcopy(docs)
        for index_doc,doc in enumerate(copus):
            for index_word,word in enumerate(doc):
                copus[index_doc][index_word] = tf[index_doc][word] * idf[word]#词在每个文档中出现的频次 * 该词的逆文档频次
        print(copus)

"""

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

[[0.5753641449035617, 0.28768207245178085, 0.6931471805599453, 0.6931471805599453, 0.5753641449035617], [0.6931471805599453, 0.28768207245178085, 0.6931471805599453], [0.5753641449035617, 0.6931471805599453, 0.6931471805599453, 0.6931471805599453, 0.6931471805599453, 0.5753641449035617, 0.6931471805599453], [0.6931471805599453, 0.6931471805599453, 0.6931471805599453]]

"""

2.3 部分优化版

class Solution:
    def com_tfidf(self,docs):
        tf = []
        for doc in docs:
            char_fre = {}
            for char in doc:
                char_fre[char] = char_fre.get(char,0) + 1
            tf.append(char_fre)
        idf = defaultdict(int)
        for doc in tf:
            for char in doc:
                idf[char] = idf.get(char,0) + 1
        for char in idf:
            idf[char] = math.log(len(docs)/(idf[char]+1))
        copus = copy.deepcopy(docs)
        for doc_index,doc in enumerate(copus):
            for char_index,char in enumerate(doc):
                copus[doc_index][char_index] = tf[doc_index][char] * idf[char]
        return copus
solu = Solution()
res = solu.com_tfidf(copus)
print(res)

你可能感兴趣的:(linux,python,自然语言处理)