我是靠谱客的博主 傲娇台灯,最近开发中收集的这篇文章主要介绍庖丁解牛分词器增加对日文,韩文分词的支持,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

项目中发现采用庖丁解牛分词器对含有日文的文字都被过滤掉,所以发了一封邮件给qieqie前辈。

qieqie前辈的回复:

在paoding中,中文、日文、韩文成为CJK,使用的是CJKKnife来切词;

CJKKnife依赖词典来工作,对于一点文字而言,可分为两种情况,
1、能找到何词典匹配的词,这时paoding应该会切出该词汇(当然也可能不会切出,具体问题具体分析)
2、不能从词典找到匹配的词,paoding会采用二分法来切,也就是“ABC” 这个cjk词将被切为“AB”、"BC"2个词;
而我所看到的被过滤掉的日文是paoding所不要的。
 
调试了一下代码:
在运行到KnifeBox类中下面的方法中,
/**
  * 分解以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
(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的值是相等的所以直接
return LIMIT=-1返回从而日文的文字被过滤掉了。
 
qieqie前辈叫我修改一下方法public static boolean isCjkUnifiedIdeographs(char ch) {
  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 片假名音标扩充
        上面我说过我不懂日文和韩文,并且对于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 片假名音标扩充
修改之后的方法如下:
/**
  *
  * @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   

最后

以上就是傲娇台灯为你收集整理的庖丁解牛分词器增加对日文,韩文分词的支持的全部内容,希望文章能够帮你解决庖丁解牛分词器增加对日文,韩文分词的支持所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部