1

私は単純なコマンド ライン python プログラムを作成し、ユーザー入力をスペル チェッカーで検証しています。以前に SOでhttp://norvig.com/spell-correct.htmlを見つけ、それを使用してユーザーが入力する内容を検証しています。私の場合、BART ステーションのリストに対してユーザー入力を検証しています。ユーザーはステーションの名前を正確に入力するか、スペル チェッカーから候補を取得する必要があります。これは、私が検証している BART ステーションのリストです。

Lake Merritt
Daly City
Fruitvale
Coliseum/Oakland Airport
San Leandro
.
.
.

私が行っていることと見つけたサンプル コードの違いは、「Fruitvale」だけでなく「Daly City」という複数の単語に対して検証を行っていることです。私は正規表現とPythonが苦手で、各行の読み方を理解し、行の最初から最後まですべてをチェックしようとしています。そのため、1行ですべてを読み取るための正規表現を理解するのに苦労しています。変更しようとしているコードは次のとおりです。

def words(text): return re.findall('[a-z]+', text.lower()) 

text は、例で使用される大きなテキスト ファイルです。

私は試した

def words(text):
  lines=text.split('\n')
  return re.search('[a-z]+', lines)

それは(少なくとも私にとっては)文字列内の少なくとも1つの小文字を各行で検索していることを意味するため、うまくいくと考えています。しかし、これを取り戻しました

Traceback (most recent call last):
File "spell.py", line 15, in <module>
NWORDS = train(words(file('stations.txt').read()))
File "spell.py", line 6, in words
return re.search('[a-z]+', lines)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py",       line 142, in search
return _compile(pattern, flags).search(string)
TypeError: expected string or buffer

これを行う方法がよくわかりません。誰でも助けることができますか?

4

1 に答える 1

1

おそらくdifflib、Norvig のスペル修正プログラムの代わりに使用します。difflibユーザーが入力した文字列に最も近い BART ステーションの文字列を推測するのに役立つget_close_matches関数があります。例えば、

import difflib

bart_stations = ['Lake Merritt', 'Daly City', 'Fruitvale', 'Coliseum/Oakland Airport',
                 'San Leandro']

while True:
    text = raw_input('Enter BART station: ')
    if not text: break  # Pressing Enter quits
    guess = difflib.get_close_matches(text, bart_stations, n=1, cutoff=0)[0]
    print('Closest match: {g}'.format(g = guess))

スクリプトを実行すると、次の結果が得られます。

% test.py
Enter BART station: Merit
Closest match: Lake Merritt
Enter BART station: Fruity
Closest match: Fruitvale
Enter BART station: Coli
Closest match: Daly City
Enter BART station: Col
Closest match: Coliseum/Oakland Airport
Enter BART station: Lean
Closest match: San Leandro
Enter BART station: 
于 2013-02-18T02:24:13.147 に答える