python机器学习——分词

使用jieba库进行分词

安装jieba就不说了,自行百度!

import jieba

将标题分词,并转为list

seg_list = list(jieba.cut(result.get("title"), cut_all=False))

所有标题使用空格连接,方便后面做自然语言处理

para = para + " ".join(seg_list)

将分词后的标题(使用空格分割的标题)放到一个list里面

summaryList.insert(0," ".join(seg_list))

 

统计词频

from nltk.tokenize import WordPunctTokenizer
import nltk

tokenizer = WordPunctTokenizer()
#统计词频
sentences = tokenizer.tokenize(para)#此处将para转为list(16进制字符)
wordFreq=nltk.FreqDist(sentences)
for i in wordFreq:print i,wordFreq[i]

 

转化为词袋,这一步的输入是一系列的句子(词与词之间使用空格分开),构成的列表。得到的结果是句子中关键词构成的一个列表,称为词袋

#转换为词袋
vectorizer = CountVectorizer(min_df=1,max_df=50)
#summaryList 是一个列表,每一个元素是一个句子 词与词之间使用空格分开,默认不会处理单个词(即一个汉字的就会忽略)
#可以通过修改vectorizer的正则表达式,解决不处理单个字的问题
vectorizer.token_pattern='(?u)\\b\\w+\\b'
X = vectorizer.fit_transform(summaryList)

print X.shape
nums,features=X.shape   #帖子数量和词袋中的词数,通过X.getrow(i)  获取每个帖子对应的向量

print vectorizer print str(vectorizer.get_feature_names()).decode("unicode-escape")

 

一个计算欧式距离的函数

#计算欧式距离
def dist_raw(v1,v2):
    delta=v1-v2
    return sp.linalg.norm(delta.toarray())

 

计算新帖的向量

#测试
new_para='我要吃苹果不吃香蕉'
new_para_list=" ".join(list(jieba.cut(new_para, cut_all=False)))
new_vec=vectorizer.transform([new_para_list])#new_para_list 是一个句子,词之间使用空格分开
print 'new_vec:',new_vec

 

计算新帖字与原帖子的距离

for i in range(0,nums):
    para = paras[i]
    para_vec=X.getrow(i)
    d=dist_raw(new_vec,para_vec)
    print para," = ",d

 

 

所有代码:

#!/usr/bin/python
# -*- coding: utf-8 -*-
print 'test OK'
import sys
from nltk.tokenize import WordPunctTokenizer
import nltk
import jieba
from sklearn.feature_extraction.text import CountVectorizer
import scipy as sp

reload(sys)
sys.setdefaultencoding("utf-8")

tokenizer = WordPunctTokenizer()
summaryList = [];
file=open("./para.txt")
paras=file.readlines()
words=""
for para in paras:
    print para
    seg_list = list(jieba.cut(para, cut_all=False))
    words +=" ".join(seg_list)
    summaryList.insert(0," ".join(seg_list))
#para='I like eat apple because apple is red but because I love fruit'
#统计词频
sentences = tokenizer.tokenize(words)#此处将para转为list
#print sentences
wordFreq=nltk.FreqDist(sentences)
print str(wordFreq.keys()).decode("unicode-escape")
#print dir(wordFreq)
for i in wordFreq:
    print i,wordFreq[i]

print str(summaryList).decode("unicode-escape")
#转换为词袋
vectorizer = CountVectorizer(min_df=1,max_df=50)
#summaryList 是一个列表,每一个元素是一个句子 词与词之间使用空格分开,默认不会处理单个词(即一个汉字的就会忽略)
#可以通过修改vectorizer的正则表达式,解决不处理单个字的问题
vectorizer.token_pattern='(?u)\\b\\w+\\b'
X = vectorizer.fit_transform(summaryList)
print str(vectorizer.get_feature_names()).decode("unicode-escape")
print X.shape
nums,features=X.shape   #帖子数量和词袋中的词数

#计算欧式距离
def dist_raw(v1,v2):
    delta=v1-v2
    return sp.linalg.norm(delta.toarray())

#测试
new_para='我要吃苹果不吃香蕉'
new_para_list=" ".join(list(jieba.cut(new_para, cut_all=False)))
new_vec=vectorizer.transform([new_para_list])#new_para_list 是一个句子,词之间使用空格分开
print 'new_vec:',new_vec

for i in range(0,nums):
    para = paras[i]
    para_vec=X.getrow(i)
    d=dist_raw(new_vec,para_vec)
    print para," = ",d
View Code

 

版本二:

 1 #!/usr/bin/python
 2 # -*- coding: utf-8 -*-
 3 print 'test OK'
 4 import sys
 5 from nltk.tokenize import WordPunctTokenizer
 6 import nltk
 7 import jieba
 8 from sklearn.feature_extraction.text import CountVectorizer
 9 import scipy as sp
