単語分割方法のセグメンテーションアルゴリズムに(HMM)ベース

序文

(1)の単語の基本的な点にセグメンテーションアルゴリズム我々は内の2つのカテゴリの単語に基づいて単語辞書ベースの単語を論じた分割方法辞書ベースでセグメンテーションアルゴリズム(2)紙、我々は実現nグラムを使用します辞書をセグメント化します。(1)では、我々はまた、このアプローチにいくつかの欠点を議論してきた、未知語のために失効する、というOOVの問題があり、かつ簡単に記事の下に精巧なHMMベースを使用する方法に焦点を当ててどのように単語に基づいて単語に、説明単語分割方法。

ディレクトリ

セグメンテーションアルゴリズム(1)中の単語の基本的な点
についての議論セグメンテーションアルゴリズム(2)辞書ベースのセグメント化
ディスカッションセグメンテーションアルゴリズムは(3)文字をセグメント化(HMM)ベースの
ディスカッションセグメンテーションアルゴリズム(4)サブワードワードに基づきます方法(CRF)
単語分割方法(LSTM)に基づいてセグメント化アルゴリズム(5)に

隠れマルコフモデル(隠れマルコフモデル、HMM)

まず、我々は簡単にHMMをご紹介します。HMMタッドを備えます。

  • 状態値設定Q = {Q1、Q2、···、QN} Nが可能な状態の数です。
  • 観測セットV = {V1、V2、...は、VM} Mが可能観測の数です。
  • AIJ iがjの確率の状態への遷移を表す遷移確率行列A = [AIJ]。
  • 放出確率行列(また、観測確率行列と呼ばれる)B = [BJ(K)]、BJ(k)は状態jにおいて観察されたVK条件を生成する確率を表します。
  • 初期状態分布π。

一般に、HMMモデルは、測定された観察シーケンスに対応するOである、状態シーケンスはIであり、λ=(A、B、π)と表されます。三つの基本的なパラメータについては、HMM三つの基本的な質問があります。

  • 確率計算は、観測シーケンスOモデルの確率は、λに現れます。
  • 学習問題、既知の観測シーケンスO、推定モデルパラメータλは、このモデルにおいて観察シーケンスP(O |λ)ように最大。
  • 知られているモデルλ観測系列Oとデコード(復号化)の問題、条件付き確率P解決|最大状態系列Iの(I O)を

HMM単語

(1)私たちはベースの単語分割を検討しているでは、ワードは配列タグの質問に変換する方法を、ここでは簡単に単語のためのHMMの下にコンセプトを説明します。Qの集合状態値が設定されている{Bは、E、M、S }、 単語(SINGLE)に開始、終了、中間(開始、終了、中央)、および独立した文字を表す各単語は、中国語の文章は観察のシーケンスです。たとえば、「素敵な一日」はHMMを解くことにより、状態シーケンス「BEBEBE」を取得するには、言葉は「今日/天気/良い」です。
列C = {C1、...、CNのための上記一例として、我々は、中国語の単語は、質問に対応するタスク復号することを見出し }、 最大条件付き確率が解決

TI CI状態に対応する文字を表す特徴を、。

2つの仮定

条件付き確率を求めるには

、我々はベイズ式だった使用することができ

、nグラムの場合と同様に、我々はスパース性を減らすために2つの仮定を行う必要があります。

  • 限られた歴史的な仮定:TIは、TI-1によってのみ決定します
  • 仮定の独立した出力:時CI受信信号Iは、送信信号TIによってのみ決定されます

すなわち、次のように


このように、我々は、上記の式に変換することができる:

私達の単語分割の状態では4つだけT即ち、{B、E、M、S }、 P(T)をカウントすることにより、事前確率として使用することができます、条件付き確率P(C | T)しながら、取得状態の条件の下に表示される単語の中国の確率で、トレーニングコーパスの頻度をカウントすることによって得ることができます。

ビタビアルゴリズム

これらのものを使用すると、どのように我々は、最適な状態シーケンスそれを解決することができますか?溶液は、ビタビアルゴリズムである;実際に、ビタビアルゴリズムは、状態シーケンスの特性を満たすために最適なパスを使用して、本質的に動的プログラミングアルゴリズムである:次善のパス経路が最良でなければなりません。:時刻tでの状態は、Iの最大値がΔT(I)である確率として定義され、再帰式がある

文字CT + 1であり、1 + OT。

コードの実装

我々は、単純なHMMベースの単語、私は主にHMM分割jiebaから抽出された部分を実装次のように[3]は、特定の論理である:
prob_start.py初期状態分布πを定義します。

P={'B': -0.26268660809250016,
 'E': -3.14e+100,
 'M': -3.14e+100, 'S': -1.4652633398537678}

