基于python实现TF-IDF算法

标签:2021.09.27工作内容
参考资料:TF-IDF算法介绍及实现
声明:本文中大量内容转载至参考资料,仅归纳整理和加入部分个人观点心得,侵删

概念

  1. 定义
    TF-IDF(term frequency-inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术,常用于挖掘文章中的关键词。
  2. 特点:简单高效,用于最开始的文本数据清洗。
  3. TF-IDF
    (1)TF:词频
    可以统计到停用词,并把它们过滤,避免对结果造成影响。
    e.g.:”的”、”了”、”是”等等
    (2)IDF:逆文档频率
    在词的频率相同时,不同词的重要性却不同。IDF会给常见的词较小的权重。
    e.g.:假设”量化”和”系统”的词频相同,则重要性:”量化” > “系统”
  4. 实现方法
    当有TF和IDF后,将其相乘,能够得到一个词的TF-IDF的值。某个词在文章中的TF-IDF越大,那么它在文章中的重要性越高。

算法步骤

  1. 计算词频
    词频 = 某个词在文章中出现的次数 / 文章的总次数
  2. 计算逆文档的频率
    需要一个语料库(corpus)来模拟语言的使用环境。
    逆文档频率 = log(语料库的文档总数 / (包含该词的文档数 + 1))
  3. 计算TF-IDF
    TF-IDF= TF × IDF
    与一个词在文档中出现的次数成正比。
    与该词在整个语言中出现的次数成反比。

优缺点

  1. 优点
    简单高效,容易理解。
  2. 缺点
    (1)词频衡量此的重要性不够全面,有时重要的词出现得不多
    (2)无法体现位置信息=>无法体现该词在上下文中的重要性=>用word2vec算法来支持

python实现TF-IDF算法

  1. 自己构建语料库
    这个例子比较特殊,dataset既是语料库,可是我们要统计核心词的对象。

from collections import defaultdict
import math
import operator

"""
函数说明:创建数据样本
Returns:
    dataset - 实验样本切分的词条
    classVec - 类别标签向量
"""

def loadDataSet():
    dataset = [['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],
               ['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],
               ['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'my'],
               ['stop', 'posting', 'stupid', 'worthless', 'garbage'],
               ['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],
               ['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]
    classVec = [0, 1, 0, 1, 0, 1]
    return dataset, classVec

"""
函数说明:特征选择TF-IDF算法
Parameters:
     list_words:词列表
Returns:
     dict_feature_select:特征选择词字典
"""

def feature_select(dataset):

    doc_frequency = defaultdict(int)
    for file in dataset:
        for word in file:
            doc_frequency[word] += 1

    word_tf = {}
    for i in doc_frequency:
        word_tf[i] = doc_frequency[i] / sum(doc_frequency.values())

    doc_num = len(dataset)
    word_idf = {}
    word_doc = defaultdict(int)
    for word in doc_frequency:
        for file in dataset:
            if word in file:
                word_doc[word] += 1

    for word in doc_frequency:
        word_idf[word] = math.log(doc_num / (word_doc[word] + 1))

    word_tf_idf = {}
    for word in doc_frequency:
        word_tf_idf[word] = word_tf[word] * word_idf[word]

    dict_feature_select = sorted(word_tf_idf.items(), key=operator.itemgetter(1), reverse=True)
    return dict_feature_select

if __name__ == '__main__':
    data_list, label_list = loadDataSet()
    features = feature_select(data_list)
    print(features)

运算结果:

基于python实现TF-IDF算法
2. NLTK实现TF-IDF算法
由于我的电脑安装了本地代理所以不能下载nltk的语料库,这里只贴代码供大家参考
from nltk.text import TextCollection
from nltk.tokenize import word_tokenize

sents=['this is sentence one','this is sentence two','this is sentence three']
sents=[word_tokenize(sent) for sent in sents]
print(sents)
corpus=TextCollection(sents)
print(corpus)

tf=corpus.tf('one',corpus)
print(tf)

idf=corpus.idf('one')
print(idf)

tf_idf=corpus.tf_idf('one',corpus)
print(tf_idf)
  1. 利用sklearn做tf-idf
import sklearn
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer

x_train = ['TF-IDF 主要 思想 是', '算法 一个 重要 特点 可以 脱离 语料库 背景',
           '如果 一个 网页 被 很多 其他 网页 链接 说明 网页 重要']
x_test = ['原始 文本 进行 标记', '主要 思想']

vectorizer = CountVectorizer(max_features=10)

tf_idf_transformer = TfidfTransformer()

tf_idf = tf_idf_transformer.fit_transform(vectorizer.fit_transform(x_train))

x_train_weight = tf_idf.toarray()

tf_idf = tf_idf_transformer.transform(vectorizer.transform(x_test))
x_test_weight = tf_idf.toarray()

print('vectorizer.fit_transform(x_train) : ')
print(vectorizer.fit_transform(x_train))
print('输出x_train文本向量:')
print(x_train_weight)
print('输出x_test文本向量:')
print(x_test_weight)

基于python实现TF-IDF算法
4. 利用Jieba实现tf-idf
import jieba.analyse

text='关键词是能够表达文档中心内容的词语,常用于计算机系统标引论文内容特征、
信息检索、系统汇集以供读者检阅。关键词提取是文本挖掘领域的一个分支,是文本检索、
文档比较、摘要生成、文档分类和聚类等文本挖掘研究的基础性工作'

keywords=jieba.analyse.extract_tags(text, topK=5, withWeight=False, allowPOS=())
print(keywords)

注:

jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
sentence 为待提取的文本
topK 为返回几个 TF/IDF 权重最大的关键词,默认值为 20
withWeight 为是否一并返回关键词权重值,默认值为 False
allowPOS 仅包括指定词性的词,默认值为空,即不筛选

运行结果:

基于python实现TF-IDF算法
(安装不了就pip install jieba; conda install jieba; pip3 install jieba;都尝试一边,我用pip3安装才成功的,如果还不成功可以去jieba官网手动下载后自行配置到anaconda环境)

Original: https://blog.csdn.net/Daisy_Wang777/article/details/120510366
Author: 芊欣欲
Title: 基于python实现TF-IDF算法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/530295/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球