TF-IDF算法(2)—python实现
参加完数模之后休息了几天,今天继续看TF-IDF算法。上篇中对TF-IDF算法已经做了详细的介绍,在此不再赘述。今天主要是通过python,结合sklearn库实现该算法,并通过k-means算法实现简单的文档聚类。
一 结巴分词
1.简述
中文分词是中文文本处理的一个基础性工作,长久以来,在Python编程领域,一直缺少高准确率、高效率的分词组建,结巴分词正是为了满足这一需求而提出。
2.安装
(1)全自动安装
在安装了easy—stall的情况之下可以全自动安装:easy_install jieba
(2)半自动安装
•下载地址:https://pypi.python.org/pypi/jieba/
•在cmd下找到具体的目录python setup.py安装
3.功能
(1)全模式:将句子中所有的可以成词的词语都扫描出来,速度非常快,但是不能解决歧义问题;
jieba.cut方法接收两个参数:第一个参数为需要分词的字符串,第二个cut_all参数用来控制是否采用全模式进行分词。
>>> #coding:utf-8
>>> import jieba
>>> seg_list = jieba.cut("我爱西邮西邮爱我",cut_all = True)
>>> print "Full Mode:","/".join(seg_list)
Full Mode: 我/爱/西/邮/西/邮/爱/我
(2)精确模式:将句子最精确分开,适合文本分析:
>>> seg_list = jieba.cut("喜欢玩游戏,可以把编程当成玩游戏,还挺好玩的,哈哈哈哈")
>>> print "Default Mode:", "/ ".join(seg_list)
Default Mode: 喜欢/ 玩游戏/ ,/ 可以/ 把/ 编程/ 当成/ 玩游戏/ ,/ 还/ 挺好玩/ 的/ ,/ 哈哈哈哈
除此之外,默认表示的也是精确模式:
>>> seg_list = jieba.cut("喜欢玩游戏,可以把编程当成玩游戏,还挺好玩的,哈哈哈哈")
>>> print ",".join(seg_list)
(3)搜索引擎模式:在精确模式的基础上,对长词再次切分 ,提高召回率。
jieba.cut_for_search方法只接收需要分词的字符串,这种方法分词分的比较细:
>>> seg_list = jieba.cut_for_search("西邮就是西安邮电大学的简称")
>>> print ",".join(seg_list)
结果:西邮,就是,西安,邮电,电大,大学,邮电大学,的,简称
当然结巴分词还有很多功能,比如添加字典啊什么的,在此不再详细说明。
二 scikit-learn
scikit-learn含有完善的文档和丰富的机器学习算法,已经实现了所有基本的机器学习算法,并且其本身就带有一些标准的数据集。比如用来分类的iris数据集、digits数据集;用来回归的boston house price 数据集。
更多内容见http://dataunion.org/20071.html。
三 python实现TF-IDF算法
之前用的是python3.4,但由于不可抗的原因,又投入了2.7的怀抱,在这里编写一段代码,简单的实现TF-IDF算法。大致的实现过程是读入一个测试文档,计算出文档中出现的词的tfidf值,并保存在另一个文档中。
# -*- coding: cp936 -*-
import jieba
import jieba.posseg as pseg
import os
import sys
from sklearn import feature_extraction
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )
sys.path.append("C:\Users\Administrator\Desktop\9.17")
from numpy import * fr = open('exercise.txt')
fr_list = fr.read()
dataList = fr_list.split('\n')
data = []
for oneline in dataList:
data.append(" ".join(jieba.cut(oneline))) #将得到的词语转换为词频矩阵
freWord = CountVectorizer() #统计每个词语的tf-idf权值
transformer = TfidfTransformer()
#计算出tf-idf(第一个fit_transform),并将其转换为tf-idf矩阵(第二个fit_transformer)
tfidf = transformer.fit_transform(freWord.fit_transform(data)) #获取词袋模型中的所有词语
word = freWord.get_feature_names() #得到权重
weight = tfidf.toarray()
tfidfDict = {}
for i in range(len(weight)):
for j in range(len(word)):
getWord = word[j]
getValue = weight[i][j]
if getValue != 0:
if tfidfDict.has_key(getWord):
tfidfDict[getword] += string.atof(getValue)
else:
tfidfDict.update({getWord:getValue})
sorted_tfidf = sorted(tfidfDict.iteritems(),
key = lambda d:d[1],reverse = True)
fw = open('result.txt','w')
for i in sorted_tfidf:
fw.write(i[0] + '\t' + str(i[1]) +'\n')
至此,对算法已经有了一个简单的实现,接下来需要做的是将其应用到文档聚类中加以运用。
四 实现简单的文本聚类
要聚类,聚什么是重点!结合上述分析,我们可以将一篇文章中的关键词和对应的tf-idf值一一对应起来,显然想到的是dict,那么聚类是聚的当然不止一篇文章,那么我们就可以分别将每篇文章的关键词和对应的tf-idf值对应起来,最后整合起来进行聚类,当然还是得用到dict。
结合上述tf-idf的实现,可以将得到的结果分别存在同一个目录下的.txt中,导入目录读取并整合,直接上代码:
# -*- coding: cp936 -*-
#-*- coding:utf-8 -*-
from PIL import Image,ImageDraw
import os, codecs, random
from math import sqrt #将得到的结果按照字典存放
rows_norms = {}
def readfile(dirname):
rows = {}
for f in os.listdir(dirname):#目录
fr = codecs.open(dirname + f,'r',encoding = 'utf-8')
tw_dict = {}
norm = 0
for line in fr:
items = line.split('\t')
token = items[0].strip()
if len(token)<2:
continue
w = float(items[1].strip())
norm = w**2
tw_dict[token] = w
rows[str(f[:-4])] = tw_dict
rows_norms[str(f[:-4])] = sqrt(float(norm))
#print len(rows)
return rows
至此,相当于得到了数据,接下来就是k-means算法的实现了,之前的文章中都有详细说明,在此不再赘述,所不同的是在此采用了余弦距离计算相似度:
#得到余弦距离,其中v1就是row,v2是聚类中心点
def cosine(v1,norm_v1,v2,norm_v2):
if norm_v1 == 0 or norm_v2 == 0:
return 1.0
dividend = 0
for k,v in v1.items():
for k in v2:
dividend += v*v2[k]
return 1.0-dividend/(norm_v1*norm_v2)
主程序段如下:
#算法的实现
def kcluster(rows,distance=cosine,k=3):
ranges=rows_range(rows)
#初始化聚类中心
clusters=[]
for i in range(k):
clusters.append(random_vec(ranges)) clusteres_norm=[]
for i in range(k):
clusteres_norm.append(norm(clusters[i]))
lastmatches=None
#开始迭代
for t in range(300):
print '第%d次迭代' % t
bestmatches=[[] for i in range(k)]
for j in rows.keys():
row=rows[j]
row_norm=rows_norms[j]
bestmatch=0
min_dis=10000000
for i in range(k):
d=distance(row, row_norm, clusters[i],clusteres_norm[i])
if d<min_dis:
bestmatch=i
min_dis=d
bestmatches[bestmatch].append(j)
if bestmatches==lastmatches:
break
lastmatches=bestmatches
for i in range(k):
clusters[i]=center(bestmatches[i], rows)
print bestmatches
return bestmatches #test
if __name__ == '__main__':
corpus_dir='D:/python2.7/exercise/clusting/data/'
rows=readfile(corpus_dir)
print 'create vectorspace'
n=3
clust=kcluster(rows,k=n)
简单测试,结果还是挺理想的,但还是可以结合之前对k-means算法的优化,实现更好的聚类。
TF-IDF算法(2)—python实现的更多相关文章
- tf–idf算法解释及其python代码实现(下)
		
