中英文拼寫檢測糾正開源專案使用入門 word-checker 1.1.0

2023-04-04 21:00:59

專案簡介

word-checker 本專案用於單詞拼寫檢查。支援英文單詞拼寫檢測,和中文拼寫檢測。

特性說明

  • 可以迅速判斷當前單詞是否拼寫錯誤

  • 可以返回最佳匹配結果

  • 可以返回糾正匹配列表,支援指定返回列表的大小

  • 錯誤提示支援 i18n

  • 支援大小寫、全形半形格式化處理

  • 支援自定義詞庫

  • 內建 27W+ 的英文詞庫

  • 支援指定英文的編輯距離

  • 支援基本的中文拼寫檢測

變更紀錄檔

變更紀錄檔

快速開始

JDK 版本

Jdk 1.7+

maven 引入

<dependency>
     <groupId>com.github.houbb</groupId>
     <artifactId>word-checker</artifactId>
    <version>1.1.0</version>
</dependency>

測試案例

會根據輸入,自動返回最佳糾正結果。

final String speling = "speling";
Assert.assertEquals("spelling", WordCheckerHelper.correct(speling));

核心 api 介紹

核心 api 在 WordCheckerHelper 工具類下。

WordCheckers 工具類提供了長文字中英文混合的自動糾正功能,當然也支援單個單詞。

功能 方法 引數 返回值 備註
文字拼寫是否正確 isCorrect(string) 待檢測的文字 boolean 全部正確,才會返回 true
返回最佳糾正結果 correct(string) 待檢測的單詞 String 如果沒有找到可以糾正的文字,則返回其本身
判斷文字拼寫是否正確 correctMap(string) 待檢測的單詞 Map<String, List<String>> 返回所有匹配的糾正列表 MAP
判斷文字拼寫是否正確 correctMap(string, int limit) 待檢測的文字, 返回列表的大小 返回指定大小的的糾正列表 MAP 列表大小 <= limit
判斷文字拼寫是否正確 correctList(string) 待檢測的單詞 List<String> 返回所有匹配的糾正列表
判斷文字拼寫是否正確 correctList(string, int limit) 待檢測的文字, 返回列表的大小 返回指定大小的的糾正列表 列表大小 <= limit

英文測試例子

參見 EnWordCheckerTest.java

是否拼寫正確

final String hello = "hello";
final String speling = "speling";
Assert.assertTrue(WordCheckerHelper.isCorrect(hello));
Assert.assertFalse(WordCheckerHelper.isCorrect(speling));

返回最佳匹配結果

final String hello = "hello";
final String speling = "speling";
Assert.assertEquals("hello", WordCheckerHelper.correct(hello));
Assert.assertEquals("spelling", WordCheckerHelper.correct(speling));

預設糾正匹配列表

final String word = "goox";
List<String> stringList = WordCheckerHelper.correctList(word);
Assert.assertEquals("[good, goo, goon, goof, gook, goop, goos, gox, goog, gool, goor]", stringList.toString());

指定糾正匹配列表大小

final String word = "goox";
final int limit = 2;
List<String> stringList = WordCheckerHelper.correctList(word, limit);
Assert.assertEquals("[good, goo]", stringList.toString());

中文拼寫糾正

是否拼寫正確

final String right = "正確";
final String error = "萬變不離其中";

Assert.assertTrue(WordCheckerHelper.isCorrect(right));
Assert.assertFalse(WordCheckerHelper.isCorrect(error));

返回最佳匹配結果

final String right = "正確";
final String error = "萬變不離其中";

Assert.assertEquals("正確", WordCheckerHelper.correct(right));
Assert.assertEquals("萬變不離其宗", WordCheckerHelper.correct(error));

預設糾正匹配列表

final String word = "萬變不離其中";

List<String> stringList = WordCheckerHelper.correctList(word);
Assert.assertEquals("[萬變不離其宗]", stringList.toString());

指定糾正匹配列表大小

final String word = "萬變不離其中";
final int limit = 1;

List<String> stringList = WordCheckerHelper.correctList(word, limit);
Assert.assertEquals("[萬變不離其宗]", stringList.toString());

長文字中英文混合

情景

實際拼寫糾正的話,最佳的使用體驗是使用者輸入一個長文字,並且可能是中英文混合的。

然後實現上述對應的功能。

拼寫是否正確

final String hello = "hello 你好";
final String speling = "speling 你好 以毒功毒";
Assert.assertTrue(WordCheckers.isCorrect(hello));
Assert.assertFalse(WordCheckers.isCorrect(speling));

返回最佳糾正結果

final String hello = "hello 你好";
final String speling = "speling 你好以毒功毒";
Assert.assertEquals("hello 你好", WordCheckers.correct(hello));
Assert.assertEquals("spelling 你好以毒攻毒", WordCheckers.correct(speling));

判斷文字拼寫是否正確

每一個詞,對應的糾正結果。

final String hello = "hello 你好";
final String speling = "speling 你好以毒功毒";
Assert.assertEquals("{hello=[hello],  =[ ], 你=[你], 好=[好]}", WordCheckers.correctMap(hello).toString());
Assert.assertEquals("{ =[ ], speling=[spelling, spewing, sperling, seeling, spieling, spiling, speeling, speiling, spelding], 你=[你], 好=[好], 以毒功毒=[以毒攻毒]}", WordCheckers.correctMap(speling).toString());

判斷文字拼寫是否正確

同上,指定最多返回的個數。

final String hello = "hello 你好";
final String speling = "speling 你好以毒功毒";

Assert.assertEquals("{hello=[hello],  =[ ], 你=[你], 好=[好]}", WordCheckers.correctMap(hello, 2).toString());
Assert.assertEquals("{ =[ ], speling=[spelling, spewing], 你=[你], 好=[好], 以毒功毒=[以毒攻毒]}", WordCheckers.correctMap(speling, 2).toString());

格式化處理

有時候使用者的輸入是各式各樣的,本工具支援對於格式化的處理。

大小寫

大寫會被統一格式化為小寫。

final String word = "stRing";

Assert.assertTrue(WordCheckerHelper.isCorrect(word));

全形半形

全形會被統一格式化為半形。

final String word = "string";

Assert.assertTrue(WordCheckerHelper.isCorrect(word));

自定義英文詞庫

檔案設定

你可以在專案資源目錄建立檔案 resources/data/define_word_checker_en.txt

內容如下:

my-long-long-define-word,2
my-long-long-define-word-two

不同的詞獨立一行。

每一行第一列代表單詞,第二列代表出現的次數,二者用逗號 , 隔開。

次數越大,在糾正的時候返回優先順序就越高,預設值為 1。

使用者自定義的詞庫優先順序高於系統內建詞庫。

測試程式碼

我們在指定了對應的單詞之後,拼寫檢測的時候就會生效。

final String word = "my-long-long-define-word";
final String word2 = "my-long-long-define-word-two";

Assert.assertTrue(WordCheckerHelper.isCorrect(word));
Assert.assertTrue(WordCheckerHelper.isCorrect(word2));

自定義中文詞庫

檔案設定

你可以在專案資源目錄建立檔案 resources/data/define_word_checker_zh.txt

內容如下:

默守成規 墨守成規

使用英文空格分隔,前面是錯誤,後面是正確。

後期 Road-Map

  • 支援中文分詞拼寫檢測

  • 引入中文糾錯演演算法,同音字和形近字處理。

  • 支援中英文混合拼寫檢測

技術鳴謝

Words 提供的原始英語單詞資料。

開源地址

https://github.com/houbb/word-checker/ 歡迎大家 fork+star ~~~