T9 DIY

こんにちは、Habr!



携帯電話でsmsまたは単にテキストを入力することにより、私はずっと自分でT9アルゴリズムを作りたいと思っていました。



アルゴリズムは理解できますが、誰もが手に届きませんでした。



今日、私はまだ集まり、それをなんとかすることができました。



だから最初にすることは、私が手に入れたいものを定式化することです。



タスク :携帯電話のキーボードのアナログを作成し、数字を入力して-単語のリストを取得します。

制限 :特別な制限はありませんでしたが、すべて同じように、ただの楽しみのために動作しますが、私はそれが1秒の解析の領域にあることを望みます。

機能として :言語サポート。



26,000語のファイルが単語ベースとして使用されました。



アルゴリズム自体:



私のアルゴリズムは条件付きで2つの部分に分かれています。

パート1-対応する数字の文字の1つで始まるすべての単語を選択します。

つまり、番号3では、d、e、fで始まるすべての単語が選択されます。



パート2-すべての数字を順番に調べ、不適切な単語を除外します。



言語サポート

言語サポートは、文字を数字に置き換えることで実行されることを誰もが理解していると思います。

この実装では、以下に示します。



デモンストレーションとして、jqueryと電話ボタンのエミュレーションが使用されます。



ここで見ることができます



PHPのクラス自体:

class T9_Exception extends Exception {

}



abstract class T9 {

protected $wordlist = array ( ) ; //

protected $enum = array ( ) ; //

protected $mb_support = true ; //



public function mb_support ( $status = true ) {

$this -> mb_support = $status ;

}

public function __construct ( $filename = null ) {

if ( $filename )

$this -> load ( $filename ) ; //

}

public function load ( $filename ) {

if ( file_exists ( $filename ) && is_readable ( $filename ) ) {

$this -> wordlist = file ( $filename ) ;

//array_walk( $this->wordlist, create_function('&$w', '$w=trim($w);')); //

return ;

}

throw new T9_Exception ( "Can not read $filename " , 100 ) ;



}

/**

* Fetch data from wordlist

* @param string $input

* @return array

*/


public function fetch ( $input ) {

$compare = array ( ) ;

$total = count ( $this -> wordlist ) ;

for ( $i = 0 ; $i < $total ; $i ++ ) {

$len = strlen ( $this -> enum [ $input [ 0 ] ] ) ;

for ( $j = 0 ; $j < $len ; $j ++ ) {

if ( $this -> mb_support == true ) {

if ( mb_strpos ( $this -> wordlist [ $i ] , $this -> enum [ $input [ 0 ] ] [ $j ] ) === 0 )

$compare [ ] = $this -> wordlist [ $i ] ;

}

else {

if ( strpos ( $this -> wordlist [ $i ] , $this -> enum [ $input [ 0 ] ] [ $j ] ) === 0 )

$compare [ ] = $this -> wordlist [ $i ] ;

}



}

}

for ( $i = 1 ; $i < strlen ( $input ) ; $i ++ ) {

$found = false ;

$newcompare = array ( ) ;

for ( $k = 0 ; $k < count ( $compare ) ; $k ++ ) {

for ( $j = 0 ; $j < strlen ( $this -> enum [ $input [ $i ] ] ) ; $j ++ ) {

$letter = $this -> enum [ $input [ $i ] ] [ $j ] ;

if ( $this -> mb_support == true ) {

if ( mb_strtolower ( $compare [ $k ] [ $i ] ) == $letter )

$newcompare [ ] = $compare [ $k ] ;

}

else {

if ( $compare [ $k ] [ $i ] == $letter )

$newcompare [ ] = $compare [ $k ] ;

}







}

}

$compare = $newcompare ;

}

return $compare ;

}

}





class T9_English extends T9 {



protected $enum = array (

0 => '' ,

1 => '' ,

2 => 'abc' ,

3 => 'def' ,

4 => 'ghi' ,

5 => 'jkl' ,

6 => 'mno' ,

7 => 'pqrs' ,

8 => 'tuv' ,

9 => 'wxyz' ,

) ;

}



class T9_Russian extends T9 {

protected $enum = array (

0 => '' ,

1 => '' ,

2 => '' ,

3 => '' ,

4 => '' ,

5 => '' ,

6 => '' ,

7 => '' ,

8 => '' ,

9 => '' ,



) ;

}








UPD :出力でいくつかのバイトが消えました。これについては、このリンクでもソースコードをレイアウトしました。

http://anton.in.ua/demo/t9/t9.txt



ロシア語の辞書はチェックしませんでしたが、アルゴリズムから判断すると同じように機能するはずです。



ここに心のためのそのような小さなトレーニングがあります。



ご清聴ありがとうございました。



All Articles