tf–idf算法python代码实现 这是我写的一个tf-idf的简单实现的代码,我们知道tfidf=tf*idf,所以可以分别计算tf和idf值在相乘,首先我们创建一个简单的语料库,作为例子,只有四 ...
 - tf–idf算法解释及其python代码实现(上)
		
tf–idf算法解释 tf–idf, 是term frequency–inverse document frequency的缩写,它通常用来衡量一个词对在一个语料库中对它所在的文档有多重要,常用在信息 ...
 - tf–idf算法解释及其python代码
		
tf–idf算法python代码实现 这是我写的一个tf-idf的简单实现的代码,我们知道tfidf=tf*idf,所以可以分别计算tf和idf值在相乘,首先我们创建一个简单的语料库,作为例子,只有四 ...
 - 55.TF/IDF算法
		
主要知识点: TF/IDF算法介绍 查看es计算_source的过程及各词条的分数 查看一个document是如何被匹配到的 一.算法介绍 relevance score算法,简单来说 ...
 - Elasticsearch由浅入深(十)搜索引擎:相关度评分 TF&IDF算法、doc value正排索引、解密query、fetch phrase原理、Bouncing Results问题、基于scoll技术滚动搜索大量数据
		
相关度评分 TF&IDF算法 Elasticsearch的相关度评分(relevance score)算法采用的是term frequency/inverse document frequen ...
 - 25.TF&IDF算法以及向量空间模型算法
		
