Github:结巴分词地址 https://github.com/fxsjy/jieba
几种分词方法的简单使用:
一 . jieba
- 安装、示例
pip install jieba,jieba分词的语料是基于人民日报。
分词示例
1 import jieba 2 3 str1 ='江州市长江大桥' 4 word_object = jieba.cut(str1) # 生成一个生成器对象 5 for each in word_object: 6 print each
我要的分词结果是“江州/市长/江大桥”, 我需要自定义一个字典,给“江大桥”设置一个较大的频次
当我将 “江大桥” 频次设为2000时发现并不能切分出来, 查看原始字典发现“长江大桥”频次3858,所以在概率统计上远大于“江大桥”,所以将“江大桥”频次设为1000万。
但是实际是分不出来的,必须很极端的设为20000, 因为要保证P(江州)P(市长)P(江大桥) > P(江州)P(市)P(长江大桥)
加载用户字典jieba.load_userdict()
jieba.load_userdict('userdict.txt')
2. jieba.cut参数
cut(self, sentence, cut_all=False, HMM=True) method of jieba.Tokenizer instance
The main function that segments an entire sentence that contains
Chinese characters into seperated words.
Parameter:
- sentence: The str(unicode) to be segmented. (需要分词的字符串)
- cut_all: Model type. True for full pattern, False for accurate pattern. (cut_all字段是分词的全模式和普通模式/默认模式)
- HMM: Whether to use the Hidden Markov Model. (是否使用HMM模式分词,default True)
关于全模式和默认模式:
str1= u“江州市长江大桥”为例:
jieba.cut(str1, cut_all=True) #全模式是将词可能生成的词完全切分出来
Output:
江州/ 州市/市长/长江/长江大桥/大桥 (可以理解为:所有可以切分成词的都会显示出来, 尽可能多得分词)
jieba.cut(str1, cut_all=False)
Output:
江州/市/长江大桥
add_word(word, freq=None, tag=None) # 向词典添加词del_word(word) # 删除词典中的词
suggest_freq(segment, tune=True) # 调整词频率
其他具体使用详见 https://github.com/fxsjy/jieba
二. Thulac
- 安装和使用
Thulac 是清华大学的分词库,也是基于HMM的分词器
pip install thulac安装
1 str1 = u'江州市长江大桥'2 import thulac
3 thu = thulac.thulac()
4 word = thu.cut(str1, text=False)
5 for each in word:
6 print each[0], each[1]
结果如下图,会显示分词结果和词性
1 str1 = u'江州市长江大桥'2 import thulac3 thu = thulac.thulac()
4 word = thu.cut(str1, text=False)
对英文分词(会将连一起的“字母和数字”切分出来, 且常规英文空格也会切分出来):
- 参数
以下是help(thulac.thulac)的doc介绍
class thulac
| Methods defined here:
|
| __init__(self, user_dict=None, model_path=None, T2S=False, seg_only=False, filt=False, max_length=50000, deli='_', rm_space=False)
| 初始化函数,传入用户设置的参数,并且根据参数初始化不同
| 模型(调入不同的.dat文件,该文件存储了一个双数组trie树)
|
user_name=None, 设置用户词典,用户词典中的词会被打上uw标签。词典中每一个词一行,UTF8编码
model_path=None, 设置模型文件所在文件夹,默认为models/
T2S=False, 是否将句子从繁体转化为简体
seg_only=False, False时候只进行分词,不进行词性标注
filt=False, 是否使用过滤器去除一些没有意义的词语,例如“可以”。
max_length=50000,
deli='_', 默认为‘_’, 设置词与词性之间的分隔符
rm_space=False, 是否去掉原文本中的空格后再进行分词
|
| cut(self, oiraw, text=False)
| text=False; 是否返回文本,不返回,则是个二维list (每一维度包含 词+词性);返回文本则是“分词_词性”组成的文本。
| cut_f(self, input_file, output_file)
| 对文件分词
| cutline(self, oiraw)
|
| fast_cut(self, oiraw, text=False)
| # fast 接口 cut-> fast_cut)
| fast_cut_f(self, input_file, output_file)
| # fast 接口 cut_f -> fast_cut_f
| foo(self, x)
| # foo占位符,表明某个变量、函数、命令不重要,但有这个想法。
| multiprocessing_cut_f(self, input_file, output_file, core=0)
| #多线程对文件分词
| run(self)
#交互式: 屏幕input,屏幕output
词性解释:
具体示例详见 https://github.com/thunlp/THULAC-Python#%E5%85%B6%E4%BB%96%E8%AF%AD%E8%A8%80%E5%AE%9E%E7%8E%B0
三、snownlp
- 安装、概述、示例
pip install snownlp
snownlp 是基于3-gram的词性标注、HMM模型的分词算法。
示例:
1 from snownlp import SnowNLP2 str1 = u'江州市长江大桥'3 snow_obj = SnowNLP(str1)4 snow_obj.words # list 分词后返回一个分词结果的list5 for each in snow_obj:6 print each
结果如下图
- 参数、部分方法
2.
1 from snownlp import SnowNLP2 str1 = u'江州市长江大桥'3 snow_obj = SnowNLP(str1)4 snow_obj.words # list 分词后返回一个分词结果的list5 for each in snow_obj:6 print each 7 snow_obj.tags # 一维list,内含元组(词,词性)
8 snow_obj.sentiments # positive的概率
9 snow_obj.pinyin # 每个词转为拼音,每个词构成list
其他方法详见 https://github.com/isnowfy/snownlp 或help(SnowNLP)查看
四、yaha
- 安装、简述、示例
pip install yaha
yaha中文分词 基于查找句子的最大概率路径来进行分词
1 str1 = u'江州市长江大桥'2 from yaha import Cuttor3 cuttor = Cuttor() # 然后会加载字典4 word = cuttor.cut(str1) # 生成器对象5 for each in word:6 print word
yaha分词最大的弊端就是对英文无法在做分词,当遇到英文时,会将英文分为每个字母。
五、genius
1. 安装、简述和示例
pip install genius
genius 是一款开源中文分词器,其基于条件随机场(CRF)算法的。
(这部分下次再写)
import re
from collections import Counter
import jieba
def cut_word(datapath):
with open(datapath,'r',encoding='utf-8')as fp:
string = fp.read()
data = re.sub(r"[\s+\.\!\/_,$%^*(【】:\]\[\-:;+\"\']+|[+——!,。?、~@#¥%……&*()]+|[0-9]+", "", string)
word_list = jieba.cut(data)
print(type(word_list))
return word_list
def static_top_word(word_list,top=5):
result = dict(Counter(word_list))
print(result)
sortlist = sorted(result.items(),key=lambda x:x[1],reverse=True)
resultlist = []
for i in range(0,top):
resultlist.append(sortlist[i])
return resultlist
def main():
datapath = 'comment.txt'
word_list = cut_word(datapath)
Result = static_top_word(word_list)
print(Result)
main()