AIOPS 自然语义处理之TF-IDF代码实现(Python)

7 篇文章 7 订阅

关于理论讲TF-IDF可以查看上篇文章

要点讲解:

1、利用python第三方插件 jieba分词对输入的语句进行分析

2、利用python第三方插件 requests获取分词在中文文档中出现的文档数

3、利用python自带表中的Counter类对分词进行统计

4、测试语句:'查看一下亚马逊服务器硬盘'

代码见下:

# -*- coding: utf-8  -*-
import jieba
import math
import operator
import re
import requests
from collections import Counter


class SimilarityCalculator(object):
    def __init__(self):
        self.total_chinese_doc = 60000000000  # 假设所有的中文文档有60亿

    def cut_context(self, context):
        """
        调用结巴分词进行切分
        :return:seg_list 包含分析的迭代器
        """
        seg_list = jieba.cut(context, cut_all=False)
        return seg_list

    def get_tf(self, context):
        """
        计算每个词的词频term frequency 计算公式tf=count of word / total number of context
        :param context: 文本内容
        :return: 根据词频从高到底排列的OrderedDict字典, key为word, value为tf值
        """
        word_tf_dict = {}
        # step 1: 针对语句进行分析, 此处利用结巴进行分析
        seg_list = self.cut_context(context)

        # step 2: 统计每隔分词的次数, 计算tf
        for word, count in Counter(seg_list).iteritems():
            word_tf_dict[word] = operator.div(float(count), len(context))

        return word_tf_dict

    def get_idf(self, context):
        """
        计算输入文本中每隔分词的逆文档频率 idf, 在此处假设中文总文档为D=65亿
        各个分词出现文档为
        :param context: 输入分文
        :return:
        """
        word_idf_dict = {}
        seg_list = self.cut_context(context)
        for seg in seg_list:
            seg_doc_count = self.get_doc_count(seg)
            idf = math.log(operator.div(self.total_chinese_doc, operator.add(seg_doc_count, 1)), 10)
            print seg, seg_doc_count, idf
            word_idf_dict[seg] = idf

        return word_idf_dict

    def get_df_idf_values(self, word_idf_dict, word_tf_dict):
        """
        计算df_idf的值
        :param word_idf_dict: 逆文档频率数据
        :param word_tf_dict: 词频数据
        :return: df_idf的数据
        """
        df_idf_value_dict = {}
        for word in word_idf_dict:
            df_idf_value_dict[word] = operator.mul(word_idf_dict.get(word), word_tf_dict.get(word))

        return df_idf_value_dict

    def get_doc_count(self, word):
        """
        通过百度上进行搜索,获取每个分词出现在的中文文档的个数
        :param word:
        :return:
        """
        doc_count = 0
        try:
            url = r'http://www.baidu.com/s?wd=' + word
            res = requests.get(url)
            word_count_list = re.findall(ur'百度为您找到相关结果约(.*)个', res.text)
            if word_count_list:
                doc_count = re.sub(r'\D', '', word_count_list[0]).strip()
        except:
            doc_count = 0

        return int(doc_count)


if __name__ == '__main__':
    similar_calculator = SimilarityCalculator()
    context = u'查看一下亚马逊服务器硬盘'
    word_idf_dict = similar_calculator.get_idf(context)
    word_tf_dict = similar_calculator.get_tf(context)
    idf_values = similar_calculator.get_df_idf_values(word_idf_dict, word_tf_dict)
    idf_values = sorted(idf_values.iteritems(), key=lambda x: x[1], reverse=True)
    for key, value in idf_values:
        print key, round(value, 2)

运行结果:

亚马逊 0.29
服务器 0.25
硬盘 0.25
一下 0.23
查看 0.23

具体过程数据:

分词出现的文档数IDFTFTF-IDF
查看1000000002.7774270.0830.23
一下939000002.8048210.0830.23
亚马逊188000003.5039270.0830.29
服务器630000002.9786370.0830.25
硬盘645000002.9684830.0830.25
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值