前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >06_TF-IDF算法代码示例

06_TF-IDF算法代码示例

作者头像
黑泽君
发布2019-05-19 16:32:38
7510
发布2019-05-19 16:32:38
举报
文章被收录于专栏:黑泽君的专栏黑泽君的专栏

TF-IDF算法代码示例

0.引入依赖

代码语言:javascript
复制
import numpy as np # 数值计算、矩阵运算、向量运算
import pandas as pd # 数值分析、科学计算

1.定义数据和预处理

代码语言:javascript
复制
# 定义文档
docA = 'The cat sat on my bed'
docB = 'The dog sat on my knees'

# 切割文档
bowA = docA.split(' ')
bowB = docB.split(' ')
# bowA # ['The', 'cat', 'sat', 'on', 'my', 'bed']
# bowB # ['The', 'dog', 'sat', 'on', 'my', 'knees']

# 构建词库
wordSet = set(bowA).union(set(bowB))
# wordSet # {'The', 'bed', 'cat', 'dog', 'knees', 'my', 'on', 'sat'}

2.进行词数统计

代码语言:javascript
复制
# 用字典来保存词出现的次数
wordDictA = dict.fromkeys(wordSet, 0)
wordDictB = dict.fromkeys(wordSet, 0)
wordDictA
wordDictB

# 遍历文档,统计词数
for word in bowA:
    wordDictA[word] += 1
for word in bowB:
    wordDictB[word] += 1

pd.DataFrame([wordDictA, wordDictB])

输出结果如下:

3.计算词频 TF

代码语言:javascript
复制
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)
print(tfA)
print(tfB)

输出结果如下:

代码语言:javascript
复制
    {'on': 0.16666666666666666, 'dog': 0.0, 'cat': 0.16666666666666666, 'The': 0.16666666666666666, 'knees': 0.0, 'my': 0.16666666666666666, 'sat': 0.16666666666666666, 'bed': 0.16666666666666666}
    {'on': 0.16666666666666666, 'dog': 0.16666666666666666, 'cat': 0.0, 'The': 0.16666666666666666, 'knees': 0.16666666666666666, 'my': 0.16666666666666666, 'sat': 0.16666666666666666, 'bed': 0.0}

4.计算逆文档频率 IDF

代码语言:javascript
复制
def computeIDF(wordDictList):
    # 用一个字典对象保存 IDF,每个词作为 key,初始值为 0
    idfDict = dict.fromkeys(wordDictList[0], 0)
    # 总文档数量
    N = len(wordDictList)
    import math

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

输出结果如下:

代码语言:javascript
复制
    {'on': 0.0,
     'dog': 0.17609125905568124,
     'cat': 0.17609125905568124,
     'The': 0.0,
     'knees': 0.17609125905568124,
     'my': 0.0,
     'sat': 0.0,
     'bed': 0.17609125905568124}

5.计算 TF-IDF

代码语言:javascript
复制
def computeTFIDF(tf, idfs):
    tfidf = {}
    for word, tfval in tf.items():
        tfidf[word] = tfval * idfs[word]
    return tfidf

# 测试
tfidfA = computeTFIDF(tfA, idfs)
tfidfB = computeTFIDF(tfB, idfs)

pd.DataFrame([tfidfA, tfidfB])

输出结果如下:

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-05-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0.引入依赖
  • 1.定义数据和预处理
  • 2.进行词数统计
  • 3.计算词频 TF
  • 4.计算逆文档频率 IDF
  • 5.计算 TF-IDF
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档