PHPアプリケーションの「レイアウトの自動切り替え」

良い一日!



最近、私はチャットシステムを開発している、いわばチャット3.0です。 このアイデアは、dkLabの彗星サーバーRealplexorのような興味深く便利なものに出会った後に生まれました。 しかし、今はそれについてではありません...



メインエンジンが書いて、チャットは機能し、ユーザーはコミュニケーションを取り、すべては何もないように見えますが、1つだけあります! それでも私たちは人間であり、キーボードレイアウトを英語からロシア語に切り替えるのを忘れることがあります。 n番目の単語を書いた後、私たちはメッセージを送ります。私たちが見るものは間違ったレイアウトで書かれており、だれもこのテキストを書き直したくはありません。 そして、そのようなメッセージを修正するための非常に簡単な方法を考え出すことが決定されました。





だから、私は座って映画を見て、2番目、3番目-そして思考が来て、ロシア語の頻繁に遭遇する特定の数の単語を収集します。 私はウィキペディアに登り、驚くべきことに、興味のあるテーマに関する情報を見つけました。



作業の半分は、作業のアルゴリズムを作成し、関数を作成することです。



アルゴリズムは非常に簡単です。

  1. 文字列を小文字に変換します
  2. 不要な文字を削除する
  3. 言葉に分解します
  4. ウィキペディアで見つけた単語の一致を探しており、その数を覚えています
  5. 一致の数が、文が正しいレイアウトで記述されていないことを考慮するために私たちが示した制限以上である場合、文の文字と記号を正しいものに変更します。




シンプル! そう?



phpの関数は次のようになります。



function orfFilter($string){ /*-               */ $countErrorWords = 1; /*   */ $countError = 0; /*   ,       */ $errorWords = array('b', 'd', 'yt', 'jy', 'yf', 'z', 'xnj', 'c', 'cj', 'njn', ',snm', 'f', 'dtcm', "'nj", 'rfr', 'jyf', 'gj', 'yj', 'jyb', 'r', 'e', 'ns', 'bp', 'pf', 'ds', 'nfr', ';t', 'jn', 'crfpfnm',"'njn", 'rjnjhsq', 'vjxm', 'xtkjdtr', 'j', 'jlby', 'tot', ',s', 'nfrjq', 'njkmrj', 'ct,z', 'cdjt', 'rfrjq', 'rjulf', 'e;t', 'lkz', 'djn', 'rnj', 'lf', 'ujdjhbnm', 'ujl', 'pyfnm', 'vjq', 'lj', 'bkb', 'tckb', 'dhtvz', 'herf', 'ytn', 'cfvsq', 'yb', 'cnfnm', ',jkmijq', 'lf;t', 'lheujq', 'yfi', 'cdjq', 'ye', 'gjl', 'ult', 'ltkj', 'tcnm', 'cfv', 'hfp', 'xnj,s', 'ldf', 'nfv', 'xtv', 'ukfp', ';bpym', 'gthdsq', 'ltym', 'nenf', 'ybxnj', 'gjnjv', 'jxtym', '[jntnm', 'kb', 'ghb', 'ujkjdf', 'yflj', ',tp', 'dbltnm', 'blnb', 'ntgthm', 'nj;t', 'cnjznm', 'lheu', 'ljv', 'ctqxfc', 'vj;yj', 'gjckt', 'ckjdj', 'pltcm', 'levfnm', 'vtcnj', 'cghjcbnm', 'xthtp', 'kbwj', 'njulf', 'dtlm', '[jhjibq', 'rf;lsq', 'yjdsq', ';bnm', 'ljk;ys', 'cvjnhtnm', 'gjxtve', 'gjnjve', 'cnjhjyf', 'ghjcnj', 'yjuf', 'cbltnm', 'gjyznm', 'bvtnm', 'rjytxysq', 'ltkfnm', 'dlheu', 'yfl', 'dpznm', 'ybrnj', 'cltkfnm', 'ldthm', 'gthtl', 'ye;ysq', 'gjybvfnm', 'rfpfnmcz', 'hf,jnf', 'nhb', 'dfi', 'e;', 'ptvkz', 'rjytw', 'ytcrjkmrj', 'xfc', 'ujkjc', 'ujhjl', 'gjcktlybq', 'gjrf', '[jhjij', 'ghbdtn', 'pljhjdj', 'pljhjdf', 'ntcn', 'yjdjq', 'jr', 'tuj', 'rjt', 'kb,j', 'xnjkb', 'ndj.', 'ndjz', 'nen', 'zcyj', 'gjyznyj', 'x`', 'xt'); /*     */ $delChar = array('!' => '', '&' => '', '?' => '', '/' => ''); /**/ $expectWord = array('.'=>'/me'); /*    */ $arrReplace = array('q'=>'', 'w'=>'', 'e'=>'', 'r'=>'', 't'=>'', 'y'=>'', 'u'=>'', 'i'=>'', 'o'=>'', 'p'=>'', '['=>'', ']'=>'', 'a'=>'', 's'=>'', 'd'=>'', 'f'=>'', 'g'=>'', 'h'=>'', 'j'=>'', 'k'=>'', 'l'=>'', ';'=>'', "'"=>'', 'z'=>'', 'x'=>'', 'c'=>'', 'v'=>'', 'b'=>'', 'n'=>'', 'm'=>'', ','=>'', '.'=>'', '/'=>'.', '`'=>'', 'Q'=>'', 'W'=>'', 'E'=>'', 'R'=>'', 'T'=>'', 'Y'=>'', 'U'=>'', 'I'=>'', 'O'=>'', 'P'=>'', '{'=>'', '}'=>'', 'A'=>'', 'S'=>'', 'D'=>'', 'F'=>'', 'G'=>'', 'H'=>'', 'J'=>'', 'K'=>'', 'L'=>'', ':'=>'', '"'=>'', '|'=>'/', 'Z'=>'', 'X'=>'', 'C'=>'', 'V'=>'', 'B'=>'', 'N'=>'', 'M'=>'', '<'=>'', '>'=>'', '?'=>',', '~'=>'', '@'=>'"', '#'=>'№', '$'=>';', '^'=>':', '&'=>'?'); /*      $arrReplace*/ $arrReplace2 = array_flip($arrReplace); /*  */ unset($arrReplace2['.']); unset($arrReplace2[',']); unset($arrReplace2[';']); unset($arrReplace2['"']); unset($arrReplace2['?']); unset($arrReplace2['/']); /*    */ $arrReplace = array_merge($arrReplace, $arrReplace2); /*   ,      ,    */ $string2 = strtr(trim(strtolower($string)), $delChar); $arrString = explode(" ", $string2); /*         -*/ foreach ($arrString as $val){ if (array_search($val, $errorWords)){ $countError++; } } return ($countError >= $countErrorWords)?strtr(strtr($string ,$arrReplace),$expectWord):$string; }
      
      







おわりに



はい、この方法は完全に正確ではなく、「松葉杖」と呼ばれていますが、非常に簡単です。 現時点では、私のニーズに適しています。

将来的には、間違ったレイアウトの定義をエンディングなどで書き直したいです。



誰かが実際にこのアプローチを見たい場合は、チャットに行くことができます



誰かを助けてくれたら嬉しいです。



UPD: Koryakin Sergey(sergekoriakin@gmail.com)という名前男性が、JSでのこの関数の翻訳へのリンクを2 投げました-2



All Articles