当前位置:   article > 正文

自然语言处理NLP:tf-idf原理、参数及实战_tfidf

tfidf

大家好,tf-idf作为文体特征提取的常用统计方法之一,适合用于文本分类任务,本文将从原理、参数详解和实际处理方面介绍tf-idf,助力tf-idf用于文本数据分类。

1.tf-idf原理

tf 表示词频,即某单词在某文本中的出现次数与该文本中所有词的词数的比值,idf表示逆文本频率(语料库中包含某单词的文本数、倒数、取log),tf-idf则表示词频 * 逆文档频率,tf-idf认为词的重要性随着它在文本中出现的次数成正比增加,但同时会随着它在整个语料库中出现的频率成反比下降。

idf表达式如下,其中k为包含某词的文本数,n为整个语料库的文本数:

idf=log(n/k)

对idf进行平滑处理,避免出现极大/极小值(smooth_idf=True)

idf=log((1+n)/(1+k))+1

2.文本处理方法

sklearn中提供了一些方便的文本处理方法:

CountVectorizer: 将文本文档集合转换为词频/字符频数矩阵,在单个类中实现了 tokenization (字符级+词级分词)、n-grams、剔除停用词、筛选高频词和 occurrence counting (频数统计)

TfidfTransformer:将词频/字符频数矩阵转换为标准化的 tf 或 tf-idf 矩阵,Tf 表示词频、而 tf-idf 表示词频乘以逆文档频率,常用于文本分类

TfidfVectorizer:将原始文档集合转换为tf-idf 特征矩阵,将 CountVectorizer 和TfidfTransformer的所有功能组合在一个模型中。

实际应用结果如下图(2-grams):

图片

  1. import warnings
  2. warnings.filterwarnings('ignore')
  3. import numpy as np
  4. import pandas as pd
  5. from sklearn.feature_extraction.text import CountVectorizer,TfidfTransformer,TfidfVectorizer

3.初始化词频向量/tf_idf训练参数

由于存在功能组合的问题,TfidfVectorizer参数=CountVectorizer参数+TfidfTransformer参数,因此初始化参数函数将三部分参数汇总,通过设置传参label,用于确定所需要返回的参数字典。

  1. def init_params(label='TfidfVectorizer'):
  2. params_count={
  3. 'analyzer': 'word', # 取值'word'-分词结果为词级、'char'-字符级(结果会出现he is,空格在中间的情况)、'char_wb'-字符级(以单词为边界),默认值为'word'
  4. 'binary': False, # boolean类型,设置为True,则所有非零计数都设置为1.(即,tf的值只有0和1,表示出现和不出现)
  5. 'decode_error': 'strict',
  6. 'dtype': np.float64, # 输出矩阵的数值类型
  7. 'encoding': 'utf-8',
  8. 'input': 'content', # 取值filename,文本内容所在的文件名;file,序列项必须有一个'read'方法,被调用来获取内存中的字节;content,直接输入文本字符串
  9. 'lowercase': True, # boolean类型,计算之前是否将所有字符转换为小写。
  10. 'max_df': 1.0, # 词汇表中忽略文档频率高于该值的词;取值在[0,1]之间的小数时表示文档频率的阈值,取值为整数时(>1)表示文档频数的阈值;如果设置了vocabulary,则忽略此参数。
  11. 'min_df': 1, # 词汇表中忽略文档频率低于该值的词;取值在[0,1]之间的小数时表示文档频率的阈值,取值为整数时(>1)表示文档频数的阈值;如果设置了vocabulary,则忽略此参数。
  12. 'max_features': None, # int或 None(默认值).设置int值时建立一个词汇表,仅用词频排序的前max_features个词创建语料库;如果设置了vocabulary,则忽略此参数。
  13. 'ngram_range': (1, 2), # 要提取的n-grams中n值范围的下限和上限,min_n <= n <= max_n。
  14. 'preprocessor': None, # 覆盖预处理(字符串转换)阶段,同时保留标记化和 n-gram 生成步骤。仅适用于analyzer不可调用的情况。
  15. 'stop_words': 'english', # 仅适用于analyzer='word'。取值english,使用内置的英语停用词表;list,自行设置停停用词列表;默认值None,不会处理停用词
  16. 'strip_accents': None,
  17. 'token_pattern': '(?u)\\b\\w\\w+\\b', # 分词方式、正则表达式,默认筛选长度>=2的字母和数字混合字符(标点符号被当作分隔符)。仅在analyzer='word'时使用。
  18. 'tokenizer': None, # 覆盖字符串标记化步骤,同时保留预处理和 n-gram 生成步骤。仅适用于analyzer='word'
  19. 'vocabulary': None, # 自行设置词汇表(可设置字典),如果没有给出,则从输入文件/文本中确定词汇表
  20. }
  21. params_tfidf={
  22. 'norm': None, # 输出结果是否标准化/归一化。l2:向量元素的平方和为1,当应用l2范数时,两个向量之间的余弦相似度是它们的点积;l1:向量元素的绝对值之和为1
  23. 'smooth_idf': True, # 在文档频率上加1来平滑 idf ,避免分母为0
  24. 'sublinear_tf': False, # 应用次线性 tf 缩放,即将 tf 替换为 1 + log(tf)
  25. 'use_idf': True, # 是否计算idf,布尔值,False时idf=1。
  26. }
  27. if label=='CountVectorizer':
  28. return params_count
  29. elif label=='TfidfTransformer':
  30. return params_tfidf
  31. elif label=='TfidfVectorizer':
  32. params_count.update(params_tfidf)
  33. return params_count

