2

私は電話のような T9 システムを実行しようとしていますが、代わりにキーパッドを使用しています。これを行う方法について、本当にアドバイスが必要です。

使用したい単語を含むテキストファイルを既に見つけました。2 番のボタンを 'abc' 3 = 'def', 4='ghi' などとして使用できるようにしたい.

4

3 に答える 3

4

これは力ずくの T9 模倣者です。

import itertools 

n2l={2:'abc',3:'def',4:'ghi',5:'jkl',6:'mno',7:'pqrs',8:'tuv',9:'wxyz'}

with open('/usr/share/dict/words','r') as di:  # UNIX 250k unique word list 
    all_words={line.strip() for line in di}

def combos(*nums):
    t=[n2l[i] for i in nums]
    return tuple(''.join(t) for t in itertools.product(*(t)))

def t9(*nums):
    combo=combos(*nums)
    return sorted(word for word in all_words if word.startswith(combo))

def try_it(*nums):
    l=list(t9(*nums))
    print('  {:10} {:10,} words'.format(','.join(str(i) for i in nums),len(l)))
    if len(l)<100:
        print(nums,'yields:',l)

try_it(2)
try_it(2,3)
try_it(2,3,4)
try_it(2,3,3,4)
try_it(2,3,3,4,5)

版画:

  2              41,618 words
  2,3             4,342 words
  2,3,4             296 words
  2,3,3,4           105 words
  2,3,3,4,5          16 words
(2, 3, 3, 4, 5) yields: ['aedile', 'aedileship', 'aedilian', 'aedilic', 'aedilitian', 
    'aedility', 'affiliable', 'affiliate', 'affiliation', 'bedikah', 'befilch', 
    'befile', 'befilleted', 'befilmed', 'befilth', 'cedilla']

25 万語 (非常に大きなセット) から始めて、扱いやすいサイズに収束するには 5 つの数字が必要であることがわかります。

このコードは説明用であり、すぐに使用を開始できますが、さらに 2 つのことが必要です。

  1. より小さな単語のセット ;-) および
  2. UI の T9 オートコンプリート領域に表示されるより一般的な単語のランキング。(つまり、'affiliate' または 'affiliation' は、'aedile' や 'befilth' よりも (2, 3, 3, 4, 5) からの目的の単語である可能性がはるかに高くなります。これらは何らかの方法でランク付けする必要があります...)

テイク 2

ここでは、重み付けの簡単な試みを示します。私は同じ大きな辞書 (一般的な Unix の「単語」ファイル) を読みますが、それらの単語をProject Gutenberg の The Adventures of Sherlock Holmes で重み付けします。

from collections import Counter
import re
import itertools 

all_words=Counter()
n2l={2:'abc',3:'def',4:'ghi',5:'jkl',6:'mno',7:'pqrs',8:'tuv',9:'wxyz'}
with open('/usr/share/dict/words','r') as di:  # UNIX 250k unique word list 
     all_words.update({line.strip() for line in di if len(line) < 6}) 

with open('holmes.txt','r') as fin:   # http://www.gutenberg.org/ebooks/1661.txt.utf-8
    for line in fin:
         all_words.update([word.lower() for word in re.findall(r'\b\w+\b',line)])

def combos(*nums):
    t=[n2l[i] for i in nums]
    return tuple(''.join(t) for t in itertools.product(*(t)))

def t9(*nums):
    combo=combos(*nums)
    c1=combos(nums[0])
    first_cut=(word for word in all_words if word.startswith(c1))
    return (word for word in first_cut if word.startswith(combo))

def try_it(*nums):
    s=set(t9(*nums))
    n=10
    print('({}) produces {:,} words. Top {}:'.format(','.join(str(i) for i in nums),
            len(s),min(n,len(s))))
    for i, word in enumerate(
          [w for w in sorted(all_words,key=all_words.get, reverse=True) if w in s],1):
        if i<=n:
            print ('\t{:2}:  "{}" -- weighted {}'.format(i, word, all_words[word]))

    print()        

try_it(2)
try_it(2,3)
try_it(2,3,4)
try_it(2,3,3,4)
try_it(6,6,8,3)   
try_it(2,3,3,4,5)      

版画:

(2) produces 2,584 words. Top 10:
     1:  "and" -- weighted 3089
     2:  "a" -- weighted 2701
     3:  "as" -- weighted 864
     4:  "at" -- weighted 785
     5:  "but" -- weighted 657
     6:  "be" -- weighted 647
     7:  "all" -- weighted 411
     8:  "been" -- weighted 394
     9:  "by" -- weighted 372
    10:  "are" -- weighted 356

(2,3) produces 261 words. Top 10:
     1:  "be" -- weighted 647
     2:  "been" -- weighted 394
     3:  "before" -- weighted 166
     4:  "after" -- weighted 99
     5:  "between" -- weighted 60
     6:  "better" -- weighted 51
     7:  "behind" -- weighted 50
     8:  "certainly" -- weighted 45
     9:  "being" -- weighted 45
    10:  "bed" -- weighted 40

(2,3,4) produces 25 words. Top 10:
     1:  "behind" -- weighted 50
     2:  "being" -- weighted 45
     3:  "began" -- weighted 25
     4:  "beg" -- weighted 13
     5:  "ceiling" -- weighted 10
     6:  "beginning" -- weighted 7
     7:  "begin" -- weighted 6
     8:  "beggar" -- weighted 6
     9:  "begging" -- weighted 4
    10:  "begun" -- weighted 4

(2,3,3,4) produces 5 words. Top 5:
     1:  "additional" -- weighted 4
     2:  "addition" -- weighted 3
     3:  "addicted" -- weighted 1
     4:  "adding" -- weighted 1
     5:  "additions" -- weighted 1

(6,6,8,3) produces 11 words. Top 10:
     1:  "note" -- weighted 38
     2:  "notes" -- weighted 9
     3:  "move" -- weighted 5
     4:  "moved" -- weighted 4
     5:  "novel" -- weighted 4
     6:  "movement" -- weighted 3
     7:  "noted" -- weighted 2
     8:  "moves" -- weighted 1
     9:  "moud" -- weighted 1
    10:  "november" -- weighted 1

(2,3,3,4,5) produces 0 words. Top 0:
于 2012-08-22T17:14:09.577 に答える
0

素朴なアプローチは、与えられた数字列から生じる文字のすべての可能な組み合わせを生成することです。これらの組み合わせは、基本的に文字の N タプルのデカルト積であり、各タプルは数字に対応し、N は単語の長さであることに注意してください。itertools.productすべての組み合わせを取得するには、次のように使用できます。

itertools.product(*(letters(d) for d in digits))

ここlettersで、 は関数で、letters('1')戻り値'abc'などdigitsは単語を表す数字列です。次に、単語リストを反復処理して、一致するものを見つけます。

于 2012-08-22T14:15:04.130 に答える