Advertisement

特征工程·TFIDF提取特征

阅读量:

本文介绍文本处理时比较常用且有效的tfidf特征提取方法

1. 提取tf特征

它即为Term Frequency, 即用于衡量文本中词语频率的一种指标, 属于用于衡量文本中词语频率的技术之一。它指的是计算给定文本中各个词汇出现次数的方法

复制代码
    def computeTF(wordDict, bow):
    tfDict = {}
    bowCount = len(bow)
    for word, count in wordDict.items():
        tfDict[word] = count / float(bowCount)
    return tfDict

输入参数wordDict由各个字词及其出现频率组成, bow则是一个完整的词汇集合.

2. 提取IDF特征

其定义为逆向文档频率(Inverse Document Frequency),用于评估词汇在整个语料库中的重要程度。通常计算方式是将整个语料库中的总文档数除以包含该词汇的文档数量,并对结果取对数值以放大差异。

复制代码
    def computeIDF(docList):
    import math 
    idfDict = {}
    N = len(docList)
    
    idfDict = dict.fromkeys(docList[0].keys(), 0)
    for doc in docList:
        for word, val in doc.items():
            if word in idfDict:
                if val > 0:
                    idfDict[word] += 1
            else:
                if val > 0:
                    idfDict[word] = 1
    
    for word, val in idfDict.items():
        idfDict[word] = math.log10(N / float(val))
    
    return idfDict

输入参数是一个包括多个单词-文档数量字典构成的列表形式

3. 提取TF-IDF特征

tf-idf即是 tf 与 idf 计算出的结果, 可以度量某个词汇在全部文档中的重要性. 假设一个包含 n 个词汇的文档 A, 某个词汇在其上出现了 t 次, 并且该词汇在 w 份不同的文档中出现过, 共包含 x 份文件.

  • 计算式为 tf = t/n,则当 tf 值越大,则表示该词在当前文档中的重要性越高。
  • 计算式为 idf = log(x/w),当 idf 值较小时,则表明该词汇在整个语料库中出现频率较高,缺乏特定识别能力。
  • 其中 tf-idf 计算公式为 (t/n) × log(x/w),当分母 w 越小时,在公式中的乘积结果反而增大。
复制代码
    def computeTFIDF(tfBow, idfs):
    tfidf = {}
    for word, val in tfBow.items():
        tfidf[word] = val * idfs[word]
    return tfidf
  • 传入的参数为之前计算得到的包含tf和idf值的字典

4. 直接调用sklearn库的api生成TF-IDF词向量

复制代码
    from sklearn.feature_extraction.text import TfidfVectorizer
    count_vec = TfidfVectorizer(binary=False, decode_error='ignore', stop_words='english')

通过设置相关参数生成tfidf向量化实例count_vec;当设置为true时将所有非零频次的TF-IDF值标准化至1(而非仅作为二进制标记)

传入数据进行拟合然后转化为词向量的形式

复制代码
    s1 = 'I love you so much'
    s2 = 'I hate you! shit!'
    s3 = 'I like you, but just like you'
    response = count_vec.fit_transform([s1, s2, s3]) # s must be string
    print(count_vec.get_feature_names())
    print(response.toarray())

输出去掉英文停用词后的结果如下

[‘shit’, ‘hate’, ‘just’, ‘like’, ‘love’]
[[0. 0. 0. 0. 1. ]
[0.70710678 0.70710678 0. 0. 0. ]
[0. 0. 0.4472136 0.89442719 0. ]]

  • 第一列为特征名称(即单词),其余三列分别代表每个单词在其对应文本中的TF-IDF值 * 此外,在模型训练过程中(即采用fit_transform方法)对训练集数据进行处理,并将测试集数据通过transform方法实现其词向量基于训练集特征的转换

参考博客:
关于TF(词频) 和TF-IDF(词频-逆向文件频率 )的理解

关于词频(TF)与词频逆向文件频率(TF-IDF)的理解

关键词

全部评论 (0)

还没有任何评论哟~