4.CountVectorizer训练及应用函数

  1. def CountVectorizer_train(train_data,params):
  2. cv = CountVectorizer(**params)
  3. # 输入训练集矩阵,每行表示一个文本
  4. # 训练,构建词汇表以及词项idf值,并将输入文本列表转成VSM矩阵形式
  5. cv_fit = cv.fit_transform(train_data)
  6. return tv
  7. def CountVectorizer_apply(model):
  8. print('词汇表')
  9. print(model.vocabulary_)
  10. print('------------------------------')
  11. print('特证名/词汇列表')
  12. print(model.get_feature_names())
  13. print('------------------------------')
  14. print('idf_列表')
  15. print(model.idf_)
  16. print('------------------------------')
  17. data=['Tokyo Japan Chinese']
  18. print('{} 文本转化VSM矩阵'.format(data))
  19. print(model.transform(data).toarray())
  20. print('------------------------------')
  21. print('转化结果输出为dataframe')
  22. print(pd.DataFrame(model.transform(data).toarray(),columns=model.get_feature_names()))
  23. print('------------------------------')
  24. print('model参数查看')
  25. print(model.get_params())
  26. print('------------------------------')

5.CountVectorizer使用

  1. train_data = ["Chinese Beijing Chinese",
  2. "Chinese Chinese Shanghai",
  3. "Chinese Macao",
  4. "Tokyo Japan Chinese"]
  5. params=init_params('CountVectorizer')
  6. cv_model=CountVectorizer_train(train_data,params)
  7. CountVectorizer_apply(cv_model)

查看结果可以发现,VSM矩阵并不是词频统计,其实是tf-idf的结果。

图片

6.TfidfTransformer训练及应用函数

  1. def TfidfTransformer_train(train_data,params):
  2. tt = TfidfTransformer(**params)
  3. tt_fit = tt.fit_transform(train_data)
  4. return tt
  5. def TfidfTransformer_apply(model):
  6. print('idf_列表')
  7. print(model.idf_)
  8. print('------------------------------')
  9. data=[[1, 1, 0, 2, 1, 1, 0, 1]]
  10. print('词频列表{} 转化VSM矩阵'.format(data))
  11. print(model.transform(data).toarray())
  12. print('------------------------------')
  13. print('model参数查看')
  14. print(model.get_params())
  15. print('------------------------------')
  16. train_data=[[1, 1, 1, 0, 1, 1, 1, 0],
  17. [1, 1, 0, 1, 1, 1, 0, 1]]
  18. params=init_params('TfidfTransformer')
  19. tt_model=TfidfTransformer_train(train_data,params)
  20. TfidfTransformer_apply(tt_model)

7.TfidfTransformer训练及应用函数

  1. def TfidfVectorizer_train(train_data,params):
  2. tv = TfidfVectorizer(**params)
  3. # 输入训练集矩阵,每行表示一个文本
  4. # 训练,构建词汇表以及词项idf值,并将输入文本列表转成VSM矩阵形式
  5. tv_fit = tv.fit_transform(train_data)
  6. return tv
  7. def TfidfVectorizer_apply(tv_model):
  8. print('tv_model词汇表')
  9. print(tv_model.vocabulary_)
  10. print('------------------------------')
  11. print('tv_model特证名/词汇列表')
  12. print(tv_model.get_feature_names())
  13. print('------------------------------')
  14. print('idf_列表')
  15. print(tv_model.idf_)
  16. print('------------------------------')
  17. data=['Tokyo Japan Chinese']
  18. print('{} 文本转化VSM矩阵'.format(data))
  19. print(tv_model.transform(data).toarray())
  20. print('------------------------------')
  21. print('转化结果输出为dataframe')
  22. print(pd.DataFrame(tv_model.transform(data).toarray(),columns=tv_model.get_feature_names()))
  23. print('------------------------------')
  24. print('tv_model参数查看')
  25. print(tv_model.get_params())
  26. print('------------------------------')
  27. train_data = ["Chinese Beijing Chinese",
  28. "Chinese Chinese Shanghai",
  29. "Chinese Macao",
  30. "Tokyo Japan Chinese"]
  31. params=init_params('TfidfVectorizer')
  32. tv_model=TfidfVectorizer_train(train_data,params)
  33. TfidfVectorizer_apply(tv_model)

  将train_data的tf-idf矩阵转化为dataframe结果:

pd.DataFrame(tv_model.transform(train_data).toarray(),columns=tv_model.get_feature_names())

图片

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/930902
推荐阅读
相关标签
  

闽ICP备14008679号