prob_trans.py遷移確率行列A:

P={'B': {'E': -0.510825623765990, 'M': -0.916290731874155}, 'E': {'B': -0.5897149736854513, 'S': -0.8085250474669937}, 'M': {'E': -0.33344856811948514, 'M': -1.2603623820268226}, 'S': {'B': -0.7211965654669841, 'S': -0.6658631448798212}}

prob_emit.pyが放出確率行列Bを定義し、例えば、P(「と」| M)は、状態の確率を表す「と」ワードM(注:ユニコード文字は、実際の符号化コードで表されている)ケースの発生;

P={'B': {'一': -3.6544978750449433,
       '丁': -8.125041941842026, '七': -7.817392401429855, ...} 'S': {':': -15.828865681131282, '一': -4.92368982120877, ...} ...}

説明のために与えられたモデルの概要トレーニング:「二つの主要な発生源があり、1がインターネットでは、1998人民日報コーパスセグメンテーションとセグメンテーションMSRコーパスにダウンロードすることができ、他方はTXT小説のいくつかの私自身のコレクションです。 ictclasとのセグメンテーション(多少の誤差を有していてもよい)は、3つの主要確率テーブルをカウントするPythonスクリプト統計的単語頻度が続く:1)遷移確率の位置を、すなわち、B(開始)、M(中)、E(終了)、S(単語に分離)4状態遷移確率は、2)Pなどの単語の放出確率の位置、(「及び」| M)の確率を表す「と」単語は単語の中央に表示され、3)単語初めにいくつかの州では確率が、実際には、2つだけ、Bのいずれか、どちらかのS. "

次のようにビタビseg_hmm.py機能であります:

PrevStatus = {
    'B': 'ES',
    'M': 'MB',
    'S': 'SE', 'E': 'BM' } def viterbi(obs, states, start_p, trans_p, emit_p): V = [{}] # tabular path = {} for y in states: # init V[0][y] = start_p[y] + emit_p[y].get(obs[0], MIN_FLOAT) path[y] = [y] for t in range(1, len(obs)): V.append({}) newpath = {} for y in states: em_p = emit_p[y].get(obs[t], MIN_FLOAT) (prob, state) = max( [(V[t - 1][y0] + trans_p[y0].get(y, MIN_FLOAT) + em_p, y0) for y0 in PrevStatus[y]]) V[t][y] = prob newpath[y] = path[state] + [y] path = newpath (prob, state) = max((V[len(obs) - 1][y], y) for y in 'ES') return (prob, path[state]) 

中国語の単語のタスクに適応するには、ビタビ・アルゴリズムのJiebaは、以下の変更を加えました:

  • PrevStatus状態遷移、すなわち、前の状態のみが状態B E又はSであり、条件を満たさなければなりません...
  • 最後に、状態は、それは、単語の終わりを表し、E又はSであることができます。

:同時に、ここ実現に追加することに変身乗じ、多数のためにその需要を式を押した
n個の\ delta_ {T + 1}(I)=最大{N \のdelta_Tの(J){こと} + + lna_ lnb_i(C_ {T + 1})}
。これは、それが対数を求めているので、確率行列は、負の登場です。

結果を実現

私たちは、簡単なセルフテスト機能を記述します。

if __name__ == "__main__":
    ifile = ''
    ofile = ''
    try:
        opts, args = getopt.getopt(sys.argv[1:], "hi:o:", ["ifile=", "ofile="]) except getopt.GetoptError: print('seg_hmm.py -i <inputfile> -o <outputfile>') sys.exit(2) for opt, arg in opts: if opt == '-h': print('seg_hmm.py -i <inputfile> -o <outputfile>') sys.exit() elif opt in ("-i", "--ifile"): ifile = arg elif opt in ("-o", "--ofile"): ofile = arg with open(ifile, 'rb') as inf: for line in inf: rs = cut(line) print(' '.join(rs)) with open(ofile, 'a') as outf: outf.write(' '.join(rs) + "\n")

次のように実行します。

完全なコード

:私は、コードは、基本的な学習へのアクセスを容易にするため、オーバー吃音から引き出されている上記の記事に類似githubの上に置かれたコード、I引き継ぐためにも、直接モデル、および再見つけることができませんでしたコーパス電車、我々はできるシュシュ完了します
HTTPSを://github.com/xlturing/machine-learning-journey/tree/master/seg_hmm

リファレンス

  1. 「統計的学習法」リーハング
  2. [中国]単語隠れマルコフモデルHMM
  3. githubののjieba
  4. データモデルは、吃音を発生させる方法
  5. アプリケーションA隠れマルコフモデル:中国語の単語
