结巴中文分词简介
1)支持三种分词模式:
- 精确模式:将句子最精确的分开,适合文本分析
- 全模式:句子中所有可以成词的词语都扫描出来,速度快,不能解决歧义
- 搜索引擎模式:在精确的基础上,对长词再次切分,提高召回
2)支持繁体分词
3)支持自定义词典
4)基于Trie树结构实现高效的词图扫描,生成句子汉字所有可能成词情况所构成的有向无环图(DAG)
5) 采用了动态规划查找最大概率路径,找出基于词频的最大切分组合
6)对于词库中不存在的词,也就是未登录词,采用了基于汉字成词能力的HMM模型,使用了Viterbi算法
结巴分词流程图:
建立trie树的好处:
- 省空间
- 查找快
route概率,获得词频最大切分(根据词表得到词频,log(词频 / 总数))
实践
(1)利用MR+jieba
对音乐元数据进行分词
run.sh
HADOOP_CMD="/usr/local/src/hadoop-2.6.1/bin/hadoop"
STREAM_JAR_PATH="/usr/local/src/hadoop-2.6.1//share/hadoop/tools/lib/hadoop-streaming-2.6.1.jar"
INPUT_FILE_PATH_1="/music_meta.txt.small"
OUTPUT_Z_PATH="/output_z_fenci"
$HADOOP_CMD fs -rmr $OUTPUT_Z_PATH
$HADOOP_CMD fs -rmr $OUTPUT_D_PATH
# Step 1.
$HADOOP_CMD jar $STREAM_JAR_PATH \
-input $INPUT_FILE_PATH_1 \
-output $OUTPUT_Z_PATH \
-mapper "python map_seg2.py" \
-jobconf "mapred.reduce.tasks=0" \
-jobconf "mapreduce.map.memory.mb=4096" \
-jobconf "mapred.job.name=jieba_fenci_demo" \
-file "./jieba.tgz" \
-file "./map_seg2.py"
map.py.通过-file方式把jieba.tgz分发给slave,然后需要对压缩包进行解压
import os
import sys
os.system('tar xvzf jieba.tgz > /dev/null')
reload(sys)
sys.setdefaultencoding('utf-8')
sys.path.append("./")
import jieba
import jieba.posseg
import jieba.analyse
for line in sys.stdin:
ss = line.strip().split('\t')
if len(ss) != 2:
continue
music_id = ss[0].strip()
music_name = ss[1].strip()
seg_list = jieba.cut(music_name, cut_all=False)
print '\t'.join([music_id, music_name, ' '.join(seg_list)])
分词后的效果
(2)jieba+webpy
web_jie.py
import web
import sys
sys.path.append("./")
import jieba
import jieba.posseg
import jieba.analyse
urls = (
'/', 'index',
'/test', 'test',
)
app = web.application(urls, globals())
class index:
def GET(self):
params = web.input()
content = params.get('content', '')
result_list = []
for x, w in jieba.analyse.extract_tags(content, withWeight=True):
result_list.append(':'.join([x, str(round(w, 3))]))
return ' '.join(result_list)
class test:
def GET(self):
print web.input()
return '222'
if __name__ == "__main__":
app.run()
~
然后输入python web_jie.py 9996进行监控
在网页上查看,此方式为get请求