项目中发现采用庖丁解牛分词器对含有日文的文字都被过滤掉,所以发了一封邮件给qieqie前辈。
qieqie前辈的回复:
在paoding中,中文、日文、韩文成为CJK,使用的是CJKKnife来切词;
CJKKnife依赖词典来工作,对于一点文字而言,可分为两种情况,
1、能找到何词典匹配的词,这时paoding应该会切出该词汇(当然也可能不会切出,具体问题具体分析)
2、不能从词典找到匹配的词,paoding会采用二分法来切,也就是“ABC” 这个cjk词将被切为“AB”、"BC"2个词;
而我所看到的被过滤掉的日文是paoding所不要的。
调试了一下代码:
在运行到KnifeBox类中下面的方法中,
/**
* 分解以CJK字符开始的,后可带阿拉伯数字、英文字母、横线、下划线的字符组成的
/**
* 分解以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 |