基于结巴分词的中文分词
计算机在处理文本的时候对词进行识别以及对词与词之间的关系进行判定,从而达到识别语句含义的效果。中文和英文有所不同,中文的词不像英文那样中间有空格,需要将字进行组合从而形成词。因此中文分词是中文文本处理的一个基础步骤,在进行中文自然语言处理时,通常需要先进行分词。中文分词是文本挖掘的基础,对于输入的一段中文,成功地进行中文分词,可以达到计算机自动识别语句含义的效果。
下面我们将先介绍非常流行的且开源的分词器——结巴(jieba)分词器,并使用Python进行实战。下文中的代码来自结巴分词的官方程序示例(参见https://github.com/fxsjy/jieba)。
结巴分词支持3种分词模式:① 精确模式,试图将句子最精确地切开,以适合文本分析;②全模式,把句子中所有的可以成词的词语都扫描出来,速度快,但不能解决歧义;③搜索引擎模式,在精确模式的基础上,对长词再进行词切分,提高召回率,适合用于搜索引擎分词。
#encoding=utf-8
from_future_import unicode_literals
import sys
sys.path.append("../")
import jieba
import jieba.posseg
import jieba.analyse
print('='*40)
print('1.分词')
print('-'*40)
#jieba.cut方法接收3个输入参数:需要分词的字符串;cut_all参数用来控制是否采用全模式;HMM参数用来控制是否使用HMM模型
seg_list=jieba.cut("我来到北京的清华大学",cut_all=True)
print("全模式:"+"/".join(seg_list))#全模式
seg_list=jieba.cut("我来到北京的清华大学",cut_all=False)
print("全模式:"+"/".join(seg_list))#默认模式
代码段1实现分词
seg_list=jieba.cut("他来到了网易杭研大厦")
print(",".join(seg_list))
seg_list=jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造")#搜索引擎模式
print(",".join(seg_list))
代码段1 结果
从上图中可以看出“杭研”并没有在词典中,但是也被Viterbi算法识别出来了。
print('='*40)
print('2.添加自定义词典/调整词典')
print('-'*40)
print('/'.join(jieba.cut('如果放到post中将出错。',HMM=False)))
代码段2调整词典里的分词
#如果/放到/post/中将/出错/
print(jieba.suggest_freq(('中','将'),True))#利用suggest_freq()函数加入常用词,例如“中”和“将”一般是分开的
#494
print('/'.join(jieba.cut('如果放到post中将出错。',HMM=False)))
#如果/放到/post/中/将/出错/
print('/'.join(jieba.cut('「台中」正确应该不会被切开',HMM=False)))
#「/台/中/」/正确/应该/不会/被/切开
print(jieba.suggest_freq('台中',True))#利用suggest_freq()函数加入常用词,例如“台中”一般是一个词
#69
print('/'.join(jieba.cut('「台中」正确应该不会被切开',HMM=False)))
#「/台中/」/正确/应该/不会/被/切开
代码段2结果
print('='*40)
print('3.关键词提取')
print('-'*40)
print('TF-IDF')
print('-'*40)
代码段3-1关键词提取
s="此外,公司拟对全资子公司吉林欧亚置业有限公司增资4.3亿元,增资后,吉林欧亚置业注册资本由7 000万元增加到5亿元。吉林欧亚置业主要经营范围为房地产开发及百货零售等业务。目前在建吉林欧亚城市商业综合体项目。2013年,实现营业收入0万元,实现净利润-139.13万元。"
#利用函数analyse.extract_tags()提取关键词,有两个参数,一个是字符串s,另一个是权重withWeight,即每个词在文中出现次数占的权重
for x,w in jieba.analyse.extract_tags(s,withWeight=True):
print('%s %s'%(x,w))
代码段3-1结果例如“欧亚”出现的次数较多
print('-'*40)
print('TextRank')
print('-'*40)
for x,w in jieba.analyse.textrank(s,withWeight=True):
print('%s %s'%(x,w))
代码段3-2分词按照出现次现次数排序
代码段3-2结果例如“欧亚”出现的次数最多
print('='*40)
print('4.词性标注')
print('-'*40)
words=jieba.posseg.cut("我爱北京天安门")
for word,flag in words:
print('%s %s'%(word,flag))
代码段4及结果词性标注,例如代词r、动词v、名词n s
print('='*40)
print('5.Tokenize:返回词语在原文的起止位置')
print('-'*40)
print('默认模式')
print('-'*40)
代码段5返回词语在原文的起止位置
result=jieba.tokenize('永和服装饰品有限公司')
for tk in result:
print("word %s\t\t start:%d \t\t end:%d" %(tk[0],tk[1],tk[2]))
print('-'*40)
print('搜索模式')
print('-'*40)
result=jieba.tokenize('永和服装饰品有限公司',mode='search')
for tk in result:
print("word %s\t\t start:%d \t\t end:%d" %(tk[0],tk[1],tk[2]))
代码段5结果
基于jieba与NLTK分析唐诗作者
小I的任务
“空山不见人,但闻人语响。”是谁的作品啊?
《红楼梦》的后四十回究竟是谁写的?
小I忙得满头大汗,请同学们来帮忙。
同学甲:李白的诗浪漫,杜甫的诗厚重,王维的诗清新,可以看看这个诗句是什么风格。(www.xing528.com)
同学乙:每个作者的题材风格都不同,用词习惯也不一样,可以从这方面入手考虑。
有了同学们出主意,小I有了主意,可以尝试看看作品的用词。一个作者在写作时,通常会有一些常用的词或者语序。小I找到小P,小I说可以利用程序将一部小说、一首诗歌进行基本词汇的提取,看看这些词出现的频率,对照不同作者的作品中这些词出现的频率,给出一个判断。这实际上也是一个分类问题,输入是文本的特征,例如关键词,输出是文本的类别,如作者。
下面我们来介绍一个实例,采用结巴分词对中文文本进行分词,再采用NLTK(Natural Language Toolkit)中的贝叶斯分类器进行分类。NLTK 是用于处理自然语言的Python应用开源平台,它提供了很多文本处理库,可以用来给文本分类,进行符号化,提取词根,贴标签,解析,进行语义推理等。本例参考博客http://www.cnblogs.com/zuixime0515/p/9221156.html和#https://blog.csdn.net/qq_18495537/article/details/79110122。
import jieba
from nltk.classify import NaiveBayesClassifier
import jieba.posseg
import jieba.analyse
#创建停用词列表
def stopwordslist():
stopwords=[line.strip()for line in open('chinsesstoptxt.txt').readlines()]
return stopwords
#对句子进行中文分词
def seg_depart(sentence):
#对文档中的每一行进行中文分词
#print("正在分词")
sentence_depart=jieba.cut(sentence.strip())
#创建一个停用词列表
stopwords=stopwordslist()
#输出结果为outstr
outstr=''
#去停用词
for word in sentence_depart:
if word not in stopwords:
if word!='\t'and'\r':
outstr+=word
outstr+=" "
return outstr
#给出文档路径
#需要提前把李白的诗收集一下,放在libai.txt文本中
#需要提前把杜甫的诗收集一下,放在dufu.txt文本中
filename1="libai.txt"
inputs1=open(filename1,'r')
filename2="dufu.txt"
inputs2=open(filename2,'r')
#print("-------------------正在分词和去停用词-----------")
#将输出结果写入libaiout.txt中
lboutstr=''
for line in inputs1:
line_seg1=seg_depart(line)
lboutstr+=line_seg1
lboutstr+=" "
inputs1.close()
print("删除停用词和分词成功!!!")
#print("-------------------正在分词和去停用词-----------")
#将输出结果写入dufuout.txt中
dfoutstr=''
for line in inputs2:
line_seg2=seg_depart(line)
dfoutstr+=line_seg2
dfoutstr+=" "
inputs2.close()
print("删除停用词和分词成功!!!")
#数据准备
libai=lboutstr
dufu=dfoutstr
#特征提取
def word_feats(words):
return dict([(word,True)for word in words])
libai_features=[(word_feats(lb),'lb')for lb in libai]
print(libai_features)
dufu_features=[(word_feats(df),'df')for df in dufu]
train_set=libai_features+dufu_features
#训练决策
classifier=NaiveBayesClassifier.train(train_set)
#分析测试
sentence=input("请输入一句你喜欢的诗:")
print("\n")
seg_list=jieba.cut(sentence)
result=" ".join(seg_list)
words=result.split(" ")
print(words)
#统计结果
lb=0
df=0
for word in words:
classResult=classifeir.classify(word_feats(word))
if classResult=='lb':
lb=lb+1
if classResult=='df':
df=df+1
#呈现比例
x=float(str(float(lb)/len(words)))
y=float(str(float(df)/len(words)))
print('李白的可能性:%.2f%%'%(x * 100))
print('杜甫的可能性:%.2f%%'%(y * 100))
##
运行结果:
可以看出,该程序可以完成基本的判断,但是由于采用词的出现概率来判断,因此准确率还有待提高。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。