序文

(1)の単語の基本的な点にセグメンテーションアルゴリズム我々は内の2つのカテゴリの単語に基づいて単語辞書ベースの単語を論じた分割方法辞書ベースでセグメンテーションアルゴリズム(2)紙、我々は実現nグラムを使用します辞書をセグメント化します。(1)では、我々はまた、このアプローチにいくつかの欠点を議論してきた、未知語のために失効する、というOOVの問題があり、かつ簡単に記事の下に精巧なHMMベースを使用する方法に焦点を当ててどのように単語に基づいて単語に、説明単語分割方法。

ディレクトリ

セグメンテーションアルゴリズム(1)中の単語の基本的な点
についての議論セグメンテーションアルゴリズム(2)辞書ベースのセグメント化
ディスカッションセグメンテーションアルゴリズムは(3)文字をセグメント化(HMM)ベースの
ディスカッションセグメンテーションアルゴリズム(4)サブワードワードに基づきます方法(CRF)
単語分割方法(LSTM)に基づいてセグメント化アルゴリズム(5)に

隠れマルコフモデル(隠れマルコフモデル、HMM)

まず、我々は簡単にHMMをご紹介します。HMMタッドを備えます。

  • 状態値設定Q = {Q1、Q2、···、QN} Nが可能な状態の数です。
  • 観測セットV = {V1、V2、...は、VM} Mが可能観測の数です。
  • AIJ iがjの確率の状態への遷移を表す遷移確率行列A = [AIJ]。
  • 放出確率行列(また、観測確率行列と呼ばれる)B = [BJ(K)]、BJ(k)は状態jにおいて観察されたVK条件を生成する確率を表します。
  • 初期状態分布π。

一般に、HMMモデルは、測定された観察シーケンスに対応するOである、状態シーケンスはIであり、λ=(A、B、π)と表されます。三つの基本的なパラメータについては、HMM三つの基本的な質問があります。

  • 確率計算は、観測シーケンスOモデルの確率は、λに現れます。
  • 学習問題、既知の観測シーケンスO、推定モデルパラメータλは、このモデルにおいて観察シーケンスP(O |λ)ように最大。
  • 知られているモデルλ観測系列Oとデコード(復号化)の問題、条件付き確率P解決|最大状態系列Iの(I O)を

HMM単語

(1)私たちはベースの単語分割を検討しているでは、ワードは配列タグの質問に変換する方法を、ここでは簡単に単語のためのHMMの下にコンセプトを説明します。Qの集合状態値が設定されている{Bは、E、M、S }、 単語(SINGLE)に開始、終了、中間(開始、終了、中央)、および独立した文字を表す各単語は、中国語の文章は観察のシーケンスです。たとえば、「素敵な一日」はHMMを解くことにより、状態シーケンス「BEBEBE」を取得するには、言葉は「今日/天気/良い」です。
列C = {C1、...、CNのための上記一例として、我々は、中国語の単語は、質問に対応するタスク復号することを見出し }、 最大条件付き確率が解決

TI CI状態に対応する文字を表す特徴を、。

2つの仮定

条件付き確率を求めるには

、我々はベイズ式だった使用することができ

、nグラムの場合と同様に、我々はスパース性を減らすために2つの仮定を行う必要があります。

  • 限られた歴史的な仮定:TIは、TI-1によってのみ決定します
  • 仮定の独立した出力:時CI受信信号Iは、送信信号TIによってのみ決定されます

すなわち、次のように


このように、我々は、上記の式に変換することができる:

私達の単語分割の状態では4つだけT即ち、{B、E、M、S }、 P(T)をカウントすることにより、事前確率として使用することができます、条件付き確率P(C | T)しながら、取得状態の条件の下に表示される単語の中国の確率で、トレーニングコーパスの頻度をカウントすることによって得ることができます。

ビタビアルゴリズム

これらのものを使用すると、どのように我々は、最適な状態シーケンスそれを解決することができますか?溶液は、ビタビアルゴリズムである;実際に、ビタビアルゴリズムは、状態シーケンスの特性を満たすために最適なパスを使用して、本質的に動的プログラミングアルゴリズムである:次善のパス経路が最良でなければなりません。:時刻tでの状態は、Iの最大値がΔT(I)である確率として定義され、再帰式がある

文字CT + 1であり、1 + OT。

コードの実装

我々は、単純なHMMベースの単語、私は主にHMM分割jiebaから抽出された部分を実装次のように[3]は、特定の論理である:
prob_start.py初期状態分布πを定義します。

P={'B': -0.26268660809250016,
 'E': -3.14e+100,
 'M': -3.14e+100, 'S': -1.4652633398537678}

prob_trans.py遷移確率行列A:

