程序猿成长日记(三)TF-IDF的词嵌入自我理解(原理及实战)

TF-IDF原理解析及公式

TF-IDF技术是一种基于词的出现频率和词对于文档的不同重要程度而设立的一种模型, 其核心就只有两部分TF词频和IDF逆文档频率.
公式也比较简单:
Alt
Alt

TF代码实现:

TF部分实现的代码如下:

def TFCalculate(OurDoc):
    wordsofbag = {}
    allwords = []  # 记录所有的词数
    # 首先统计所有的词数
    for doc in OurDoc:
        words = doc.split(' ')
        for word in words:
            if word not in wordsofbag.keys():
                wordsofbag[word] = 1
                allwords.append(word)
            else:
                wordsofbag[word] += 1

    tfvec = []  # 文档的tf(t,d)向量

    for doc in OurDoc:
        # 计算每个文档的tf值向量,tf即词文档出现频率
        words = doc.split(' ')
        newvec = [0 for _ in range(len(allwords))]
        for word in words:
            newvec[allwords.index(word)] += 1
        tfvec.append(newvec)

    return wordsofbag, tfvec, allwords

IDF代码实现:

IDF实现的代码部分如下:

def IDFCalculate(tfvec, alllwords):
    """计算IDF的值,公式等于文档的<log(总数/(1+出现该词的文档数))>"""
    nd = len(tfvec)  # 文档数目
    idf = []  # 所有文档df的值,即出现该词的文档数
    for vec in tfvec:
        df = [0 for _ in range(len(allwords))]
        for i in range(len(df)):
            if vec[i]:
                df[i] += 1
        df = list(map(lambda x: np.log(nd / (x + 1)), df))  # +1防止分母为0
        idf.append(df)
    return idf

最后的向量表示:

def TF_IDFCalculate(tfvec, idfvec):
    """计算最后的TF-IDF的向量表示"""
    TF_IDF = []
    for docnum in range(len(tfvec)):
        newvec = []
        for doccolumn in range(len(tfvec[0])):
            newvec.append(tfvec[docnum][doccolumn] * idfvec[docnum][doccolumn])
        TF_IDF.append(newvec)
    return TF_IDF

main函数部分:

由于是尝试,没有采用大型的语料库,但是精髓领悟到了,语料库什么的其实也就不必介意了.

if __name__ == '__main__':
    # 定义文档,这里将每一句话视为一个文档
    OurDoc = ["the sun is shining",
              "the weather is sweet",
              "the sun is shining and the weather is sweet"]
    wordsofbag, tfvec, allwords = TFCalculate(OurDoc)
    idfvec = IDFCalculate(tfvec, allwords)
    TF_IDFVec = TF_IDFCalculate(tfvec, idfvec)

参考文献:
GitHub完整代码
NLP关键字提取之TF-IDF算法
TF-IDF算法介绍及实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值