2012-07-06 99 views
9

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

我试过使用几种宝石 - 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个宝石 - 所以我至少可以花时间调试最好的选择。

+1

什么错误是你得到些什么?你有没有为aspell宝石安装aspell? – jmdeldin 2012-07-07 20:43:21

+0

我使用Homebrew安装了Aspell,并且刚刚发布了上述ffi-aspell错误 - 任何见解? – TaylorT 2012-07-09 14:03:26

回答

6

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,只需将其删除即可。

+0

非常感谢!我能够同时获得ffi-aspell和上述方法。事实证明,我不用安装字典就可以安装aspell(通过指定--lang = en)。 – TaylorT 2012-07-09 14:38:14

0

由于jmdeldin说raspell不再维护,ffi-aspell是它的一个分支。

我打几分钟,它和它很容易使用:

  1. 实例化一个FFI ::安博泰::拼写对象,指定的语言
  2. 检查一个字使用speller.correct?(word)
  3. 是正确的获取的建议列表使用speller.suggestions(word)

注意一句话:更大的限制我到目前为止发现的是拼写器的the interface只能用于单词。如果你想拼写检查整个文件,你需要用文字分割。这不可能是微不足道的,特别是如果你有一个HTML输入...

(这取决于当然的aspell,所以你需要安装它使用BREW的aspell安装或首选的软件包管理器)