2012-07-06 16 views
9

Sto cercando un modo relativamente rapido per controllare se le parole sono errate, utilizzando una gemma o un'API.Metodo di controllo ortografico semplice/gemma in rubino?

Ho provato a utilizzare diverse gemme: raspell, ffi-aspell, hunspell-ffi, spell_cheker e correttore ortografico e ognuna ha un errore diverso.

Sono abbastanza nuovo da rubino e spero in una soluzione semplice (sto elaborando un sacco di file di testo brevi e voglio calcolare la% di parole mis-spelled) che non include la creazione di qualcosa da zero.

Quando si cerca FFI-aspell, ottengo il seguente errore:

/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 

mi farebbe piacere o (1) un suggerimento di un approccio alternativo a quelli sopra o (2) una raccomandazione di cui da usare delle 5 gemme sopra - quindi posso almeno spendere tempo a mettere a punto l'opzione migliore.

+1

di quali errori sono voi ottenendo? Hai installato aspell per le gemme di aspell? – jmdeldin

+0

Ho installato Aspell con Homebrew, e ho appena postato l'errore ffi-aspell sopra - qualche intuizione? – TaylorT

risposta

6

raspell non viene più gestito, quindi ffi-aspell è una buona opzione se si dispone delle intestazioni libaspell disponibili.

Se non riesci a far funzionare le librerie, puoi semplicemente utilizzare il binario aspell. Il seguente metodo farà proprio questo (unit test inclusi):

# 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() presuppone che cat, wc e aspell sul vostro cammino, e che il dizionario predefinito è quello che si desidera utilizzare. Il test unitario è solo per Ruby 1.9 - se hai 1.8, basta eliminarlo.

+0

Grazie mille! Sono stato in grado di ottenere sia ffi-aspell che il metodo sopra per funzionare. Si scopre che preparo l'aspell installato senza installare il dizionario (specificando --lang = it). – TaylorT

0

Come jmdeldin ha detto che raspell non viene più mantenuto, ffi-aspell ne è una biforcazione.

ho giocato qualche minuto con esso ed è abbastanza facile da usare:

  1. un'istanza di un oggetto FFI :: :: Aspell Speller specificando la lingua
  2. Controllare se una parola è corretta utilizzando speller.correct?(word)
  3. ottenere un elenco di suggerimenti per una parola utilizzando speller.suggestions(word)

NOTA: La più grande limitazione I' Ho trovato finora è che the interface dello speller funziona solo su parole. Se si desidera eseguire il controllo ortografico di un intero documento, è necessario dividerlo in parole. Questo non poteva essere banale, soprattutto se si dispone di un ingresso HTML ...

(dipende aspell naturalmente quindi è necessario installarlo utilizzando birra installare aspell o il vostro gestore di pacchetti preferito)

Problemi correlati