项目中发现采用庖丁解牛分词器对含有日文的文字都被过滤掉,所以发了一封邮件给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   

庖丁解牛分词器增加对日文,韩文分词的支持相关推荐

  1. ElasticSearch:为中文分词器增加对英文的支持(让中文分词器可以处理中英文混合文档)(转)

    本文地址,需转载请注明出处: http://blog.csdn.net/hereiskxm/article/details/47441911 当我们使用中文分词器的时候,其实也希望它能够支持对于英文的 ...

  2. ElasticSearch:为中文分词器增加对英文的支持(让中文分词器可以处理中英文混合文档)

    本文地址,需转载请注明出处: http://blog.csdn.net/hereiskxm/article/details/47441911 当我们使用中文分词器的时候,其实也希望它能够支持对于英文的 ...

  3. python判断字符串是否含有非中文字符的日文/韩文字符

    需求描述 爬取推特内容,需要留下只有中文/英文的内容,日文/韩文不要. 实现思路 用正则表达式. 本来想能不能单独匹配中文或者英文,但是好多符号不想弄了- 就直接搜了匹配日文/韩文的正则表达式. 备注 ...

  4. 0.54与0.55版本react-native的TextInput在iOS上无法输入中文日文韩文的bug

    更新最新版本的react-native,发现最近两版本的TextInput终于出现对ios的不友好.在官网查了下发现 0.54与0.55版本react-native的TextInput在iOS上无法输 ...

  5. 【Lucene】分词器详解,常用的分词器,IKANalyzer

    [Lucene]分词器详解,常用的分词器,IKANalyzer 1. 分词器详解 1.1 分词器的作用 1.2 分词器API 1.2.1 示例 1.2.2 Analyzer 1.2.3 createC ...

  6. 微软最新Windows 10官方正式版ISO镜像v1809原版下载大全(中文/英文/日文/韩文)...

    微软在北京时间2018年10月3日(美国时间2018/10/2)向全球推送了Windows 10十月更新2018 v1809(Build 17663.1)版,蚩尤向本站提供了微软的所有MSDN版本,大 ...

  7. [导入]Replace函数vbTextCompare不支持日文韩文

    如果对有日文或韩文的字符串 Replace 时使用 vbTextCompare 参数就会出错. 文章来源:http://Jorkin.Reallydo.Com/default.asp?id=488 转 ...

  8. 匹配中文汉字日文韩文等多国语言的正则表达式(转)

    转自:http://www.javadn.com/read.php?tid-692.html 2E80-33FFh:中日韩符号区.收容康熙字典部首.中日韩辅助部首.注音符号.日本假名.韩文音符,中日韩 ...

  9. C#判断中文 日文 韩文

    中文:/[\u4e00-\u9fa5]/ 日文:/[\u0800-\u4e00]/ 韩文:/[\uac00-\ud7ff]/ C# 正则表达式应用实例  如果要匹配 所有东亚语言 @"[\u ...

最新文章

  1. MAT之SA:利用SA算法解决TSP(数据是14个虚拟城市的横纵坐标)问题
  2. 用mapXtreme Java开发web gis应用 (上)
  3. 英特尔物联网产业的布局中,优势和劣势都在哪?
  4. 【CSU - 1980 】不堪重负的树(树上区间dp)
  5. C++ IO 流简介
  6. linux 路由跟踪命令_云计算网络知识学习-linux网络基础
  7. python——operator详解
  8. springboot集成ueditor百度富文本编辑器及上传图片到oss服务器
  9. 自带RGB灯效,配备显卡专属风道,风行者DF700 Flux上手
  10. 365天英语口语学习_11,收拾餐桌碗碟
  11. C++ PDF文档相关操作
  12. [北航软工教学] 教学计划大纲
  13. Matlab quiver函数用法 - 画矢量箭头图
  14. brpc源码解析(二)—— brpc收到请求的处理过程
  15. Android微信支付订单支付失败的问题
  16. python开心消消乐辅助_用Python写个开心消消乐小游戏
  17. 基于AI智能视频分析技术的电力行业视频监控联网解决方案
  18. STM32F103入门 | 3.MDK5.27 安装教程
  19. Kaggle泰坦尼克号之灾
  20. 学习 | 针对学生及刚从业建筑人员对常用三款建筑建模软件的用户体验调研和竞品分析

热门文章

  1. 高并发下的分布式缓存浅析
  2. 尚硅谷4.0数仓项目整体设计要点记录
  3. 22-10-14 西安 spring循环依赖、对象内存布局、synchronized锁升级
  4. Angular login页面的简单模板及过程
  5. MySQL数据库---设置全文索引 查询中文汉字
  6. Python Cookbook3 (7)函数
  7. java连锁o2o_全渠道java b2b b2c o2o平台
  8. border-collapse:collapse 的使用
  9. DPCM压缩系统的实现与分析
  10. paper—HAWK: Rapid Android Malware Detection Through Heterogeneous Graph Attention Networks