主要知识点: boolean model IF/IDF vector space model 一.boolean model 在es做各种搜索进行打分排序时,会先用boolean mo ...
 - Elasticsearch学习之相关度评分TF&IDF
		
relevance score算法,简单来说,就是计算出,一个索引中的文本,与搜索文本,他们之间的关联匹配程度 Elasticsearch使用的是 term frequency/inverse doc ...
 - 基于TF/IDF的聚类算法原理
		
一.TF/IDF描述单个term与特定document的相关性TF(Term Frequency): 表示一个term与某个document的相关性. 公式为这个term在document中出 ...
 - 信息检索中的TF/IDF概念与算法的解释
		
https://blog.csdn.net/class_brick/article/details/79135909 概念 TF-IDF(term frequency–inverse document ...
 - TF-IFD算法及python实现关键字提取
		
TF-IDF算法: TF:词频(Term Frequency),即在分词后,某一个词在文档中出现的频率. IDF:逆文档频率(Inverse Document Frequency).在词频的基础上给每 ...
 
随机推荐
- Oracle数据库常见版本
			
Oracle数据库常见版本 在Oracle数据库的发展中,数据库一直处于不断升级状态,有以下几个版本: Oracle 8,Oracle 8i:Oracle 8i表示Oracle正式向Internet上 ...
 - XML_CPP_资料_libxml2库函数详解
			
http://blog.csdn.net/hanchaoman/article/details/42557195 许多事物符合80/20法则,libxml中也是20%的函数提供了80%的功能.下面的列 ...
 - Qt5.3.2_CentOS6.4(x86)_代码文件编码
			
1.1.1.Qt5.3.2_MinGW 在Windows中安装时,默认的文件编码是 UTF8. 1.2.在 CentOS6.4中安装 qt-opensource-linux-x86-5.3.2.run ...
 - unity项目针对IOS及Android平台的音频压缩格式
			
IOS : 建议采用MP3格式, Android : 建议采用Vorbis格式, 因为这两种格式分别在这两个平台上有硬件解码的支持, 硬件解码比软件解码快.
 - grub 启动错误 "file not found"
			
刚安装ubuntu 14.4 竟然出现这么尴尬的事,ubuntu 行不行? 幸好还是能从u盘启动后,转到硬盘. 然后在网上找到了解决方法. http://askubuntu.com/questions ...
 - Yii中的CComponent应用实例
			
首先我们先了解一下如何创建一个CComponent,手册讲述如下: CComponent 是所有组件类的基类. CComponent 实现了定义.使用属性和事件的协议. 属性是通过getter方法或/ ...
 - CentOS 配置Tomcat服务脚本
			
#!/bin/bash # description: Tomcat7 Start Stop Restart # processname: tomcat7 # chkconfig: JAVA_HOME= ...
 - CF1082G Petya and Graph
			
题意 定义图权 = 图中边权总和 - 图中点权总和(空图的图权=0),求 n 个点 m 条边的无向图最大权子图. 把边看成点,这个点与两个原图中的点连边.直接最小割求最大闭合子图即可.
 - Necklace CodeForces - 613C (构造)
			
链接 大意: 给定n种珠子, 第i种有$a_i$个, 求将珠子穿成项链, 使得能使切开后的项链回文的切口尽量多 若有一种以上珠子为奇数, 显然不能为回文, 否则最大值一定是$gcd(a_1,a_2,. ...
 - Java使用FFmpeg处理视频文件指南
			
Java使用FFmpeg处理视频文件指南 本文主要讲述如何使用Java + FFmpeg实现对视频文件的信息提取.码率压缩.分辨率转换等功能: 之前在网上浏览了一大圈Java使用FFmpeg处理音视频 ...