0から始まる中国のピンイン入力法とPython実装

我々はすべて知っているように、中国の入力方法は、歴史的な問題ですが、それは退屈な生活であるこれは少数の人々がオンライン中国語ピンイン入力メソッドが共有するための理由であれば、この機会NLPプロジェクトを知らない、私は外のことを実現中国語ピンイン入力法は、どのように深層水と見つけかなり深く見るために、基本的な効果はまだ出てくると、非常に良いやっている他のグループにあなたと私たちが今何をすべきかの結果を共有するには、この時間を見てすることができます。(注:この記事では、すでに隠れマルコフモデルのある程度の知識を持っていることを前提として)

タスク説明

中国語ピンイン入力メソッドを実装します。

分析の後、中国語ピンイン入力メソッドを達成するために、次のモジュールに分割:

  • コア機能は、表音セグメンテーション(SplitPinyin.py)を含みます
  • HMMモデルのトレーニング(TrainMatrix.py)
  • トライ木ビルダーと検索インターフェイス(PinyinTrie.py)
  • ビタビアルゴリズムとUI(GodTian_Pinyin.py)のサービス・インターフェースを提供
  • 最終的なUI実装(gui.py)

技術ロードマップ

中国語ピンイン入力法では、我々はシーケンスにシーケンスを綴り漢字の変換を完了する必要があり、例えば、「nihao」を入力し、入力方法は、「こんにちは」、我々が入力したい単語を与えるだろう、ここではいくつかの質問をすることができます。

  • アルファベットをカットするには? 
    このようにユーザが「xiana」を入力、入力方法は、ユーザが「西安A」(ビジーAH)または「NA夏」(シャナ)又は(AH西安)を「AのXI」を入力したいかどうかを決定する必要がありますか?
  • どのようにユーザーにリアルタイムのフィードバック?
  • 良いセグメンテーションアルファベットの場合は、ユーザの入力に中国の文字列を検索する方法ほとんどのユーザーに表示したいですか?
  • ユーザーが入力したピンインは、間違った状況下で、どのような間違いを容認するのですか?どのように表示するには?

多分、我々はより多くの質問をすることができ、中国語ピンイン入力メソッドは、常に詳細を引っ張って継続してそこに行くされているようなものです。
だから、どのように我々は、上記の問題を解決するのですか?次のように私たちのプログラムは以下のとおりです。

アルファベットをカットするには?

ここでは、ユーザーが最初の文字列がプレフィックスまたは正当なの発音表記で入力した場合、その後、私たちが発見した後、ユーザの入力まで、ユーザーの入力を待って、バックを見つけるしていきます、ある最長一致の方法により行いますN-1、元の(最初のnを想定)文字ではない有効なプレフィックス表音アルファベットではない正規、この時点で完全なアルファベットを発見した表音文字列にn-1個のカットの正面、など彼女は、与える「xiant」それはどちらも接頭正当なスペルが正当なピンイン、離れトンの前面から、その後部門ではありませんが見つかりませんでしたし、入力「xiant」は、その後、我々は「西安」までの文字列をスキャンします、(xiantianを失いたく)と同じようにアルファベットのその後の発見、「xian't」。
リアルタイムタスクでは、ユーザーが敗者をしていない場合でも、我々はまだ何かを示さなければならない、それでは、ピンインをセグメンテーションしましょう、せいぜい、最後のものだけが、我々が完了しますと不完全個別に対処し、不完全なピンインの接頭辞です。トライ木の訓練を受けてすべてを検索するHMMの最大出力文字列の確率は、その後、最終的に「T」によって得られた場合、「xian't」我々はビタビアルゴリズムに「西安」意志であると仮定「T」は、次の状態ビタビアルゴリズムを設定し、そのアルファベットを得ることができるように、最高周波数番号方ワードプレフィックスとその発生頻度、ビタビアルゴリズムを実行する前のn-1表音アップの組み合わせであります最高周波数ピンイン(つまり、私たちが観測かもしれない)のこれらの言葉は同じではない可能性があるため、中国の文字列の最も可能性の高い、我々は次の状態ビタビアルゴリズムが実行されているので、ビタビ実行と同じ単語を鳴らすことができます回数が固定され、それ以上の異常音の総数は、音が小さいのそれぞれに対応するので、合計時間に差がないため、異なる音が、これらの言葉。
特定のトライ木は後で説明します。

0から始まる中国のピンイン入力法とPython実装

どのようにユーザーにリアルタイムのフィードバック?

上記の事実は、我々はすべての文字を失うされなければならないリアルタイムのフィードバック、リアルタイムのユーザーからのフィードバックは、我々はユーザーがプレイしたい場合があり、文字を表示する方法を説明し始めている、そして、各ピンイン音標文字を開始するがたくさんあります単語を対応する結果がたくさんあることを、多くのかもしれないが、我々はこの時点で我々はトライを解決するために使用することができ、言葉の選択確率が最大数を比較、我々は唯一のすべての単語を考えることができ、見逃すことはできません。トライ木は、その白は、各リーフノードは表音ツリーに挿入根に沿って順番に音標文字プレフィックスツリーですが、これは根がすべての方法文字の組み合わせを取るためダウンし、我々はそのようピンインダウンしていますあなたが任意の文字列の接頭辞で、すべてのアルファベットを見つけることができ、その接頭サブツリーとして各リーフノードを介して、DFSすることで、今回はリーフノードは辞書には、それはピンインに対応するキーもあり、実際に保管しました単語、単語の出現頻度の値、比較として。

