stakk: STAtistical Kana Kanji conversion
pure pythonな統計的かな漢字変換エンジン

                       #tokyotextmining
              ...
背景   2
動作原理                                                   3




【雑音のある通信路モデル】
  
  w  arg maxP(w | y )                w   :...
データ構造                                4




  入力:「しぜんげんごしょり」
  最適解:「自然言語処理」


        自然         言語        処理

(開始)        ...
Wikipediaからの辞書作成                           5




$ cat plain/*.txt ¥
| mecab -F "%f[7]¥t%m¥n" -U "%m¥t%m¥n" ¥
| LC_ALL=C s...
エンジン本体                                                          6




 #load dictionary
 dic = {}
 summation = 0
 for line...
実行結果                              7




 $ ./stakk.py
 ワタシ
 私
 ワタシノナマエハナカノデス。
 ワタ しの 名前 は 中野 です 。
 ゴゴノコウチャ
 午後 の 紅茶
 カナカンジ...
8




デモ
Upcoming SlideShare
Loading in...5
×

StaKK: pure pythonな統計的かな漢字変換エンジン #TokoTextMining

1,371

Published on

Published in: Technology, Education
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,371
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
11
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

StaKK: pure pythonな統計的かな漢字変換エンジン #TokoTextMining

  1. 1. stakk: STAtistical Kana Kanji conversion pure pythonな統計的かな漢字変換エンジン #tokyotextmining @nokuno
  2. 2. 背景 2
  3. 3. 動作原理 3 【雑音のある通信路モデル】  w  arg maxP(w | y ) w :出力する変換結果列 w  arg maxP(w, y ) y :入力の読み列 w 【単語と読みのunigramモデル】 N P(w, y )   P( wi , yi ) i 1 ※unigramを仮定 N f ( wi , yi )  ※最尤推定 i 1  f ( wi , yi )
  4. 4. データ構造 4 入力:「しぜんげんごしょり」 最適解:「自然言語処理」 自然 言語 処理 (開始) 全 (終了) 語 諸 り 氏 前言 御所
  5. 5. Wikipediaからの辞書作成 5 $ cat plain/*.txt ¥ | mecab -F "%f[7]¥t%m¥n" -U "%m¥t%m¥n" ¥ | LC_ALL=C sort ¥ | uniq -c ¥ | threshold.py ¥ | sort -nr ¥ | swap.py ¥ > yomi-unigram.txt $ head yomi-unigram.txt ノ の 13406477 、 、 12466311 。 。 9253307 ニ に 8296579 ハ は 7891964 ヲ を 6668753 タ た 6316055 ガ が 5816995 デ で 5700954
  6. 6. エンジン本体 6 #load dictionary dic = {} summation = 0 for line in open(o.file): (yomi, surf, freq) = line.strip().split("¥t", 2) freq = int(freq) if not yomi in dic: dic[yomi] = (surf, freq) summation += freq #input from stdin for line in sys.stdin: input = line.strip() length = len(input) #create lattice lattice = [None] * (length+1) lattice[0] = ('<S>', '', 1.0) for i in range(length): for j in range(i+1, length+1): yomi = input[i:j] if yomi in dic and lattice[i] != None: (surf, freq) = dic[yomi] prob = lattice[i][2] * freq / summation if lattice[j] == None or lattice[j][1] < prob: lattice[j] = (surf, yomi, prob) #back trace i = length result = "" while i > 0 and lattice[i] != None: word = lattice[i] result = word[0] + " " + result i -= len(word[1]) print result
  7. 7. 実行結果 7 $ ./stakk.py ワタシ 私 ワタシノナマエハナカノデス。 ワタ しの 名前 は 中野 です 。 ゴゴノコウチャ 午後 の 紅茶 カナカンジヘンカンエンジン かな漢字 変換 エンジン トウケイテキカナカンジヘンカンエンジンヲカイハツシマシタ。 等 警笛 かな漢字 変換 エンジン を 会派 都志 真下 。 シゼンゲンゴショリ 自然 言語 処理 シゼンゲンゴショリベンキョウカイヲシュサイシテイマス。 し 漸減 御所 利便 協会 を 主査 石手 今須 。
  8. 8. 8 デモ
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×