本文编程基于python2.7版本python
参考来源:算法
https://blog.csdn.net/qq_34337272/article/details/79554772编程
https://blog.csdn.net/u012052268/article/details/77825981python2.7
1.jieba三种分词模式以及其应用
jieba提供了三种分词模式:函数
- 精确模式:试图将句子最精确地切开,适合文本分析;cut_all=True
- 全模式:把句子中全部能够成词的词语都扫描出来, 速度很是快,可是不能解决歧义;cut_all=False
- 搜索引擎模式:在精确模式的基础上,对长词再次切分,提升召回率,适合用于搜索引擎分词。jieba.cut_for_search()
例子代码:搜索引擎
1 # -*- coding: utf-8 -*- 2 #jieba_分词 3 #Python join() 方法用于将序列中的元素以指定的字符链接生成一个新的字符串。 4 import jieba 5 seg_list = jieba.cut("我来到北京清华大学", cut_all=True) 6 print("Full Mode: " + "/ ".join(seg_list)) # 全模式 7 8 seg_list = jieba.cut("我来到北京清华大学", cut_all=False) 9 print("Default Mode: " + "/ ".join(seg_list)) # 精确模式 10 11 seg_list = jieba.cut("他来到了网易杭研大厦") # 默认是精确模式 12 print(", ".join(seg_list)) 13 14 seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造") # 搜索引擎模式 15 print(", ".join(seg_list))
输出为结果:编码
Full Mode: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学云计算
Default Mode: 我/ 来到/ 北京/ 清华大学
他, 来到, 了, 网易, 杭研, 大厦
小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, ,, 后, 在, 日本, 京都, 大学, 日本京都大学, 深造spa
2.jieba加强功能-加载自定义词典
2.1 载入新自定义词典
读入的txt文件须是utf-8格式。解决方案:txt文件“另存为”设置编码格式为“utf-8”.net
开发者能够指定本身自定义的词典,以便包含 jieba 词库里没有的词。虽然 jieba 有新词识别能力,可是自行添加新词能够保证更高的正确率
- 用法: jieba.load_userdict(file_name) # file_name 为文件类对象或自定义词典的路径
- 词典格式和 dict.txt 同样,一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。file_name 若为路径或二进制方式打开的文件,则文件必须为 UTF-8 编码。
- 词频省略时使用自动计算的能保证分出该词的词频
例子:
新建词典2.txt
代码以下:
# -*- coding: utf-8 -*- #jieba_添加自定义词典 import jieba jieba.load_userdict("2.txt") print jieba.suggest_freq('云计算', tune=False) test_sent = "李小福是创新办主任也是云计算方面的专家" words = jieba.cut(test_sent) print('/'.join(words))
结果:李小福/是/创新办/主任/也/是/云计算/方面/的/专家。
若没有载入新词典,则结果是:李小福/是/创新/办/主任/也/是/云/计算/方面/的/专家。
调整词典:使用 add_word(word, freq=None, tag=None) 和 del_word(word) 可在程序中动态修改词典。
代码:
# -*- coding: utf-8 -*- #jieba_添加自定义词典 import jieba jieba.add_word('云计算') jieba.add_word('创新办') print jieba.suggest_freq('云计算', tune=False) test_sent = "李小福是创新办主任也是云计算方面的专家" words = jieba.cut(test_sent) print('/'.join(words))
结果为:李小福/是/创新办/主任/也/是/云计算/方面/的/专家。
2.2 载入停用词表
主要思想是分词事后,遍历一下停用词表,去掉停用词。
解决Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误。加入如下代码在程序中:
1 import sys 2 reload(sys) 3 sys.setdefaultencoding('utf-8')
代码:
1 # -*- coding: utf-8 -*- 2 #载入停顿词 3 4 import sys 5 import jieba 6 # jieba.load_userdict('userdict.txt') 7 # 建立停用词list 8 def stopwordslist(filepath): 9 #Python strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。 10 #'r'表示只读文件 11 #readlines() 方法用于读取全部行(直到结束符 EOF)并返回列表,该列表能够由 Python 的 for... in ... 结构进行处理。 12 stopwords = [line.strip() for line in open(filepath, 'r').readlines()] 13 return stopwords 14 15 # 对句子进行分词 16 def seg_sentence(sentence): 17 sentence_seged = jieba.cut(sentence.strip()) 18 stopwords = stopwordslist('stopword.txt') # 这里加载停用词的路径 19 outstr = '' 20 for word in sentence_seged: 21 if word not in stopwords: 22 if word != '\t': 23 outstr += word 24 outstr += " " 25 return outstr 26 27 inputs = open('input.txt', 'r') 28 #打开一个文件只用于写入。 29 # 若是该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。若是该文件不存在,建立新文件。 30 outputs = open('output.txt', 'w') 31 for line in inputs: 32 reload(sys) 33 sys.setdefaultencoding('utf-8') 34 print line 35 line_seg = seg_sentence(line) # 这里的返回值是字符串 36 outputs.write(line_seg + '\n') 37 outputs.close() 38 inputs.close()
3.jieba分词的其余应用
3.1 关键词提取
jieba还实现了TF-IDF和TextRank这两种关键词提取算法,直接调用便可
代码以下:
1 # -*- coding: utf-8 -* 2 #关键词提取 3 import jieba.analyse 4 # 字符串前面加u表示使用unicode编码 5 content = u'中国特点社会主义是咱们党领导的伟大事业,全面推动党的建设新的伟大工程,是这一伟大事业取得胜利的关键所在。党坚强有力,事业才能兴旺发达,国家才能繁荣稳定,人民才能幸福安康。党的十八大以来,咱们党坚持党要管党、从严治党,凝心聚力、直击积弊、扶正祛邪,党的建设开创新局面,党风政风呈现新气象。总书记围绕从严管党治党提出一系列新的重要思想,为全面推动党的建设新的伟大工程进一步指明了方向。' 6 # 第一个参数:待提取关键词的文本 7 # 第二个参数:返回关键词的数量,重要性从高到低排序 8 # 第三个参数:是否同时返回每一个关键词的权重 9 # 第四个参数:词性过滤,为空表示不过滤,若提供则仅返回符合词性要求的关键词 10 keywords = jieba.analyse.extract_tags(content, topK=10, withWeight=True, allowPOS=()) 11 # 访问提取结果 12 for item in keywords: 13 # 分别为关键词和相应的权重 14 print item[0], item[1] 15 print"#########"*4 16 17 # 一样是四个参数,但allowPOS默认为('ns', 'n', 'vn', 'v') 18 # 即仅提取地名、名词、动名词、动词 19 keywords = jieba.analyse.textrank(content, topK=10, withWeight=True, allowPOS=('ns', 'n', 'vn', 'v')) 20 # 访问提取结果 21 for item in keywords: 22 # 分别为关键词和相应的权重 23 print item[0], item[1]
结果以下:
3.2 词性标注
jieba在进行中文分词的同时,还能够完成词性标注任务。根据分词结果中每一个词的词性,能够初步实现命名实体识别,即将标注为nr的词视为人名,将标注为ns的词视为地名等。全部标点符号都会被标注为x,因此能够根据这个去除分词结果中的标点符号。
代码以下:
1 # 加载jieba.posseg并取个别名,方便调用 2 import jieba.posseg as pseg 3 words = pseg.cut("我爱北京天安门") 4 for word, flag in words: 5 # 格式化模版并传入参数 6 print('%s, %s' % (word, flag))
结果:
我, r
爱, v
北京, ns
天安门, ns
4.用jieba分词实战(含文件的读取与存储)
1 # -*- coding: utf-8 -*- 2 import jieba 3 import sys 4 import os 5 #用jieba分词实战(含文件的读取与存储) 6 7 # 保存文件的函数 8 def savefile(savepath,content): 9 reload(sys) 10 sys.setdefaultencoding('utf-8') 11 fp = open(savepath,'w') 12 fp.write(content) 13 fp.close() 14 15 # 读取文件的函数 16 def readfile(path): 17 fp = open(path, "r") 18 content = fp.read() 19 fp.close() 20 return content 21 22 ## 去除停用词的2个函数 23 # 建立停用词list 24 def stopwordslist(filepath): 25 stopwords = [line.strip() for line in open(filepath, 'r').readlines()] 26 return stopwords 27 28 # 对句子去除停用词 29 def movestopwords(sentence): 30 stopwords = stopwordslist('stopword.txt') # 这里加载停用词的路径 31 outstr = '' 32 for word in sentence: 33 if word not in stopwords: 34 if word != '\t'and'\n': 35 outstr += word 36 # outstr += " " 37 return outstr 38 39 40 corpus_path = "train/" # 未分词分类预料库路径 41 seg_path = "train_seg/" # 分词后分类语料库路径 42 43 catelist = os.listdir(corpus_path) # 获取未分词目录下全部子目录 44 for mydir in catelist: 45 class_path = corpus_path + mydir + "/" # 拼出分类子目录的路径 46 seg_dir = seg_path + mydir + "/" # 拼出分词后预料分类目录 47 if not os.path.exists(seg_dir): # 是否存在,不存在则建立 48 os.makedirs(seg_dir) 49 50 file_list = os.listdir(class_path) # 列举当前目录全部文件 51 for file_path in file_list: 52 fullname = class_path + file_path # 路径+文件名 53 print("当前处理的文件是: ",fullname) # 语料/train/pos/pos1.txt 54 # 语料/train/neg/neg1.txt 55 56 content = readfile(fullname).strip() # 读取文件内容 57 content = content.replace("\n", "").strip() # 删除换行和多余的空格 58 content_seg = jieba.cut(content) # jieba分词 59 print("jieba分词后:",content_seg) 60 listcontent = '' 61 for i in content_seg: 62 listcontent += i 63 listcontent += " " 64 print(listcontent[0:10]) 65 listcontent = movestopwords(listcontent) # 去除停用词 66 print("去除停用词后:", listcontent[0:10]) 67 listcontent = listcontent.replace(" ", " ").replace(" ", " ") 68 savefile(seg_dir + file_path, "".join(listcontent)) # 保存