【ZH奶酪】如何用sklearn计算中文文本TF-IDF?
1. 什么是TF-IDF
tf-idf(英语:term frequency–inverse document frequency)是一种用于信息检索与文本挖掘的常用加权技术。tf-idf是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。
2. 如何用sklearn计算TF-IDF?
2.1 语料集
本文所用语料集为人机对话系统中的短文本语料,corpus列表中的每个元素是一条Query。(如果是长文本的话,每个元素是一篇文档)
corpus = [
"帮我 查下 明天 北京 天气 怎么样",
"帮我 查下 今天 北京 天气 好不好",
"帮我 查询 去 北京 的 火车",
"帮我 查看 到 上海 的 火车",
"帮我 查看 特朗普 的 新闻",
"帮我 看看 有没有 北京 的 新闻",
"帮我 搜索 上海 有 什么 好玩的",
"帮我 找找 上海 东方明珠 在哪"
]
2.2 将语料转换为词袋向量
step 1. 声明一个向量化工具vectorizer
本文使用的是CountVectorizer,默认情况下,CountVectorizer仅统计长度超过两个字符的词,但是在短文本中任何一个字都可能十分重要,比如“去/到”等,所以要想让CountVectorizer也支持单字符的词,需要加上参数
token_pattern='\\b\\w+\\b'。
step 2. 根据语料集统计词袋(fit);
step 3. 打印语料集的词袋信息;
step 4. 将语料集转化为词袋向量(transform);
step 5. 还可以查看每个词在词袋中的索引;
代码
from sklearn.feature_extraction.text import CountVectorizer
# step 1
vectoerizer = CountVectorizer(min_df=1, max_df=1.0, token_pattern='\\b\\w+\\b')
# step 2
vectoerizer.fit(corpus)
# step 3
bag_of_words = vectoerizer.get_feature_names()
print("Bag of words:")
print(bag_of_words)
print(len(bag_of_words))
# step 4
X = vectoerizer.transform(corpus)
print("Vectorized corpus:")
print(X.toarray())
# step 5
print("index of `的` is : {}".format(vectoerizer.vocabulary_.get('的')))
输出
Bag of words:
['上海', '东方明珠', '什么', '今天', '到', '北京', '去', '在哪', '天气', '好不好', '好玩的', '帮我', '怎么样', '找找', '搜索', '新闻', '明天', '有', '有没有', '查下', '查看', '查询', '火车', '特朗普', '的', '看看']
26
Vectorized corpus:
[[0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 1 0 0 1 0 0 0 0 0 0]
[0 0 0 1 0 1 0 0 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0]
[0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0]
[1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0]
[0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 1 0]
[0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1]
[1 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0]
[1 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0]]
index of `的` is : 24
2.3 根据词袋向量统计TF-IDF
step 1. 声明一个TF-IDF转化器(TfidfTransformer);
step 2. 根据语料集的词袋向量计算TF-IDF(fit);
step 3. 打印TF-IDF信息:比如结合词袋信息,可以查看每个词的TF-IDF值;
step 4. 将语料集的词袋向量表示转换为TF-IDF向量表示;
from sklearn.feature_extraction.text import TfidfTransformer
# step 1
tfidf_transformer = TfidfTransformer()
# step 2
tfidf_transformer.fit(X.toarray())
# step 3
for idx, word in enumerate(vectoerizer.get_feature_names()):
print("{}\t{}".format(word, tfidf_transformer.idf_[idx]))
# step 4
tfidf = tfidf_transformer.transform(X)
print(tfidf.toarray())
输出
上海 1.8109302162163288
东方明珠 2.504077396776274
什么 2.504077396776274
今天 2.504077396776274
到 2.504077396776274
北京 1.587786664902119
去 2.504077396776274
在哪 2.504077396776274
天气 2.09861228866811
好不好 2.504077396776274
好玩的 2.504077396776274
帮我 1.0
怎么样 2.504077396776274
找找 2.504077396776274
搜索 2.504077396776274
新闻 2.09861228866811
明天 2.504077396776274
有 2.504077396776274
有没有 2.504077396776274
查下 2.09861228866811
查看 2.09861228866811
查询 2.504077396776274
火车 2.09861228866811
特朗普 2.504077396776274
的 1.587786664902119
看看 2.504077396776274
[[0. 0. 0. 0. 0. 0.3183848
0. 0. 0.42081614 0. 0. 0.20052115
0.50212047 0. 0. 0. 0.50212047 0.
0. 0.42081614 0. 0. 0. 0.
0. 0. ]
[0. 0. 0. 0.50212047 0. 0.3183848
0. 0. 0.42081614 0.50212047 0. 0.20052115
0. 0. 0. 0. 0. 0.
0. 0.42081614 0. 0. 0. 0.
0. 0. ]
[0. 0. 0. 0. 0. 0.33116919
0.52228256 0. 0. 0. 0. 0.20857285
0. 0. 0. 0. 0. 0.
0. 0. 0. 0.52228256 0.43771355 0.
0.33116919 0. ]
[0.38715525 0. 0. 0. 0.53534183 0.
0. 0. 0. 0. 0. 0.21378805
0. 0. 0. 0. 0. 0.
0. 0. 0.44865824 0. 0.44865824 0.
0.33944982 0. ]
[0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.23187059
0. 0. 0. 0.48660646 0. 0.
0. 0. 0.48660646 0. 0. 0.5806219
0.36816103 0. ]
[0. 0. 0. 0. 0. 0.33116919
0. 0. 0. 0. 0. 0.20857285
0. 0. 0. 0.43771355 0. 0.
0.52228256 0. 0. 0. 0. 0.
0.33116919 0.52228256]
[0.33420711 0. 0.4621274 0. 0. 0.
0. 0. 0. 0. 0.4621274 0.18454996
0. 0. 0.4621274 0. 0. 0.4621274
0. 0. 0. 0. 0. 0.
0. 0. ]
[0.37686288 0.52110999 0. 0. 0. 0.
0. 0.52110999 0. 0. 0. 0.20810458
0. 0.52110999 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0. ]]
参考资料
- TF-IDF-维基百科
- 学习sklearn之文本特征提取
- sklearn.feature_extraction.text.CountVectorizer
- sklearn.feature_extraction.text.TfidfTransformer
【ZH奶酪】如何用sklearn计算中文文本TF-IDF?的更多相关文章
- 【ZH奶酪】如何用textgenrnn处理中文
如何用textgenrnn处理中文 1. 什么是textgenrnn? textgenrnn是建立在Keras和TensorFlow之上的,可用于生成字级别和词级别文本.网络体系结构使用注意力加权来加 ...
- 利用sklearn计算文本相似性
利用sklearn计算文本相似性,并将文本之间的相似度矩阵保存到文件当中.这里提取文本TF-IDF特征值进行文本的相似性计算. #!/usr/bin/python # -*- coding: utf- ...
- word2vec词向量训练及中文文本类似度计算
本文是讲述怎样使用word2vec的基础教程.文章比較基础,希望对你有所帮助! 官网C语言下载地址:http://word2vec.googlecode.com/svn/trunk/ 官网Python ...
- 如何用Python从海量文本抽取主题?
摘自https://www.jianshu.com/p/fdde9fc03f94 你在工作.学习中是否曾因信息过载叫苦不迭?有一种方法能够替你读海量文章,并将不同的主题和对应的关键词抽取出来,让你谈笑 ...
- [转]python进行中文文本聚类(切词以及Kmeans聚类)
简介 查看百度搜索中文文本聚类我失望的发现,网上竟然没有一个完整的关于Python实现的中文文本聚类(乃至搜索关键词python 中文文本聚类也是如此),网上大部分是关于文本聚类的Kmeans聚类的原 ...
- 万字总结Keras深度学习中文文本分类
摘要:文章将详细讲解Keras实现经典的深度学习文本分类算法,包括LSTM.BiLSTM.BiLSTM+Attention和CNN.TextCNN. 本文分享自华为云社区<Keras深度学习中文 ...
- ChineseCounter.cs 统计中文文本中常用字占比
http://www.tuicool.com/articles/qmMba2 1 using System; using System.IO; using System.Collections.Gen ...
- 自然语言处理--中文文本向量化counterVectorizer()
1.载入文档 #!/usr/bin/python # -*- coding: utf-8 -*- import pandas as pd import re import jieba from skl ...
- 推荐 | 中文文本标注工具Chinese-Annotator(转载)
自然语言处理的大部分任务是监督学习问题.序列标注问题如中文分词.命名实体识别,分类问题如关系识别.情感分析.意图分析等,均需要标注数据进行模型训练.深度学习大行其道的今天,基于深度学习的 NLP 模型 ...
随机推荐
- SPLAY,LCT学习笔记(一)
写了两周数据结构,感觉要死掉了,赶紧总结一下,要不都没学明白. SPLAY专题: 例:NOI2005 维修数列 典型的SPLAY问题,而且综合了SPLAY常见的所有操作,特别适合新手入门学习(比如我这 ...
- python3 + selenium 之元素定位
8种定位方式 定位一个元素 webdriver提供了一系列的对象定位方法,常用的有以下几种 driver.find_element_by_name()--最常用,简单 driver.find_elem ...
- javafx实现模态/模式窗口
import javafx.stage.*; import javafx.scene.*; import javafx.scene.paint.Color; import javafx.scene.c ...
- 我靠,上班eclipse看糗事百科
package test; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URL; ...
- Nordic Collegiate Programming Contest NCPC 2017-Problem D-Distinctive Character
题目大意:给你n(n<=1e5)个二进制串 (每个串位数不超过20),定义两个串的相似度为对应 位置上相同的个数. 让你构造一个二进制串,使这个串与所给的这些串的相似度的最小值最大. 思路:刚开 ...
- Linux 关闭网络管理服务
1 将NetworkManager 服务设置开机不启动 chkconfig NetworkManager off 2将NetwokManager服务关闭 service NetworkManager ...
- HDU1711 Number Sequence KMP
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - HDU1711 题意概括 给T组数据,每组有长度为n和m的母串和模式串.判断模式串是否是母串的子串,如果是输出 ...
- 深入理解 MySQL ——锁、事务与并发控制
本文首发于vivo互联网技术微信公众号 mp.weixin.qq.com/s/JFSDqI5ya… 作者:张硕 本文对 MySQL 数据库中有关锁.事务及并发控制的知识及其原理做了系统化的介绍和总结, ...
- egrep 实用参数
-n :顺便输出行号 -v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!-r : --recursive -i :忽略大小写的不同,所以大小写视为相同 -c :计算找到 '搜寻字符串' ...
- 论文--Topic-Sensitive PageRank
背景 原有的PageRank方法:通过web上链接结构信息得到页面之间相对的重要性,和特定的查询内容无关 论文涉及到的其他算法 HITS Hilltop,处理常见的流行查询 popular query ...