A. 怎么是用python 语言 使用结巴分词 呢
Python代码
#encoding=utf-8
importjieba
seg_list=jieba.cut("我来到北京清华大学",cut_all=True)
print"FullMode:","/".join(seg_list)#全模式
seg_list=jieba.cut("我来到北京清华大学",cut_all=False)
print"DefaultMode:","/".join(seg_list)#默认模式
seg_list=jieba.cut("他来到了网易杭研大厦")
print",".join(seg_list)
输出:
FullMode:我/来/来到/到/北/北京/京/清/清华/清华大学/华/华大/大/大学/学
DefaultMode:我/来到/北京/清华大学
他,来到,了,网易,杭研,大厦(此处,“杭研”并没有在词典中,但是也被Viterbi算法识别出来了)
B. jieba分词(R vs. python)
自然语言处理(NLP)是机器学习重要分支之一,主要应用于篇章理解、文本摘要、情感分析、知识图谱、文本翻译等领域。而NLP应用首先是对文本进行分词,当前中文分词器有Ansj、paoding、盘古分词等多种,而最基础的分词器应该属于jieba分词器(比较见下图)。
下面将分别应用R和python对jieba分词器在中文分词、词性标注和关键词提取领域的应用进行比较。
R实现
通过函数worker()来初始化分词引擎,使用segment()进行分词。有四种分词模式:最大概率法(MP)、隐马尔科夫模型(HMM)、混合模型(Mix)及索引模型(query),默认为混合模型。具体可查看help(worker).
#install.packages('jiebaR')library(jiebaR)mixseg <- worker()segment( "这是一段测试文本" , mixseg ) #或者用以下操作mixseg['这是一段测试文本']mixseg <= "这是一段测试文本"
python实现
python中需安装jieba库,运用jieba.cut实现分词。cut_all参数为分词类型,默认为精确模式。
import jiebaseg_list = jieba.cut(u"这是一段测试文本",cut_all = False)print("Full mode: "+ ",".join(seg_list)) #默认精确模式
无论是R还是python都为utf—8编码。
R实现
可以使用<=.tagger 或者tag 来进行分词和词性标注,词性标注使用混合模型模型分词,标注采用和 ictclas 兼容的标记法。
words = "我爱北京天安门"tagger = worker("tag") #开启词性标注启发器tagger <= words # r v ns ns # "我" "爱" "北京" "天安门"
python实现
#词性标注import jieba.posseg as psegwords = pseg.cut("我爱北京天安门")for word,flag in words: print('%s, %s' %(word,flag))
R实现
R关键词提取使用逆向文件频率(IDF)文本语料库,通过worker参数“keywords”开启关键词提取启发器,topn参数为关键词的个数。
keys = worker("keywords",topn = 5, idf = IDFPATH)keys <= "会议邀请到美国密歇根大学(University of Michigan, Ann Arbor)环境健康科学系副教授奚传武博士作题为“Multibarrier approach for safe drinking waterin the US : Why it failed in Flint”的学术讲座,介绍美国密歇根Flint市饮用水污染事故的发生发展和处置等方面内容。讲座后各相关单位同志与奚传武教授就生活饮用水在线监测系统、美国水污染事件的处置方式、生活饮用水老旧管网改造、如何有效减少消毒副产物以及美国涉水产品和二次供水单位的监管模式等问题进行了探讨和交流。本次交流会是我市生活饮用水卫生管理工作洽商机制运行以来的又一次新尝试,也为我市卫生计生综合监督部门探索生活饮用水卫生安全管理模式及突发水污染事件的应对措施开拓了眼界和思路。"#结果:# 48.8677 23.4784 22.1402 20.326 18.5354 # "饮用水" "Flint" "卫生" "水污染" "生活"
python实现
python实现关键词提取可运用TF-IDF方法和TextRank方法。allowPOS参数为限定范围词性类型。
#关键词提取import jieba.analysecontent = u'会议邀请到美国密歇根大学(University of Michigan, Ann Arbor)环境健康科学系副教授奚传武博士作题为“Multibarrier approach for safe drinking waterin the US : Why it failed in Flint”的学术讲座,介绍美国密歇根Flint市饮用水污染事故的发生发展和处置等方面内容。讲座后各相关单位同志与奚传武教授就生活饮用水在线监测系统、美国水污染事件的处置方式、生活饮用水老旧管网改造、如何有效减少消毒副产物以及美国涉水产品和二次供水单位的监管模式等问题进行了探讨和交流。本次交流会是我市生活饮用水卫生管理工作洽商机制运行以来的又一次新尝试,也为我市卫生计生综合监督部门探索生活饮用水卫生安全管理模式及突发水污染事件的应对措施开拓了眼界和思路。'#基于TF-IDFkeywords = jieba.analyse.extract_tags(content,topK = 5,withWeight = True,allowPOS = ('n','nr','ns'))for item in keywords: print item[0],item[1] #基于TF-IDF结果# 饮用水 0.448327672795# Flint 0.219353532163# 卫生 0.203120821773# 水污染 0.186477211628# 生活 0.170049997544
#基于TextRankkeywords = jieba.analyse.textrank(content,topK = 5,withWeight = True,allowPOS = ('n','nr','ns'))for item in keywords: print item[0],item[1] #基于TextRank结果:# 饮用水 1.0# 美国 0.570564785973# 奚传武 0.510738424509# 单位 0.472841889334# 讲座 0.443770732053
写在文后
自然语言处理(NLP)在数据分析领域有其特殊的应用,在R中除了jiebaR包,中文分词Rwordseg包也非常常用。一般的文本挖掘步骤包括:文本获取(主要用网络爬取)——文本处理(分词、词性标注、删除停用词等)——文本分析(主题模型、情感分析)——分析可视化(词云、知识图谱等)。本文是自然语言处理的第一篇,后续将分别总结下应用深度学习Word2vec进行词嵌入以及主题模型、情感分析的常用NLP方法。
参考资料
Introction · jiebaR 中文分词 https://qinwenfeng.com/jiebaR/segment.html
知乎:【文本分析】利用jiebaR进行中文分词 https://zhuanlan.hu.com/p/24882048
雪晴数据网:全栈数据工程师养成攻略 http://www.xueqing.tv/course/73
搜狗实验室,词性标注应用 http://www.sogou.com/labs/webservice/
【R文本挖掘】中文分词Rwordseg http://blog.163.com/zzz216@yeah/blog/static/162554684201412895732586/
C. python 提取有关键词的句子怎么做
高频词提取:
# !/usr/bin/python3
# coding:utf-8
import jieba.analyse
jieba.load_userdict('dict.txt') # dict.txt自定义词典
content = open('kw.txt', 'rb').read()
tags = jieba.analyse.extract_tags(content, topK=10) # topK 为高频词数量
print("\n".join(tags))
D. 在python 环境下,使用结巴分词,自动导入文本,分词,提取关键词.脚本 大侠给个
#-*-coding:UTF-8-*-
importjieba
__author__='lpe234'
seg_list=jieba.cut("我来到北京天安门",cut_all=True)
print','.join(seg_list)
...
Loadingmodelfromcache/var/folders/sv//T/jieba.cache
我,来到,北京,天安,天安门
Loadingmodelcost0.433seconds.
.
Processfinishedwithexitcode0
E. Python中extract_tags()怎么对多行文本提取特征词而不是一行一行计算
[python] view plain
#coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
from multiprocessing import Pool,Queue,Process
import multiprocessing as mp
import time,random
import os
import codecs
import jieba.analyse
jieba.analyse.set_stop_words("yy_stop_words.txt")
def extract_keyword(input_string):
#print("Do task by process {proc}".format(proc=os.getpid()))
tags = jieba.analyse.extract_tags(input_string, topK=100)
#print("key words:{kw}".format(kw=" ".join(tags)))
return tags
#def parallel_extract_keyword(input_string,out_file):
def parallel_extract_keyword(input_string):
#print("Do task by process {proc}".format(proc=os.getpid()))
tags = jieba.analyse.extract_tags(input_string, topK=100)
#time.sleep(random.random())
#print("key words:{kw}".format(kw=" ".join(tags)))
#o_f = open(out_file,'w')
#o_f.write(" ".join(tags)+"\n")
return tags
if __name__ == "__main__":
data_file = sys.argv[1]
with codecs.open(data_file) as f:
lines = f.readlines()
f.close()
out_put = data_file.split('.')[0] +"_tags.txt"
t0 = time.time()
for line in lines:
parallel_extract_keyword(line)
#parallel_extract_keyword(line,out_put)
#extract_keyword(line)
print("串行处理花费时间{t}".format(t=time.time()-t0))
pool = Pool(processes=int(mp.cpu_count()*0.7))
t1 = time.time()
#for line in lines:
#pool.apply_async(parallel_extract_keyword,(line,out_put))
#保存处理的结果,可以方便输出到文件
res = pool.map(parallel_extract_keyword,lines)
#print("Print keywords:")
#for tag in res:
#print(" ".join(tag))
pool.close()
pool.join()
print("并行处理花费时间{t}s".format(t=time.time()-t1))
运行:
python data_process_by_multiprocess.py message.txt
message.txt是每行是一个文档,共581行,7M的数据
运行时间:
不使用sleep来挂起进程,也就是把time.sleep(random.random())注释掉,运行可以大大节省时间。
F. 用Python实现搜索某一网页中出现频率最高的前N个英文单词 输入: 网址,N值 输出:按出现频率由高到低排
好象是有一个jieba分词。国人写的,有一个小男孩的头像。挺简单,好玩。
它里有topN的算法。我把代码复制过来。你看一下。最关键的就一句话。
import sys
sys.path.append('../')
import jieba
import jieba.analyse
from optparse import OptionParser
USAGE ="usage: python extract_tags.py [file name] -k [top k]"
parser = OptionParser(USAGE)
parser.add_option("-k",dest="topK")
opt, args = parser.parse_args()
if len(args) <1:
print USAGE
#sys.exit(1)
file_name = args[0]
if opt.topK==None:
topK=10
else:
topK = int(opt.topK)
print file_name
content = open(file_name,'rb').read()
tags = jieba.analyse.extract_tags(content,topK=topK) #这一句
print ",".join(tags)
如果是英文单词就更简单了。可能几句话。我试一下看
s=open("some.txt").read()
import re
words=re.findall("(?isu)(\S+)",s)
counts={}
for w in words:
try:
counts[w]+=1
except KeyError:
counts[w]=1
items=count.items()
items.sort(key=lambda x:x[1],reverse=True)
for k,v in items:
print k,v
这样应该就可以了。
G. python如何实现提取文本中所有连续的词语
经常需要通过Python代码来提取文本的关键词,用于文本分析。而实际应用中文本量又是大量的数据,如果使用单进程的话,效率会比较低,因此可以考虑使用多进程。
python的多进程只需要使用multiprocessing的模块就行,如果使用大量的进程就可以使用multiprocessing的进程池--Pool,然后不同进程处理时使用apply_async函数进行异步处理即可。
实验测试语料:message.txt中存放的581行文本,一共7M的数据,每行提取100个关键词。
代码如下:
[python] view plain
#coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
from multiprocessing import Pool,Queue,Process
import multiprocessing as mp
import time,random
import os
import codecs
import jieba.analyse
jieba.analyse.set_stop_words("yy_stop_words.txt")
def extract_keyword(input_string):
#print("Do task by process {proc}".format(proc=os.getpid()))
tags = jieba.analyse.extract_tags(input_string, topK=100)
#print("key words:{kw}".format(kw=" ".join(tags)))
return tags
#def parallel_extract_keyword(input_string,out_file):
def parallel_extract_keyword(input_string):
#print("Do task by process {proc}".format(proc=os.getpid()))
tags = jieba.analyse.extract_tags(input_string, topK=100)
#time.sleep(random.random())
#print("key words:{kw}".format(kw=" ".join(tags)))
#o_f = open(out_file,'w')
#o_f.write(" ".join(tags)+"\n")
return tags
if __name__ == "__main__":
data_file = sys.argv[1]
with codecs.open(data_file) as f:
lines = f.readlines()
f.close()
out_put = data_file.split('.')[0] +"_tags.txt"
t0 = time.time()
for line in lines:
parallel_extract_keyword(line)
#parallel_extract_keyword(line,out_put)
#extract_keyword(line)
print("串行处理花费时间{t}".format(t=time.time()-t0))
pool = Pool(processes=int(mp.cpu_count()*0.7))
t1 = time.time()
#for line in lines:
#pool.apply_async(parallel_extract_keyword,(line,out_put))
#保存处理的结果,可以方便输出到文件
res = pool.map(parallel_extract_keyword,lines)
#print("Print keywords:")
#for tag in res:
#print(" ".join(tag))
pool.close()
pool.join()
print("并行处理花费时间{t}s".format(t=time.time()-t1))
运行:
python data_process_by_multiprocess.py message.txt
message.txt是每行是一个文档,共581行,7M的数据
运行时间:
不使用sleep来挂起进程,也就是把time.sleep(random.random())注释掉,运行可以大大节省时间。