论坛首页 综合技术论坛

与君共品代码: Spelling Corrector

浏览 21010 次
该帖已经被评为良好帖
作者 正文
   发表时间:2011-05-11  
要是能把这个印在T恤上就好了


  • 大小: 321.7 KB
0 请登录后投票
   发表时间:2011-05-11   最后修改:2011-05-11
----
多想LS的RMB能像代码一样可以ctrl+c,然后不断ctrl+v,那该多好啊、、、
----
楼主的文章确实不错,也很膜拜这段代码,但、哎、、、、
0 请登录后投票
   发表时间:2011-05-12  
写的不错。

我也考虑学学Python了,为了看懂它。
0 请登录后投票
   发表时间:2011-05-13  
jjcoder 写道
----
多想LS的RMB能像代码一样可以ctrl+c,然后不断ctrl+v,那该多好啊、、、
----



多好啊
0 请登录后投票
   发表时间:2011-05-13  
非常喜欢这篇文章,感谢楼主。
0 请登录后投票
   发表时间:2011-05-13  
lz不要激动,我还没接触过Python,而且学习一种语言真的很麻烦,正如我对学习英语真的不感兴趣一样。但是看了lz这篇,我觉得每种语言都有其独特的美,我将倾向于发现我所学语言的没,感谢lz的文,感谢lz的启发。。。
0 请登录后投票
   发表时间:2011-05-16  
有没有中文纠错的?
0 请登录后投票
   发表时间:2011-05-16  
引用
这里面有个让我很囧的大笑话,希望你能发现


是Peter回复里'Habe a good summer, happy programming' 那个 'Habe'吗?


0 请登录后投票
   发表时间:2011-05-16  
virtualsolo 写道
引用
这里面有个让我很囧的大笑话,希望你能发现


是Peter回复里'Habe a good summer, happy programming' 那个 'Habe'吗?



不是,是我把T-shirt拼成T-s-h-i-t了,what a s-h-i-t spelling error.
0 请登录后投票
   发表时间:2011-05-17   最后修改:2011-05-17
不错哦,我把 lz 代码翻译成了 Ruby 版(1.9.2),细节逻辑稍微修改了下,但结果是一样的:

NWORDS = File.read('big.txt').scan(/\w+/).inject({}) do |dict, word|
  word.downcase!
  dict[word] = dict[word].to_i + 1
  dict
end

def edits words
  words.flat_map do |word|
    (word.size + 1).times.flat_map do |i|
      delete    = word.dup.tap{|w| w[i] = '' } if word[i]
      transpose = word.dup.tap{|w| w[i], w[i+1] = w[i+1], w[i] } if word[i+1]
      replaces  = ('a'..'z').map{|c| word.dup.tap{|w| w[i] = c } } if word[i]
      inserts   = ('a'..'z').map{|c| word.dup.tap{|w| w.insert i, c } }
      [delete, transpose, *replaces, *inserts].compact.uniq
    end
  end
end

def correct word
  e0 = [word]
  e1 = edits e0
  e2 = edits e1
  # 是否用 set 是没有区别的, 创建 set 要多做一些 hash 计算,  干脆不整了。
  # 是否去除 NWORDS 中不存在的词也没有区别 ⋯⋯
  # 是否在最后加上 word 也没区别,如果 e1, e2 都是不明单词,最后结果依然是 word
  [*e0, *e1, *e2].max_by {|w| NWORDS[w].to_i }
end

0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics