10

我正在寻找一种相对快速的方法来检查单词是否拼写错误,无论是使用 gem 还是 API。

我尝试过使用几个 gem——raspell、ffi-aspell、hunspell-ffi、spell_cheker 和 spellchecker——每个都有不同的错误。

我对 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()假设您的路径上有catwcaspell,并且默认字典是您想要使用的。单元测试仅适用于 Ruby 1.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 回答