良いセグメンテーションアルファベットの場合は、ユーザの入力に中国の文字列を検索する方法ほとんどのユーザーに表示したいですか?

ユーザーが入力した隠れ状態、ピンインは、それは3 HMMの周波数行列の値の最尤推定値によって推定され、最終的にはビタビアルゴリズムによって発見され、明示的な状態であるとして、ここでは、隠れマルコフモデルを使用して、ユーザーが入力したテキストにたい中国の文字列の最大数の確率が表示されます。

ユーザーが入力したピンインは、間違った状況下で、どのような間違いを容認するのですか?どのように表示するには?

アカウントにフォールトトレランスの高度を達成するための複雑さを考えると、我々はそう、あなたはほとんどの時間は、入力方法のほとんどのユーザーが正しいスペルを入力しますので、自分の区切りを「「」を追加します分割したいとき、ユーザは、正しいスペルを入力すると仮定しますだけでなく、実装プロセスを簡素化仮定、およびユーザーエクスペリエンスの多くの損失なしに。

使用されるデータ

約によるトレーニング後の360Mは、HMMモデルを必要とする、私たちは合法的な文としてSogouの研究室、前処理からSogouQユーザーのクエリデータセットを見つけ、そして文は問い合わせを避けるために短すぎた、我々はまた、捜狐ニュースデータを増加させたとして、ほぼ30Mこれらの長い文章を多く含むトレーニングコーパス、。
これら二つのコーパスを訓練することによって、我々は、HMMモデル、長い文章やフレーズJiekeがより良い効果を実施しました。そして、我々はHMMモデルの精度を高めるために、コーパスを拡大し続けることができ、これは何か、もちろんのことです。

遭遇した問題と解決策、

  1. UIインターフェースシステムの複雑さに起因する問題、および異なるUIデザインを考え、私たちは多くの時間を過ごすことができます多くの不可解なバグ、ありました。
  2. 原因の多くがあり、対応する文字で始まる単語のスペルに効率ビタビアルゴリズム、我々はKの最高を取ると仮定し、我々は既存と発音の組み合わせこれらのKを必要とし、再度、ビタビアルゴリズムを実行し、一つの状態から計算する別の状態大量にビタビアルゴリズム関連遷移するので、我々は加速する方法メモリ(キャッシュ)を使用し、具体的な方法は、最後の状態に対応する一つの完全なビタビアルゴリズムピンイン文字列を記録することです私たちは別のケースピンイン(B)、ランビタビを追加するために、再び(a)のピンイン文字列に遭遇したので、もし、私たちは、状況の文字列のこのビタビ・アルゴリズムの組み合わせの先頭から実行を開始する必要がありますが、文字列から直接実行しないでくださいビタビの最後の状態の開始後(メモリセルから読み出され)、Bに移し
    メモリユニットは、プログラムとなり、常に存在してきた、とあなたは私たちが入力した場合、ということを意味入力方法我々は、ファイル(メモリユニット)を読み込みますが、起動したとき、私たちは、このオブジェクトに持続しませんでしたピンイン文字列は、もはやコアアルゴリズムを実行するために必要でないとき、我々は、後で同じピンイン文字列を入力しますが、結果が直接表示されるので、速度が大幅に改善しただろう、があるだろう、より良いより多くのあなたが使用する入力メソッドを使用します、より速くより多くのあなたは、いくつかのストレージスペースを犠牲に、当然のことながら、利益を使用していますが、今は収納スペースが不足していません。
  3. そのようなユーザーは、間違った感じのバックグリッドに行くときのようにダブルカウントが、それは特定の接頭辞に撤退しますが、実際にはこの接頭辞は、私たちが計算している、と我々は返すことを、オーバーすることを示しています我々は以前に非常に遅くなりますビタビ・アルゴリズムの最適化されていない場合は、それが再び再実行されますコア、時間の内容を表示しなければならなかったので、我々はキャッシュを使用して考え、結果はピンイン入力文字列と対応する位相を示し、我々は、迅速なバックスペースの操作をしたので、それを対応して保存します。
  4. 言語のみを交換する。この問題を解決するためのPython言語固有のパフォーマンスの問題は、実際には、C ++言語では、その後、私はそれがはるかに速く、後でこれは完全に実現可能である、C ++で実装と考えることができただろうと信じています。Pythonの学習qun七八〇から四5、7月八、214ビデオチュートリアル、ツール、戦闘活動のすべての種類を共有します

性能評価

入力は比較的早く、入力の大半は、1秒以内に表示することができます。文章を入力した後、バックスペース入力操作は、ミリ秒レベルです。

動作環境プログラムを考えます

  1. Pythonの2.7
  2. Pythonパッケージをインストールする必要があります。Tkinterの、はcPickle、pypinyinモジュールを

実行方法とパラメータ

プロジェクトプロジェクトディレクトリの下に、実行

$パイソンgui.py

それはすることができます。

今後の作品

以上のことから、私たちは、実際にあなたはまだのような、多くの作業を行うことができます見ることができます

  • こうしたC ++、大幅に削減計算のオーバーヘッドなどの変更のコンパイル言語
  • 常にユーザの入力HMMモデルで更新
  • 組込みシステムのソフトウェア
  • 私たちは、入力が遊びたい長い文章よりも少し、状況はそれほど文の同じピンイン入力文字列の長さの多くは、我々はフレーズを置き換えることができ、多くを再生したい場合がありますフレーズにしたくなかったがあることを観察しました。
  • ...

おすすめ

転載: blog.51cto.com/14445003/2420865