10

gem または API を使用して、単語のスペルが間違っているかどうかを比較的簡単に確認する方法を探しています。

raspell、ffi-aspell、hunspell-ffi、spell_cheker、spellchecker など、いくつかの gem を使用してみましたが、それぞれに異なるエラーが発生します。

私はRubyにかなり慣れていないので、最初から何かを構築することを含まない単純な解決策を望んでいます(私は多くの短いテキストファイルを処理していて、スペルミスの単語の割合を計算したいです)。

ffi-aspell を試すと、次のエラーが表示されます。

/Users/ntaylorthompson/.rvm/gems/ruby-1.9.2-p320/gems/ffi-aspell-0.0.3/lib/ffi/aspell/speller.rb:121: [BUG] Segmentation fault
ruby 1.9.2p320 (2012-04-20 revision 35421) [x86_64-darwin11.4.0]

-- control frame ----------
c:0005 p:---- s:0019 b:0019 l:000018 d:000018 CFUNC  :speller_check
c:0004 p:0113 s:0013 b:0013 l:000012 d:000012 METHOD /Users/ntaylorthompson/.rvm/gems/ruby-1.9.2-p320/gems/ffi-aspell-0.0.3/lib/ffi/aspell/speller.rb:121
c:0003 p:0049 s:0007 b:0007 l:0005a8 d:0005d0 EVAL   ffi-aspell_test.rb:5
c:0002 p:---- s:0004 b:0004 l:000003 d:000003 FINISH
c:0001 p:0000 s:0002 b:0002 l:0005a8 d:0005a8 TOP   
---------------------------
-- Ruby level backtrace information ----------------------------------------
ffi-aspell_test.rb:5:in `<main>'
/Users/ntaylorthompson/.rvm/gems/ruby-1.9.2-p320/gems/ffi-aspell-0.0.3/lib/ffi/aspell/speller.rb:121:in `correct?'
/Users/ntaylorthompson/.rvm/gems/ruby-1.9.2-p320/gems/ffi-aspell-0.0.3/lib/ffi/aspell/speller.rb:121:in `speller_check'

-- C level backtrace information -------------------------------------------

[NOTE]
You may have encountered a bug in the Ruby interpreter or extension libraries.
Bug reports are welcome.
For details: http://www.ruby-lang.org/bugreport.html

Abort trap: 6

(1)上記の代替アプローチの提案、または(2)上記の5つのgemの使用に関する推奨事項のいずれかをいただければ幸いです。これにより、少なくとも最適なオプションのデバッグに時間を費やすことができます。

4

2 に答える 2

7

raspellはもう維持されていないので、libaspellヘッダーが利用できる場合は、ffi-aspellが適切なオプションです。

ライブラリを機能させることができない場合は、aspellバイナリにシェルアウトすることができます。次の方法はまさにそれを行います(単体テストを含む):

# Returns the percentage of incorrect words per document
#
def spellcheck(filename)
  fail "File #{filename} does not exist" unless File.exists?(filename)

  words = Float(`wc -w #{filename}`.split.first)
  wrong = Float(`cat #{filename} | aspell --list | wc -l`.split.first)

  wrong / words
end

if $0 == __FILE__
  require 'minitest/autorun'
  require 'tempfile'

  describe :spellcheck do
    def write(str)
      @file.write str
      @file.read
    end

    before do
      @file = Tempfile.new('document')
    end

    it 'fails when given a bad path' do
      -> { spellcheck('/tmp/does/not/exist') }.must_raise RuntimeError
    end

    it 'returns 0.0 if there are no misspellings' do
      write 'The quick brown fox'
      spellcheck(@file.path).must_equal 0.0
    end

    it 'returns 0.5 if 2/4 words are misspelled' do
      write 'jumped over da lacie'
      spellcheck(@file.path).must_be_close_to 0.5, 1e-8
    end

    it 'returns 1.0 if everything is misspelled' do
      write 'Da quyck bown foxx jmped oer da lassy dogg'
      spellcheck(@file.path).must_equal 1.0, 1e-8
    end

    after do
      @file.close
      @file.unlink
    end
  end
end

spellcheck()、、がパス上にあり、デフォルトの辞書が使用したいものであるcatwc想定しています。aspell単体テストはRuby1.9専用です。1.8を実行している場合は、それを削除してください。

于 2012-07-07T22:17:57.610 に答える
0

jmdeldin が raspell はもはや維持されていないと述べたように、ffi-aspell はそのフォークです。

私はそれを使って数分プレイしましたが、とても使いやすいです:

  1. 言語を指定する FFI::Aspell::Speller オブジェクトをインスタンス化します
  2. を使用して単語が正しいかどうかを確認しますspeller.correct?(word)
  3. を使用して単語の候補のリストを取得するspeller.suggestions(word)

: これまでに発見した大きな制限は、スペル チェックのインターフェイスが単語のみで動作することです。文書全体のスペル チェックを行う場合は、文書を単語に分割する必要があります。特にHTML入力がある場合、これは簡単なことではありません...

(もちろん aspell に依存するため、brew install aspell またはお好みのパッケージ マネージャーを使用してインストールする必要があります)

于 2013-12-04T11:27:51.067 に答える