ME-126 / ictclas4j

Automatically exported from code.google.com/p/ictclas4j
0 stars 0 forks source link

UTF-8编码造成分词不正确的问题 #10

Open GoogleCodeExporter opened 9 years ago

GoogleCodeExporter commented 9 years ago
 我用0.9.1版本在eclipse下试了一下,用的UTF-8编码源代码,但分词结果不正确:
输入:浙江皕盛塑胶有限公司
输出:浙/vg 江/vg 皕/vg 盛/g 塑/g 胶/g 有/g 限/g 公/g 司/v 
这个真是太奇怪了,源程序根本就没动,新建了一个test文件�
��掉用分词
SegTag st = new SegTag(2);
SegResult sr = st.split(“浙江皕盛塑胶有限公司”);
System.out.println("rawResult:"+rawResult);
这个test源文件的编码是UTF-8.

可是我如果把test文件改成GB18030的编码输出就是正确的了:浙
江/ns 皕/a 盛/a 塑
胶/n 有限公司/n 

这个是个bug么?大家知道怎么解决这个问题么?开始以为是��
�码的问题,试了好多方
法都不行,sinboy也好久没来了,不知道能不能看到,有知道��
�朋友帮忙解答一下,
感激不禁~~~

Original issue reported on code.google.com by zz.zha...@gmail.com on 1 Sep 2009 at 7:05

GoogleCodeExporter commented 9 years ago
自己看了一下源代码,发现问题的原因是在Utility.CC_ID方法里�
��,这个里面有个getBytes的方
法,直接用的系统默认的编码,改成getBytes("GB18030")后问题解�
��,还发现Utility里面很多
getBytes都是用的系统默认的编码,在处理中文字符时都会有问
题吧,特别是不同系统下面

Original comment by zz.zha...@gmail.com on 2 Sep 2009 at 7:56

GoogleCodeExporter commented 9 years ago
希望作者能改成UTF-8

Original comment by yaoxing...@gmail.com on 22 Sep 2009 at 4:32

GoogleCodeExporter commented 9 years ago
好像弄成UTF8很麻烦的样子啊,他里边很多都是用了getBytes()方
法,编码都是写死的。。。

Original comment by DingCon...@gmail.com on 26 Sep 2009 at 3:21

GoogleCodeExporter commented 9 years ago
折腾了一阵,发现原因主要是Utility.java里面的多个判断/查找�
��符的方法使用的是GB2312编码
方式计算的(getBytes()返回2个字节),因此当你在UTF8环境下输入
字符串, 这些所有方法的返回
都是失效的(最明显的例子就是返回的分词全部是一个字一��
�词)

解决办法:
1. 首先将所有文件转换成UTF8 (linux 下用iconv)
2. 查找org.ictclas4j.utility.Utility.java 这个文件, 
把所有的xxx.getBytes() 方法改成
   xxx.getBytes("GBK") 或者 xxx.getBytes("GB18030"). 然后再用try catch 语句包围起来

(eclipse会提示需要检查UnsupportedEncodingException)
然后就ok了

需要注意的是, org.ictclas4j.utility.GFString.java里面有类似
byte[] uniBytes = str.getBytes("utf-16be");
这种语句,不要改

Original comment by Newway....@gmail.com on 10 Feb 2010 at 6:20

GoogleCodeExporter commented 9 years ago
参照 Comment 4 by Newway.Liu, 的方法 我是这样修改的
1.文件编码不用转换
2.在Utility.java 新增一个编码常量 和一个编码方法
    public static final String ENCODING="GB2312";
 public static byte[] getBytes(String str){
       try {
        return  str.getBytes(Utility.ENCODING);
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return new byte[0];
    }
3.替换代码理所有的 src.getBytes() 为 Utility.getBytes(src);

Original comment by zgd2...@163.com on 25 Aug 2010 at 3:32

GoogleCodeExporter commented 9 years ago
1.在netbeans使用时,需要将src目录中的内容拷贝到新建工程的s
rc目录中。
2加入必要的库;
3右击项目名称,选择“属性”窗口,在打开的窗口中,选择�
��下面的“编码”,将其改为“GBK”;
4在org.ictclas4j.segment.SegTag.java中的main方法中,把BufferedReader 
reader= new BufferedReader(new 
InputStreamReader(System.in));这句话改为:BufferedReader reader= new 
BufferedReader(new InputStreamReader(System.in,"GBK"));
5运行程序,可输入中文进行处理

Original comment by hgs0...@gmail.com on 31 Dec 2010 at 2:10