自然言語処理の深遠

Deep Dive Into Natural Language Processing

PyEnchant使ってサクッとスペルチェックをする

Pythonで英語のスペルチェックをしようとしていたら、PyEnchantというライブラリを見つけたので紹介。PyEnchantを使うことで、スペルチェックしたりミススペルした単語に対して訂正語を提示したりできる。イメージ的にはGoogleのもしかしてに近いことをできる。

もともとはEnchantというC++で書かれたスペルチェッカーがあるのだが、PyEnchantはそのPythonバインディングという位置づけ。詳しい情報は以下の公式サイトを当たると良い。

PyEnchant a spellchecking library for Python

パッと見た限りでは日本語の情報もなかったので、この記事では簡単な使い方を紹介しておく。

インストー

インストールは pip でするだけ:

$ pip install pyenchant

ただし、Windowsユーザは専用のインストーラーを使う必要があるかもねーとのこと。

使い方

まずは辞書オブジェクトをロードする必要がある。このオブジェクトを使うことで、スペルチェックしたり、ミススペルした単語に対して訂正語を提示したりできる。以下のようにして辞書を読み込みスペルチェックする:

>>> import enchant
>>> d = enchant.Dict("en_US")
>>> d.check("Hello")
True
>>> d.check("Helo")
False

checkメソッドは単語が正しく綴れている場合は True を返し誤っている場合は Falseを返すという仕様。

ミススペルしている単語に対して訂正語を提示したい場合には以下のようにsuggestメソッドを呼ぶだけでできる:

>>> d.suggest("Helo")
['He lo', 'He-lo', 'Hello', 'Helot', 'Help', 'Halo', 'Hell', 'Held', 'Helm', 'Hero', "He'll"]

suggestionの結果はリストで返され、もっとも可能性が高いものから順序付けされている。

単語ではなく文章中のミススペルした単語に対してsuggestionしたい場合は以下のようにすればできた:

from enchant.checker import SpellChecker


class SpellCorrector(object):

    def __init__(self):
        self._chkr = SpellChecker("en_US")

    def suggest(self, text, n=5):
        words = self._detect(text)
        candidates = {word: self._chkr.suggest(word)[:n] for word in words}
        return candidates

    def _detect(self, text):
        self._chkr.set_text(text)
        words = [err.word for err in self._chkr]
        return words


if __name__ == '__main__':
    from pprint import pprint
    text = "This is sme sample txt with erors."
    corrector = SpellCorrector()
    candidates = corrector.suggest(text)
    pprint(candidates)

結果は以下のとおり:

{'erors': ['errs', 'errors'],
 'sme': ['time', 'ems', 'me', 'Esme', 'same'],
 'txt': ['text', 'ext', 'tit', 'tat', 'tot']}

まぁまぁ・・・かな?

おわりに

今回はスペルチェック用のライブラリであるPyEnchantを紹介した。 めちゃくちゃ良い結果を出力できるわけではないので自動訂正とかには向かないが、候補を表示して気づきを与えるのには使えるかもしれない。