P={'B': {'E': -0.510825623765990, 'M': -0.916290731874155}, 'E': {'B': -0.5897149736854513, 'S': -0.8085250474669937}, 'M': {'E': -0.33344856811948514, 'M': -1.2603623820268226}, 'S': {'B': -0.7211965654669841, 'S': -0.6658631448798212}}

prob_emit.pyが放出確率行列Bを定義し、例えば、P(「と」| M)は、状態の確率を表す「と」ワードM(注:ユニコード文字は、実際の符号化コードで表されている)ケースの発生;

P={'B': {'一': -3.6544978750449433,
       '丁': -8.125041941842026, '七': -7.817392401429855, ...} 'S': {':': -15.828865681131282, '一': -4.92368982120877, ...} ...}

説明のために与えられたモデルの概要トレーニング:「二つの主要な発生源があり、1がインターネットでは、1998人民日報コーパスセグメンテーションとセグメンテーションMSRコーパスにダウンロードすることができ、他方はTXT小説のいくつかの私自身のコレクションです。 ictclasとのセグメンテーション(多少の誤差を有していてもよい)は、3つの主要確率テーブルをカウントするPythonスクリプト統計的単語頻度が続く:1)遷移確率の位置を、すなわち、B(開始)、M(中)、E(終了)、S(単語に分離)4状態遷移確率は、2)Pなどの単語の放出確率の位置、(「及び」| M)の確率を表す「と」単語は単語の中央に表示され、3)単語初めにいくつかの州では確率が、実際には、2つだけ、Bのいずれか、どちらかのS. "

次のようにビタビseg_hmm.py機能であります:

PrevStatus = {
    'B': 'ES',
    'M': 'MB',
    'S': 'SE', 'E': 'BM' } def viterbi(obs, states, start_p, trans_p, emit_p): V = [{}] # tabular path = {} for y in states: # init V[0][y] = start_p[y] + emit_p[y].get(obs[0], MIN_FLOAT) path[y] = [y] for t in range(1, len(obs)): V.append({}) newpath = {} for y in states: em_p = emit_p[y].get(obs[t], MIN_FLOAT) (prob, state) = max( [(V[t - 1][y0] + trans_p[y0].get(y, MIN_FLOAT) + em_p, y0) for y0 in PrevStatus[y]]) V[t][y] = prob newpath[y] = path[state] + [y] path = newpath (prob, state) = max((V[len(obs) - 1][y], y) for y in 'ES') return (prob, path[state]) 

中国語の単語のタスクに適応するには、ビタビ・アルゴリズムのJiebaは、以下の変更を加えました:

  • PrevStatus状態遷移、すなわち、前の状態のみが状態B E又はSであり、条件を満たさなければなりません...
  • 最後に、状態は、それは、単語の終わりを表し、E又はSであることができます。

:同時に、ここ実現に追加することに変身乗じ、多数のためにその需要を式を押した
n個の\ delta_ {T + 1}(I)=最大{N \のdelta_Tの(J){こと} + + lna_ lnb_i(C_ {T + 1})}
。これは、それが対数を求めているので、確率行列は、負の登場です。

結果を実現

私たちは、簡単なセルフテスト機能を記述します。

if __name__ == "__main__":
    ifile = ''
    ofile = ''
    try:
        opts, args = getopt.getopt(sys.argv[1:], "hi:o:", ["ifile=", "ofile="]) except getopt.GetoptError: print('seg_hmm.py -i <inputfile> -o <outputfile>') sys.exit(2) for opt, arg in opts: if opt == '-h': print('seg_hmm.py -i <inputfile> -o <outputfile>') sys.exit() elif opt in ("-i", "--ifile"): ifile = arg elif opt in ("-o", "--ofile"): ofile = arg with open(ifile, 'rb') as inf: for line in inf: rs = cut(line) print(' '.join(rs)) with open(ofile, 'a') as outf: outf.write(' '.join(rs) + "\n")

次のように実行します。

完全なコード

:私は、コードは、基本的な学習へのアクセスを容易にするため、オーバー吃音から引き出されている上記の記事に類似githubの上に置かれたコード、I引き継ぐためにも、直接モデル、および再見つけることができませんでしたコーパス電車、我々はできるシュシュ完了します
HTTPSを://github.com/xlturing/machine-learning-journey/tree/master/seg_hmm

リファレンス

  1. 「統計的学習法」リーハング
  2. [中国]単語隠れマルコフモデルHMM
  3. githubののjieba
  4. データモデルは、吃音を発生させる方法
  5. アプリケーションA隠れマルコフモデル:中国語の単語

おすすめ

転載: www.cnblogs.com/sunsky303/p/11120822.html