jieba中文分词

本文编程基于python2.7版本

参考来源:

https://blog.csdn.net/qq_34337272/article/details/79554772

https://blog.csdn.net/u012052268/article/details/77825981

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: 我/ 来到/ 北京/ 清华大学
他, 来到, 了, 网易, 杭研, 大厦
小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, ,, 后, 在, 日本, 京都, 大学, 日本京都大学, 深造

2.jieba增强功能-加载自定义词典

2.1 载入新自定义词典

读入的txt文件须是utf-8格式。解决方案:txt文件“另存为”设置编码格式为“utf-8”

开发者可以指定自己自定义的词典,以便包含 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)) # 保存

猜你喜欢

转载自www.cnblogs.com/171207xiaohutu/p/9228530.html