10 
11 reload(sys)
12 sys.setdefaultencoding("utf-8")
13 
14 tokenizer = WordPunctTokenizer()
15 summaryList = [];
16 file=open("./para.txt")
17 paras=file.readlines()
18 words=""
19 for para in paras:
20     print para
21     seg_list = list(jieba.cut(para, cut_all=False))
22     words +=" ".join(seg_list)
23     summaryList.insert(0," ".join(seg_list))
24 #para='I like eat apple because apple is red but because I love fruit'
25 #统计词频
26 sentences = tokenizer.tokenize(words)#此处将para转为list
27 #print sentences
28 wordFreq=nltk.FreqDist(sentences)
29 print str(wordFreq.keys()).decode("unicode-escape")
30 #print dir(wordFreq)
31 
32 print str(summaryList).decode("unicode-escape")
33 #转换为词袋
34 vectorizer = CountVectorizer(min_df=0,max_df=20)
35 #summaryList 是一个列表,每一个元素是一个句子 词与词之间使用空格分开,默认不会处理单个词(即一个汉字的就会忽略)
36 #可以通过修改vectorizer的正则表达式,解决不处理单个字的问题
37 #vectorizer.token_pattern='(?u)\\b\\w+\\b'
38 X = vectorizer.fit_transform(summaryList)
39 print str(vectorizer.get_feature_names()).decode("unicode-escape")
40 print X.shape
41 nums,features=X.shape   #帖子数量和词袋中的词数
42 
43 #计算欧式距离
44 def dist_raw(v1,v2):
45     delta=v1-v2
46     return sp.linalg.norm(delta.toarray())
47 
48 #测试
49 new_para='夏季新款清新碎花雪纺连衣裙,收腰显瘦设计;小V领、小碎花、荷叶袖、荷叶边的结合使得这款连衣裙更显精致,清新且显气质。'
50 new_para_list=" ".join(list(jieba.cut(new_para, cut_all=False)))
51 new_vec=vectorizer.transform([new_para_list])#new_para_list 是一个句子,词之间使用空格分开
52 #print 'new_vec:',new_vec.toarray()
53 
54 minDis = 9999
55 title=""
56 for i in range(0,nums):
57     para = summaryList[i]
58     para_vec=X.getrow(i)
59     d=dist_raw(new_vec,para_vec)
60     #print X.getrow(i).toarray(),' = ',d
61     if(minDis > d):
62         minDis = d
63         title = para
64 print title," = ",d
65 print new_para_list
66 print title
View Code

 

运行结果:

转载于:https://www.cnblogs.com/tengpan-cn/p/6934275.html

此为学习版,请勿用于商业用途或扩散。 以下描述转至互联网。 ============== 一、CSW中分词组件简介 CSW中文分词组件,是一套可自动将一段文本按常规汉语词组进行拆分,并以指定方式进行分隔的COM组件。本组件采用独有的高效的分词引擎及拆分算法,具有准确、高速、资源占用率小等特点。为了满足客户对文本语义进行研究分析的需要,本组件同时提供词性及词频标注功能,可根据用户要求,对其拆分后的词组进行词性标注或词频标注。互联网信息检索、数据库信息查询、智能聊天机器人、文本校对、自动翻译、 自动摘要、自动分类及信息加工处理等各个领域。 二、本组件特点: 1.适应性强 本组全部件采用ANSI标准C++开发,可广泛应用于当今的操作系统平台上,如:MS Windows、Linux及其它各公司出品的Unix操作系统。 2. 支持范围广 在MS Windows平台下,本组件以COM接口的DLL格式进行封装,可支持所有支持COM接口调用的编程语言及脚本语言。如:PHP、JSP、ASP、ASP.net、C/C++ 、VC6.0 、VC.net、BC、C#、VB6.0 、VB.net、Delphi、Java等。 3. 响应速度快 由于本组件采用高效特殊的算法引擎结构,每秒钟拆分可达数万字汉语文本,在对搜索关键词进行拆分情况下,其响应时间均在数毫秒之内,为搜索提供强劲动力。 4. 词组识别准确率高 采用特殊的词组拆分识别算法,可有效消除汉语词组中汉语歧义,并可识别各个行业内的特殊用语、专用词汇、公司名、地名等,并具有汉语成语、汉语短语识别功能。如:'醉翁之意不在酒'。经长期使用及大量文本测试其准确率可达到92%以上。 5. 拆分覆盖面广 含盖了IT、化工、金融、贸易、纺织、电子、制造、冶金等各行各业以及日常生活用语中的汉语词组。 6. 提供词组自定义功能 可根据用户需要自行添加汉语词组,并提单个汉字添加或从文件批量添加功能。 7.特殊字符过滤功能 可根据用户需要自行定义影响检索结果的不必要的字符。如:! % *等。 9. 具有英文分词识别功能。 本组件同时具有英文单词的分词识别功能。 10. 词性标注功能。(限企业A版) 词性:即词组在汉语语言中所表述的性质。如:计算机 /名词; 中国 / 名词,方位词 此功能可对拆分出的汉语词组进行词性标注,辅以开发人员理解分析文本序列中所包含的语义或意图。其广泛应用于互联网信息搜索以提高搜索精度、智能聊天机器人理解对方话语的含义等领域。整个分词标注以北京大学词性标注集为标准。(详细可参见词性标注表) 11. 词频标注功能。(限企业B版) 词频:即词组在广域的所有汉语词组中出现的相对频率值。 此功能可对拆分出的汉语词组进行词频标识。为开发人员在对搜索关键词的理解分析上提供有效的参考,以提高检索精度。整个词频标识是以各大报刊媒体文章为基础,经过精心的统计分析制作而成,具有相当的参考价值。 三、在线演示/免费下载 在线演示:http://61.129.81.124/csw/csw50.asp 四、各语言调用示例代码 参数一:InputString[string类型] 需进行分词的原始文本 参数二:OutputType[int整型] 输出类型 (0 标准分词输出, 1 附带词性输出, 2 附带词频输出) 参数三:DllPath[string类型] 本组件在系统中的完整路径 返回:OutputString[string类型] 输出分词后的文本序列 1. C#调用示例代码 首先运行本组件包中的install.bat文件,在系统中注册本组件。 然后在开发工具中引用CSW.dll组件 //以下为C#控制台应用程序中调用本组件示例代码. CSWLib.SplitWordClass csw = new CSWLib.SplitWordClass(); string text = csw.Split('待拆分原始文本',0,@'c:winntsystem'); Console.WriteLine(text); Console.ReadLine(); //暂停,查看输出 访问官方网站获得更多代码示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值