🍣

PyEnchantを使ってスペルチェックをしてみた

に公開

今回はPyEnchantを使って英語のスペルチェックをしてみました。

PyEnchantとは?

公式GitHubによると、Enchantは単語のスペルをチェックし、スペルミスがある場合は修正候補を提示するライブラリのようです。ispell、aspell、MySpellなど、多くの一般的なスペルチェックパッケージに対応しており、複数の辞書や言語に対応できる柔軟性も備えています。例えばHeloと入力した時にHelloじゃないですか?と提示してくれるイメージです。

ユースケースとしては、例えば英語を対象とした言語モデルを作るときに、存在していない単語を学習に利用しないために、不正確な単語が含まれているかをチェックするなどでしょうか。

使ってみた

インストール

インストール方法については詳しくはこちらを参照ください。

https://pyenchant.github.io/pyenchant/install.html

私はmacbookを使っているため、以下のように対応しました。

まずはbrewでenchantをインストールします。これがいわゆる辞書情報になります。なお、環境変数でライブラリの場所を指定しないとPythonを実行した時にエラーが発生します。

brew update
brew install enchant
export PYENCHANT_LIBRARY_PATH=/opt/homebrew/Cellar/enchant/2.8.2/lib/libenchant-2.2.dylib

次にPythonプロジェクトを初期化します。今回もuvを使ってみます。

uv init pyenchant_test -p 3.12 && cd pyenchant_test
uv add pyenchant

https://zenn.dev/akasan/articles/39f81f8bd15790

単語が辞書に登録されているか検出

それではまずは辞書に指定した単語が含まれているかチェックするコードを実装してみます。

import enchant

d = enchant.Dict("en_US")
print(f"{d.check("Hello")=}")
print(f"{d.check("Helo")=}")

このコードを実行すると以下の結果になります。結果から、Helloは辞書に登録されているがHeloは辞書に登録されていないことがわかります。

d.check("Hello")=True
d.check("Helo")=False

修正対象の提示

それでは次に、間違った単語から正しい単語を推測させてみます。

import enchant

d = enchant.Dict("en_US")

print(f"{d.suggest("Helo")=}")

これを実行すると以下の結果が表示されます。結果から、第一候補としてHelloが提案され、それ以外にも色々と提案されていますね。

d.suggest("Helo")=['Hello', 'Helot', 'Help', 'Halo', 'Hell', 'Heal', 'Heel', 'Held', 'Helm', 'Hero', "He'll", 'Hal', 'Hale', 'Hole', 'Hall', 'Hill', 'Hull', 'Holy', 'Hula']

例えばチェック対象の単語をinstructionが正しいけど誤ってinstractionとしたときにどうなるかみてみます。長い単語でもちゃんと間違いを訂正してくれることが確認できました。

d.suggest("instraction")=['instruction', 'ins traction', 'ins-traction', 'instr action', 'instr-action', 'interaction', 'instructions', 'abstraction', 'insurrection', 'instigation', 'instructing', "instruction's", 'instructional']

ちなみに正しい単語を指定すると、第一候補に同じ単語が現れます。

d.suggest("instruction")=['instruction', 'instructions', 'instruct ion', 'instruct-ion', 'obstruction', 'instructing', "instruction's", 'instructional', 'construction', 'interaction']

文章のチェック

先ほどまでの例は、あくまで単語ごとのチェックでしたが、以下のようにすると文章中の単語それぞれに検知をかけることができます。

from enchant.checker import SpellChecker

chkr = SpellChecker("en_US")
chkr.set_text("This is sme sample txt with erors.")
for err in chkr:
    print("ERROR:", err.word)

これを実行すると、以下のように間違った単語に対して検知が実行されます。

ERROR: sme
ERROR: txt
ERROR: erors

間違った単語の単語位置などもわかるため、それを利用して校正することができると思います。

import enchant
from enchant.checker import SpellChecker

d = enchant.Dict("en_US")

sentence = "This is sme sample txt with erors."
chkr = SpellChecker("en_US")
chkr.set_text(sentence)

print(f"Original: {sentence}")

for err in chkr:
    corrected_word = d.suggest(err.word)[0]
    sentence = sentence.replace(err.word, corrected_word)

print(f"Corrected: {sentence}")

これを実行すると以下のように正しい文章が生成できました。

Original: This is sme sample txt with erors.
Corrected: This is same sample text with errors.

まとめ

今回は単語のスペルチェックをするためのpyenchantを紹介しました。辞書の登録は必要ですが、単語の誤りを検知できるため自然言語を用いたデータセットを作りたい時などの校正にぜひ利用していただければと思います。

Discussion