1. 程式人生 > >學習筆記--中文分詞之結巴分詞(二)

學習筆記--中文分詞之結巴分詞(二)

結巴中文分詞簡介

   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請求