SpellChecker Java Search API

 

July 9, 2007 on 9:20 pm | InJava|July9,2007on9:20pm|InJava|

在寫程式時,基本上都一定要為錯誤的輸入作檢查或修正。在写程式时,基本上都一定要为错误的输入作检查或修正。 這是基本可以用來檢查一個程式有沒有偷懶/偷工減料的最簡單方法。这是基本可以用来检查一个程式有没有偷懒/偷工减料的最简单方法。

在上電腦的基本課時,應該一定會提到有關 GIGO(garbagein,garbageout; 垃圾輸入, 無用輸出)。在上电脑的基本课时,应该一定会提到有关GIGO(garbagein,garbageout;垃圾输入,无用输出)。 就是說電腦很苯,當輸入的數據是垃圾,輸出就一定只會是垃圾。就是说电脑很苯,当输入的数据是垃圾,输出就一定只会是垃圾。 電腦會出錯,可是人類更易出錯,而且犯的錯誤更多。电脑会出错,可是人类更易出错,而且犯的错误更多。

最基本的,是能在輸入時即時先作出反應和指出錯誤。最基本的,是能在输入时即时先作出反应和指出错误。 最簡單是檢查數據的型態和空白(第一類),而一個比較像樣的程式都有數字、時間、日期、大小和特定格式 (如 email 或 UUID) 的 Pattern 檢查(第二類)。最简单是检查数据的型态和空白(第一类),而一个比较像样的程式都有数字、时间、日期、大小和特定格式(如email或UUID)的Pattern检查(第二类)。 造得仔細一點的程式都有會進一步的檢查,就是數據有效性的檢查;例如年月日的組合是否合理,沒有沒串錯字,重復性,在 database 能不能找到相對應的 ID 之類的(第三類)。造得仔细一点的程式都有会进一步的检查,就是数据有效性的检查;例如年月日的组合是否合理,没有没串错字,重复性,在database能不能找到相对应的ID之类的(第三类)。 而最好的則會著重與人的互動關係,清楚的錯誤說明,能在使用者保持集中力的時間內反應(好像大約三秒),自動的修正、建議(第四類)。而最好的则会着重与人的互动关系,清楚的错误说明,能在使用者保持集中力的时间内反应(好象大约三秒),自动的修正、建议(第四类)。

實例实例

第一類:Yahoo 字典第一类:Yahoo字典
雖然它說 “請輸入單字查詢,中英文皆可” ,可是日文,法文,德文也能過。虽然它说“请输入单字查询,中英文皆可”,可是日文,法文,德文也能过。 假如輸入簡体字或日文漢字它也不會了解。假如输入简体字或日文汉字它也不会了解。

第二類: 一般的網頁上常見的 “E-mail this page” 表格(我一直很好奇誰會用)。第二类:一般的网页上常见的“E-mailthispage”表格(我一直很好奇谁会用)。 例如這頁的 footer。例如这页的footer。
它會要求你依一定的格式輸入 email,可是在都不會知道這個 email 是否正確的。它会要求你依一定的格式输入email,可是在都不会知道这个email是否正确的。

第三類: 現時 forum 的 Signup form。第三类:现时forum的Signupform。
它會以寄出 validation code 的方式檢查你輸入的 email。它会以寄出validationcode的方式检查你输入的email。

第四類: Google Suggest / Gmail第四类:GoogleSuggest/Gmail
能在在未按下 sutmit 前給建議,修正,甚至 auto-complete。能在在未按下sutmit前给建议,修正,甚至auto-complete。

以上例子都是 web-application 的原因只是誰也看得到。以上例子都是web-application的原因只是谁也看得到。 事實上 client application 的例子更多。事实上clientapplication的例子更多。
如: Notepad vs UltraEdit vs Microsoft Word vs Eclipse IDE.如:NotepadvsUltraEditvsMicrosoftWordvsEclipseIDE.

好像越說越遠了。好像越说越远了。 回到正題,其中最麻煩,最難實作的是自動化的修正建議。回到正题,其中最麻烦,最难实作的是自动化的修正建议。 因為它的目的不做到 GIGO,這不是和上文所說的電腦很苯相反嗎?因为它的目的不做到GIGO,这不是和上文所说的电脑很苯相反吗? 沒有矛盾,它是建基在數據當中正確的部份。没有矛盾,它是建基在数据当中正确的部份。

再回到主題,英文串字修正是以沒串錯的部份基礎。再回到主题,英文串字修正是以没串错的部份基础。 (從語言角度上著手也可以,不過這是人類善長的工作,不在本文內容)(从语言角度上着手也可以,不过这是人类善长的工作,不在本文内容)
英文是由字母組合而成,而它們的組合次序和方式,則可以提示出正確的建議。英文是由字母组合而成,而它们的组合次序和方式,则可以提示出正确的建议。

用實例來說或會比較易明白: 例如 Monstor (Monster 的誤寫)。用实例来说或会比较易明白:例如Monstor(Monster的误写)。 以 n-Gram 方式拆解的話,就可以得到 mon, ons, nst, sto, tor。以n-Gram方式拆解的话,就可以得到mon,ons,nst,sto,tor。 如果和 Monster 比較(mon, mon, nst, ste, ter),其中 3/5 * 3/5 都是對的(因為是互相比較, 所以是兩組)。如果和Monster比较(mon,mon,nst,ste,ter),其中3/5*3/5都是对的(因为是互相比较,所以是两组)。 而如果和 “monsters inc” 比較,則只有 3/5 * 3/8。而如果和“monstersinc”比较,则只有3/5*3/8。 而拿來和 apple 比較,則完全不付合。而拿来和apple比较,则完全不付合。 只要事先為字並建立 index,用這方法可以快速得到幾個相近的詞語。只要事先为字并建立index,用这方法可以快速得到几个相近的词语。

一般,英文只要有 3-gram 和 4-gram 就可以有不錯的結果。一般,英文只要有3-gram和4-gram就可以有不错的结果。 當然啦,這等零件老早就有寫了出來。当然啦,这等零件老早就有写了出来。 如果你是用 Lucene 1.4 的話,花一點心思也可以自己寫出來,而如果用 Lucene 2.0,則已經有現成的 library 可用。如果你是用Lucene1.4的话,花一点心思也可以自己写出来,而如果用Lucene2.0,则已经有现成的library可用。

參考:  SpellChecker - Lucene-java Wiki参考:SpellChecker-Lucene-javaWiki
參考:  Lucene 2.0org.apache.lucene.search.spell参考:Lucene2.0org.apache.lucene.search.spell

就算不用 Lucene,自已利用 php+mysql 也可以寫得到類似的功能,只要依著以上的方式建立 index table 和設計出一句 inner join SQL 就可以。就算不用Lucene,自已利用php+mysql也可以写得到类似的功能,只要依着以上的方式建立indextable和设计出一句innerjoinSQL就可以。

9 July 20079July2007
DennisDennis

相关帖子:
  • No Related Posts
  • micas Aug 8th 2007 11:16 am SEO No Comments yet Trackback URI Comments RSS

    Leave a Reply

    You must be logged in to post a comment.