Opencc4j 支持中文繁簡體轉換,考慮到詞組級別。
-
嚴格區分「一簡對多繁」和「一簡對多異」。
-
完全兼容異體字,可以實現動態替換。
-
嚴格審校一簡對多繁詞條,原則為「能分則不合」。
-
詞庫和函數庫完全分離,可以自由修改、導入、擴展。
-
兼容 Windows、Linux、Mac 平台。
-
支持自定義分詞
-
支持判斷單個字(詞)是否為簡體/繁體
-
支持返回字符串中簡體/繁體的列表信息
見 test 文件夾。
可以用來學習相關方法的使用方式。
- OpenCC
OpenCC 的思想非常優秀,做的也特別棒。但是沒有特別為 java 提供的工具。
- jopencc
jopencc 沒有提供分詞功能。
<dependency>
<groupId>com.github.houbb</groupId>
<artifactId>opencc4j</artifactId>
<version>1.6.1</version>
</dependency>
工具類方法參見 ZhConverterUtil 工具類。
核心方法如下:
序號 | api 方法 | 簡介 |
---|---|---|
1 | toSimple(String) | 轉為簡體 |
2 | toTraditional(String) | 轉為繁體 |
3 | simpleList(String) | 返回簡體列表 |
4 | traditionalList(String) | 返回繁體列表 |
5 | isSimple(String) | 是否為簡體 |
6 | isTraditional(String) | 是否為繁體 |
以上所有方法都有一個 Segment 參數,可以用於自定義中文分詞策略。
String original = "生命不息,奮鬥不止";
String result = ZhConverterUtil.toSimple(original);
Assert.assertEquals("生命不息,奋斗不止", result);
String original = "生命不息,奋斗不止";
String result = ZhConverterUtil.toTraditional(original);
Assert.assertEquals("生命不息,奮鬥不止", result);
對單個字符或者詞組進行繁簡體判斷。
final String simpleChar = "奋";
final String simplePhrase = "奋斗";
final String traditionalChar = "奮";
final String traditionalPhrase = "奮鬥";
Assert.assertTrue(ZhConverterUtil.isSimple(simpleChar));
Assert.assertTrue(ZhConverterUtil.isSimple(simplePhrase));
Assert.assertFalse(ZhConverterUtil.isSimple(traditionalChar));
Assert.assertFalse(ZhConverterUtil.isSimple(traditionalPhrase));
final String simpleChar = "奋";
final String simplePhrase = "奋斗";
final String traditionalChar = "奮";
final String traditionalPhrase = "奮鬥";
Assert.assertTrue(ZhConverterUtil.isTraditional(traditionalChar));
Assert.assertTrue(ZhConverterUtil.isTraditional(traditionalPhrase));
Assert.assertFalse(ZhConverterUtil.isTraditional(simpleChar));
Assert.assertFalse(ZhConverterUtil.isTraditional(simplePhrase));
返回字符串中繁簡體對應的詞、字列表,默認支持中文分詞。
繁簡體列表返回的詞組和分詞策略緊密相關。
final String original = "生命不息奋斗不止";
final List<String> resultList = ZhConverterUtil.simpleList(original);
Assert.assertEquals("[生, 命, 不, 息, 奋斗, 不, 止]", resultList.toString());
final String original = "生命不息奮鬥不止";
final List<String> resultList = ZhConverterUtil.traditionalList(original);
Assert.assertEquals("[奮, 鬥]", resultList.toString());
你可以通過 Segments
工具類獲取系統內置的分詞實現。
序號 | 方法 | 準確性 | 性能 | 備註 |
---|---|---|---|---|
1 | defaults() | 高 | 高 | 默認分詞形式,暫時為 fastForward 策略 |
2 | fastForward() | 較高 | 高 | fast-forward 分詞策略 |
3 | chars() | 低 | 高 | 將字符串轉換為單個字符列表,一般不建議使用 |
4 | huaBan() | 高 | 一般 | 花瓣的結巴分詞策略 |
花瓣結巴分詞在使用時,需要自行引入結巴分詞依賴。
<dependency>
<groupId>com.huaban</groupId>
<artifactId>jieba-analysis</artifactId>
<version>1.0.2</version>
</dependency>
你有時候可能除了上述的兩種分詞方式,會有更加適合自己業務的分詞實現。
Opencc4j 支持自定義分詞實現,只需要實現分詞接口 Segment
- 接口內容
public interface Segment {
/**
* 分詞
* @param original 原始信息
* @return 分詞後的列表
*/
List<String> seg(final String original);
}
/**
* 一個最簡單的分詞實現。
* 注意:僅僅做演示,不可實際使用。
*/
public class FooSegment implements Segment {
@Override
public List<String> seg(String original) {
return Arrays.asList(original, "测试");
}
}
我們自定義的分詞,直接在默認添加“測試”這樣的信息。
final String original = "寥落古行宫,宫花寂寞红。白头宫女在,闲坐说玄宗。";
final Segment segment = new FooSegment();
final String result = ZhConverterUtil.toTraditional(original, segment);
Assert.assertEquals("寥落古行宮,宮花寂寞紅。白頭宮女在,閒坐說玄宗。測試", result);
OpenCC 提供的原始數據信息。
jieba-analysis 提供中文分詞
需求和 BUG 在這裡,歡迎提供寶貴的建議。
如果對您有幫助,歡迎 Star 鼓勵作者。