概述
项目中发现采用庖丁解牛分词器对含有日文的文字都被过滤掉,所以发了一封邮件给qieqie前辈。
qieqie前辈的回复:
在paoding中,中文、日文、韩文成为CJK,使用的是CJKKnife来切词;
CJKKnife依赖词典来工作,对于一点文字而言,可分为两种情况,
1、能找到何词典匹配的词,这时paoding应该会切出该词汇(当然也可能不会切出,具体问题具体分析)
2、不能从词典找到匹配的词,paoding会采用二分法来切,也就是“ABC” 这个cjk词将被切为“AB”、"BC"2个词;
而我所看到的被过滤掉的日文是paoding所不要的。
调试了一下代码:
在运行到KnifeBox类中下面的方法中,
/**
* 分解以CJK字符开始的,后可带阿拉伯数字、英文字母、横线、下划线的字符组成的
其中IKAnayzer中的Character.UnicodeBlock与Unicode编码对应如下:
/**
* 分解以CJK字符开始的,后可带阿拉伯数字、英文字母、横线、下划线的字符组成的
语句
*/
public int assignable(Beef beef, int offset, int index) {
char ch = beef.charAt(index);
if (CharSet.isCjkUnifiedIdeographs(ch))
return ASSIGNED;
if (index > offset) {
if (CharSet.isArabianNumber(ch) || CharSet.isLantingLetter
*/
public int assignable(Beef beef, int offset, int index) {
char ch = beef.charAt(index);
if (CharSet.isCjkUnifiedIdeographs(ch))
return ASSIGNED;
if (index > offset) {
if (CharSet.isArabianNumber(ch) || CharSet.isLantingLetter
(ch)
|| ch == '-' || ch == '_') {
return POINT;
}
}
return LIMIT;
}
在用CJKKnife刀时执行该if (CharSet.isCjkUnifiedIdeographs(ch))语句进入到
CharSet类中的
public static boolean isCjkUnifiedIdeographs(char ch) {
return ch >= 0x4E00 && ch < 0xA000;
}
因为0x4E00 -0xA000只属于CJK中日韩统一汉字范围,如:3040-309F:日文平假名 (Hiragana) 30A0-30FF:日文片假名 (Katakana) 不在此范围内所以返回的值为false,此时程序中index和offset的值是相等的所以直接
|| ch == '-' || ch == '_') {
return POINT;
}
}
return LIMIT;
}
在用CJKKnife刀时执行该if (CharSet.isCjkUnifiedIdeographs(ch))语句进入到
CharSet类中的
public static boolean isCjkUnifiedIdeographs(char ch) {
return ch >= 0x4E00 && ch < 0xA000;
}
因为0x4E00 -0xA000只属于CJK中日韩统一汉字范围,如:3040-309F:日文平假名 (Hiragana) 30A0-30FF:日文片假名 (Katakana) 不在此范围内所以返回的值为false,此时程序中index和offset的值是相等的所以直接
return LIMIT=-1返回从而日文的文字被过滤掉了。
qieqie前辈叫我修改一下方法public static boolean isCjkUnifiedIdeographs(char ch) {
return ch >= 0x4E00 && ch < 0xA000;
}来满足我的项目需求。
return ch >= 0x4E00 && ch < 0xA000;
}来满足我的项目需求。
但是我不懂日文也不懂韩文,可网上看到IKAnayzer在支持Lucene3.0版本的分词器中也添加了对日、韩文分词的支持。其中其主要代码为:
analyzer/help/CharacterHelper.java
public static boolean isCJKCharacter(char input){ | |||
29 | - | return Character.UnicodeBlock.of(input) | |
30 | - | == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS; | |
31 | - | } | |
29 | + | Character.UnicodeBlock ub = Character.UnicodeBlock.of(input); | |
30 | + | if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS | |
31 | + | || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS | |
32 | + | || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A | |
33 | + | || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION | |
34 | + | || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION | |
35 | + | || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS | |
36 | + | //韩文字符集 | |
37 | + | || ub == Character.UnicodeBlock.HANGUL_SYLLABLES | |
38 | + | || ub == Character.UnicodeBlock.HANGUL_JAMO | |
39 | + | || ub == Character.UnicodeBlock.HANGUL_COMPATIBILITY_JAMO | |
40 | + | //日文字符集 | |
41 | + | || ub == Character.UnicodeBlock.HIRAGANA //平假名 | |
42 | + | || ub == Character.UnicodeBlock.KATAKANA //片假名 | |
43 | + | || ub == Character.UnicodeBlock.KATAKANA_PHONETIC_EXTENSIONS | |
44 | + | ) { | |
45 | + | return true; | |
46 | + | }else{ | |
47 | + | return false; | |
48 | + | } | |
49 | + | } |
其中IKAnayzer中的Character.UnicodeBlock与Unicode编码对应如下:
if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS // 【4E00-9FFF】 CJK Unified Ideographs 中日韩统一表意文字
|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS // 【3300-33FF】 CJK Compatibility 中日韩兼容字符 x
|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A // 【3400-4DBF】 CJK Unified Ideographs Extension A 中日韩统一表意文字扩充A
|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION // 【3000-303F】 CJK 符号和标点 x
|| ub == Character.UnicodeBlock.GENERAL_PUNCTUATION // 【2000-206F】 General Punctuation 一般标点符号 x
|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS // 【FF00-FFEF】 Halfwidth and Fullwidth Forms 半角及全角字符 x
//韩文字符集
|| ub == Character.UnicodeBlock.HANGUL_SYLLABLES // 【AC00-D7AF】 Hangul Syllables 谚文音节
|| ub == Character.UnicodeBlock.HANGUL_JAMO // 【1100-11FF】 Hangul Jamo 谚文字母
|| ub == Character.UnicodeBlock.HANGUL_COMPATIBILITY_JAMO // 【3130-318F】 Hangul Compatibility Jamo 谚文兼容字母
//日文字符集
|| ub == Character.UnicodeBlock.HIRAGANA //平假名 // 【3040-309F】Hiragana 平假名
|| ub == Character.UnicodeBlock.KATAKANA //片假名 // 【30A0-30FF】Katakana 片假名
|| ub == Character.UnicodeBlock.KATAKANA_PHONETIC_EXTENSIONS // 【31F0-31FF】Katakana Phonetic Extensions 片假名音标扩充
|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS // 【3300-33FF】 CJK Compatibility 中日韩兼容字符 x
|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A // 【3400-4DBF】 CJK Unified Ideographs Extension A 中日韩统一表意文字扩充A
|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION // 【3000-303F】 CJK 符号和标点 x
|| ub == Character.UnicodeBlock.GENERAL_PUNCTUATION // 【2000-206F】 General Punctuation 一般标点符号 x
|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS // 【FF00-FFEF】 Halfwidth and Fullwidth Forms 半角及全角字符 x
//韩文字符集
|| ub == Character.UnicodeBlock.HANGUL_SYLLABLES // 【AC00-D7AF】 Hangul Syllables 谚文音节
|| ub == Character.UnicodeBlock.HANGUL_JAMO // 【1100-11FF】 Hangul Jamo 谚文字母
|| ub == Character.UnicodeBlock.HANGUL_COMPATIBILITY_JAMO // 【3130-318F】 Hangul Compatibility Jamo 谚文兼容字母
//日文字符集
|| ub == Character.UnicodeBlock.HIRAGANA //平假名 // 【3040-309F】Hiragana 平假名
|| ub == Character.UnicodeBlock.KATAKANA //片假名 // 【30A0-30FF】Katakana 片假名
|| ub == Character.UnicodeBlock.KATAKANA_PHONETIC_EXTENSIONS // 【31F0-31FF】Katakana Phonetic Extensions 片假名音标扩充
上面我说过我不懂日文和韩文,并且对于IKAnayzer的实现原理也不是太了解,其对符号字符在分词过程中是如何处理,所以对于上面“
x”就暂时未加进来。最后准备添加到paoding里方法的unicode编码范围如下:
ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS // 【4E00-9FFF】 CJK Unified Ideographs 中日韩统一表意文字
|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A // 【3400-4DBF】 CJK Unified Ideographs Extension A 中日韩统一表意文字扩充A
//韩文字符集
|| ub == Character.UnicodeBlock.HANGUL_SYLLABLES // 【AC00-D7AF】 Hangul Syllables 朝鲜文音节
|| ub == Character.UnicodeBlock.HANGUL_JAMO // 【1100-11FF】 Hangul Jamo 朝鲜文
|| ub == Character.UnicodeBlock.HANGUL_COMPATIBILITY_JAMO // 【3130-318F】 Hangul Compatibility Jamo 朝鲜文兼容字母
//日文字符集
|| ub == Character.UnicodeBlock.HIRAGANA //平假名 // 【3040-309F】Hiragana 平假名
|| ub == Character.UnicodeBlock.KATAKANA //片假名 // 【30A0-30FF】Katakana 片假名
|| ub == Character.UnicodeBlock.KATAKANA_PHONETIC_EXTENSIONS // 【31F0-31FF】Katakana Phonetic Extensions 片假名音标扩充
//韩文字符集
|| ub == Character.UnicodeBlock.HANGUL_SYLLABLES // 【AC00-D7AF】 Hangul Syllables 朝鲜文音节
|| ub == Character.UnicodeBlock.HANGUL_JAMO // 【1100-11FF】 Hangul Jamo 朝鲜文
|| ub == Character.UnicodeBlock.HANGUL_COMPATIBILITY_JAMO // 【3130-318F】 Hangul Compatibility Jamo 朝鲜文兼容字母
//日文字符集
|| ub == Character.UnicodeBlock.HIRAGANA //平假名 // 【3040-309F】Hiragana 平假名
|| ub == Character.UnicodeBlock.KATAKANA //片假名 // 【30A0-30FF】Katakana 片假名
|| ub == Character.UnicodeBlock.KATAKANA_PHONETIC_EXTENSIONS // 【31F0-31FF】Katakana Phonetic Extensions 片假名音标扩充
修改之后的方法如下:
/**
*
* @param ch
* @return
* 修改原因:增加对日文,韩文分词的支持
* 修改人:stt shenting_ting@163.com
* 修改日期:2010-05-19
*/
public static boolean isCjkUnifiedIdeographs(char ch) {
//return ch >= 0x4E00 && ch < 0xA000;
return (ch >= 0x4E00 && ch < 0xA000) //中日韩统一表意文字
||(ch >= 0x3400 && ch < 0x4DBF) //中日韩统一表意文字扩充A
//日文字符集
||(ch >= 0x3040 && ch < 0x309F) //日文平假名
||(ch >= 0x30A0 && ch < 0x30FF) //日文片假名
||(ch >= 0x31F0 && ch < 0x31FF) //片假名音标扩充
//韩文字符集
||(ch >= 0xAC00 && ch < 0xD7AF) //朝鲜文音节
||(ch >= 0x1100 && ch < 0x11FF) //朝鲜文
||(ch >= 0x3130 && ch < 0x318F); //朝鲜文兼容字母
}
*
* @param ch
* @return
* 修改原因:增加对日文,韩文分词的支持
* 修改人:stt shenting_ting@163.com
* 修改日期:2010-05-19
*/
public static boolean isCjkUnifiedIdeographs(char ch) {
//return ch >= 0x4E00 && ch < 0xA000;
return (ch >= 0x4E00 && ch < 0xA000) //中日韩统一表意文字
||(ch >= 0x3400 && ch < 0x4DBF) //中日韩统一表意文字扩充A
//日文字符集
||(ch >= 0x3040 && ch < 0x309F) //日文平假名
||(ch >= 0x30A0 && ch < 0x30FF) //日文片假名
||(ch >= 0x31F0 && ch < 0x31FF) //片假名音标扩充
//韩文字符集
||(ch >= 0xAC00 && ch < 0xD7AF) //朝鲜文音节
||(ch >= 0x1100 && ch < 0x11FF) //朝鲜文
||(ch >= 0x3130 && ch < 0x318F); //朝鲜文兼容字母
}
通过测试可以看到并没有对日文进行过滤,而是采用二分法进行分词处理。但是对于韩文System输出就全变成了“
?”,从系统界面输入保存之后也全是这个符号,网上说采用UTF-8编码,同事也这么说,但是还未解决这个问题。
Unicode编码参考链接网页:
Unicode编码表:
http://witmax.cn/unicode-list.html
Unicode编码的字符查询: http://www.nengcha.com/code/unicode/class/
Character.UnicodeBlock类: http://www.jingningedu.com/manage/java_api/java/lang/Character.UnicodeBlock.html
Unicode编码的字符查询: http://www.nengcha.com/code/unicode/class/
Character.UnicodeBlock类: http://www.jingningedu.com/manage/java_api/java/lang/Character.UnicodeBlock.html
最后
以上就是傲娇台灯为你收集整理的庖丁解牛分词器增加对日文,韩文分词的支持的全部内容,希望文章能够帮你解决庖丁解牛分词器增加对日文,韩文分词的支持所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复