今日は、X Neural Switcherで使用されている入力言語認識アルゴリズムについて説明します。
ご存じのように、Punto Switcherは、特定の言語の特定の文字の組み合わせが不可能であることに基づいて辞書を使用します。 Puntoがインストールされている場合は、ここで確認できます-%PROGRAMFILES%\ Yandex \ Punto Switcher \ Data \ triggers.dat。 少なくともそうはグーグルは私に言った。 これらの辞書は暗号化されています(難しくはありませんが、それでも)。
さらに、Puntoはカスタム例外を使用します。 それらが保存されている場所を言うことはできません-プログラムは閉じられています。
さて、xneurに戻ります。 Linux(2005)の使用に切り替えた時点では、レイアウトを認識して切り替える機能を宣言するプログラムが2つありました。sven(まだ生きている)とxneur(半分死んでいる)です。 仕上げにxneurを選んだのは、バージョン0.0.3(http://www.linux.org.ru/forum/talks/811959)でした。 その時点で、最初の開発者は実際にそれを放棄し、6か月以上の間、そこに動きはありませんでした。
当時、xneurは惨めなものでした。 いわばスリルの愛好家にとって、人々はまだバージョン0.0.3を持っています -それはひどいものでした。
レイアウトを認識する主なアイデアは、文字の組み合わせの「重み」のアイデアでした。 要するに、特定の、かなり大きなテキストが取られ、それに基づいて、特定の2文字の組み合わせが発生する頻度が考慮されました。 特定の言語の「重み」が計算され、ファイルに書き込まれました。
Xneurは単語を文字の組み合わせに分割し、各レイアウトの単語の「重み」を計算する必要がありました。 値が特定のしきい値(目で判断)を超えていた場合、単語はこのレイアウトに変換されました。
私がxneurに興味を持つようになった当時のことを試したところ、私はそれが良くないことに気づきました。 私はこれをすべて洗練する方法を考え始めました。
内部認識アルゴリズムが落ち着く前に、数年の試行錯誤が終わりました。 私には言語学や言語学の教育はありません。すべてのアルゴリズムは論理と直感に基づいて発明されました。
良心は、プントの辞書を使用することを許可しませんでした。また、xneurを多言語であると考えたという考慮事項もありません。
次に、プログラムで現在使用されているアルゴリズムについて説明します。
アルゴリズム
現在、xneurは多段階の言語定義を使用しています。 つまり アルゴリズムの信頼性の程度に応じて、アルゴリズムの範囲を指定しました。 おそらく、あなたの多くは、ここでアンチウイルスで使用される一種のランキングを見るでしょう。
文字列の配列は、入力条件としてレイアウト定義関数に渡されます。各関数は、システムにインストールされている各レイアウトに入力された文字の組み合わせです。
各段階で、最初のプログラムは、既に入力されているレイアウトに入力した単語を残すことが可能かどうかをチェックします。 そして、単語が現在のレイアウトに適合しない場合にのみ、残りのレイアウトがチェックされます。
次に、信頼性の高い順にオプションを選択します。
ユーザー辞書
この段階では、事前に定義した辞書(たとえば、電子メール、IP、MACを英語のレイアウトに切り替える)、ユーザーによって追加された辞書、または自己学習の過程でプログラム自体によって追加された辞書を使用して単語がチェックされます。
以前は、ユーザー辞書と正規表現(IP、MACなど)は個別の設定ファイルに分割されていましたが、後で結合されたため、ユーザーはルールをより柔軟に追加できます。 たとえば、文字の組み合わせ「ped」を追加すると、この文字の組み合わせが単語のどこで発生するかを示すことができるため、最初(「 ped al」)、最後(「cycle ped 」)または単語のみにこの文字の組み合わせ(「 wiki ped ia ")。
さらに、非常に上級のユーザーには、Perl正規表現標準に従って正規表現を作成する機会があります。 しかし、私の記憶では、誰もこの機会を利用していません。 たぶん人々は彼女のことを知らないでしょう?
システム辞書
ユーザー辞書のいずれにも単語が見つからない場合、プログラムは次のレベルの検証、つまりスペルチェッカーに進みます。 彼らが言うように、それらを発明し実装した人々に感謝します。
Xneurは、ビルドオプションに応じて、 aspellライブラリまたは(デフォルトで) エンチャントディクショナリのラッパーを使用できます。
aspellライブラリはかなり強力ですが、少し時代遅れのスペルチェッカーです。 Linuxパッケージディストリビューションを使用している場合、辞書パッケージは、言語に応じてaspell-ru、aspell-uk、またはaspell-enと呼ばれます。
xneurでの辞書のサポートが始まったのはこのライブラリでした。 残念ながら、このライブラリで使用できる辞書の数は増えていません。そのため、私はこのライブラリの代わりを探す必要がありました。
代わりに、私の目はmyspellとhunspellに 、そしてEnchant辞書の壮大なラッパーに目を向けました。 辞書のこのラッパーは、スペルチェッカーAbiWord、LibreOffice、Firefoxで使用されます。
Enchantは、さまざまな辞書ライブラリの単なるラッパーであり、辞書ライブラリ自体ではありません。 さまざまな辞書エンジンをその翼の下で組み合わせ、プログラミングと速度の利便性を組み合わせています。
基本的に、Ubuntuでは、EnchantはMyspell辞書を使用し、まれな言語の他の辞書のみを接続します。
したがって、xneurはデフォルトでEnchantも使用します。
ヒューリスティック分析
辞書形式の信頼できる情報源が、単語がいずれかのレイアウトに属しているかどうかを判断できなかった場合、最も信頼性の低い、実際には最も興味深いステップであるヒューリスティック分析が有効になります。
多くの試行錯誤の後、私はまだ既存のバージョンに来ました。 しかし、最初は適切ではない中間オプションについて説明します。
文字の組み合わせの「重み」 。 このオプションについては記事の冒頭ですでに述べましたが、もう一度書きます。 要するに、特定の、かなり大きなテキストが取られ、それに基づいて、特定の2文字の組み合わせが発生する頻度が考慮されました。 文字の組み合わせはラテン語であると想定されていました。 特定の言語の文字の組み合わせの「重み」が計算され、ファイルに書き込まれました。
Xneurは単語を文字の組み合わせに分割し、各レイアウトの単語の「重み」を計算する必要がありました。 値が特定のしきい値(目で判断)を超えていた場合、単語はこのレイアウトに変換されました。
一般的に、重みの計算の複雑さと切り替え属性のエフェメリティのために、このアルゴリズムをすぐに放棄しなければなりませんでした。 このアルゴリズムを完成させて、お菓子を作ることができるとは感じていませんが。
言語の有効な組み合わせ 。 ここでは簡単です。 この単語のすべての文字の組み合わせが特定の辞書に含まれている場合、単語は1つまたは別のレイアウトに属します。
運転していません-リソースの面で長くて高価です。 同時に、文字の組み合わせは常にラテンアルファベットで保存されていたため、トランスコーディングが楽しくなりました。
そして、このようにして、言語に受け入れられないヒューリスティックと文字の組み合わせの現代版に到達しました 。 この時点で、レイアウトを翻訳するコストを削減するために、テストする言語の文字に文字の組み合わせを保存する必要があることを理解するようになりました。
現在のアルゴリズムによれば、この単語からの文字の組み合わせがそのような文字の組み合わせのリストにある場合、単語はいずれかの言語に属することはできません。 proto-languagesと呼ばれる文字の組み合わせのリスト。 ヒューリスティックが構築されるのは、原言語に基づいています。
xneurのプロト言語には、大と小の2つのタイプがあります。 大きなものは3文字の長さの組み合わせで、小さなものは2文字の長さです。 なぜこの分離が必要なのですか? すべてがシンプルです-大きなプロトは10〜15倍小さくなります。 したがって、ワードプロセッシングの時間が短縮されます。 つまり 最初に、単語が大きなプロトタイプでチェックされ、次に(識別が行われなかった場合)小さな単語でチェックされます。
プロトタイプ言語自体は、xneur自体を使用して取得されます。 既に生成メカニズムがあります。 必要なレイアウトをシステムにインストールし、この言語でテキストを取得しますが、より正確には、目的のキーでxneurを実行してください!
原言語は最新の認識アルゴリズムです。 単語がすべての段階を経て障害物に遭遇しなかった場合、その単語は以前のレイアウトに残ります。
要約する
私が示したように、xneurアルゴリズムは非常に単純です。
おそらく、誰かがマルコフ連鎖のような恐ろしく複雑なアルゴリズムを明らかにすることを私に期待したが、これは起こらなかった。
xneurを開発するとき、私は単純なKISSルールに従いました-それを単純にしてください、あなたはばかです! そして、実践が示しているように、そのようなアルゴリズムでの誤検知のレベルは非常に低いです。 もちろん、現時点では、ユーザーはシステム辞書を配置する必要がありますが、これは処理速度に大きな負担にはなりません。
このトピックに関するアイデアや開発がある場合は、コメントで喜んで議論します。 結局のところ、オープンソースの力はコミュニティにあります!
前のパーツ
X Neural Switcher-The Cookbook(パート0)。 はじめに 組み立てと構成
X Neural Switcher-The Cookbook(パート1)。 先駆者とアナログ
さらなる記事で私は話します:
- xneurをキーロガーとして設定します。
- グリッチとジョークxlib、ロケール、さまざまなDE。