设为首页收藏本站

Scripts 学盟

 找回密码
 加入学盟

QQ登录

只需一步,快速开始

查看: 1564|回复: 9
打印 上一主题 下一主题

记一次向 Linux 移植的悲催意外 [复制链接]

管理员

超级大菜鸟

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
问题的抛出

最近学习研究那个 ictclas4j 分词。学习研究,学习研究哈。。程序的运行测试一直正常,ictclas 分词效果也比较不错

当项目转移到 linux 上继续学习研究的时候

   恐怖了

分词完全失灵!!!



任何语句,都被拆分为一个个的单字,比如:"我们都是好孩子" 被拆分为 "我", "们", "都", "是", "好", "孩", "子"

这哪是分词,分明是分字。

1

查看全部评分

分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
分享分享0 收藏收藏0

管理员

超级大菜鸟

Rank: 9Rank: 9Rank: 9

2#
混混@普宁.中国 实名认证  发表于 2011-9-29 00:45:59 |只看该作者
第一反应


字符编码问题, 于是乎 搜索代码代码中所有类似于 stringObject.getBytes()  及 new String(bytes)   的代码。

一律显式指定 charset

改为   stringObject.getBytes("GBK")  和 new String(bytes, "GBK")

马上测试。。。。


OH  YEAH!  效果满意




事情还远远没有结束。。。。。。。。。。。。。。。。。。。。。。。

为了排除万一,继续和 win 上的程序进行 对比测试

我的妈呀。。。。


分词结果不一致。。。。。

使用道具 举报

管理员

超级大菜鸟

Rank: 9Rank: 9Rank: 9

3#
混混@普宁.中国 实名认证  发表于 2011-9-29 00:55:01 |只看该作者
还有什么问题呢?



冥思苦想下,记起,涉及到 字符集问题的都是 io 操作。。。

又一个于是乎,搜索一下,代码中的 InputStreamRead 和 InputStreamWriter

找到一处

new InputStreamReader( inputStreamObject )

修改为

new InputStreamReader( inputStreamObject,  "GBK" );




这下还不被我找着。 哼哼




仍然,win/linux  对比测试



为嘛结果还不一致

使用道具 举报

管理员

超级大菜鸟

Rank: 9Rank: 9Rank: 9

4#
混混@普宁.中国 实名认证  发表于 2011-9-29 01:09:57 |只看该作者
茫然鸟。。。

难道代码转到 linux 上会发生变化。。。。 这不太可能吧

但苦于无计可施,只好把 linux 上代码传回来,和原来 win 机器上代码进行文件比对。

包括词库,二进制比较,结构内容。。。。。完全一致


但怎就运行结果不一样呢。。。



难道有随机因素在里头。。。。不对啊,如果单独在 win , 或者单独在 linux ,无论运行多少次,结果都是统一的
仍然是苦于无计可施。虽然自己觉得滑稽,但还是搜索一下代码 "Math.random", "Random" 等字眼,无果.....

使用道具 举报

管理员

超级大菜鸟

Rank: 9Rank: 9Rank: 9

5#
混混@普宁.中国 实名认证  发表于 2011-9-29 01:28:14 |只看该作者
意志力几乎磨灭,差点要放弃纠缠此问题
又是无计,又是不耐烦鸟,怀疑起 sun jre 来,哦,是 oracle jre ,  肯定这鸟毛东东无法保证 java 程序在不同平台运行时的一致性

唉,就算是 jre 的问题,咱们也应该在程序里做兼容处理。。。。还是再纠缠纠缠吧

再于是乎,只好,不停断点,不停启动运行,不停查看调用堆栈。。。。

那错综复杂的程序流程啊。。。
那什么什么结点计算啊。。。
那什么什么概率计算啊。。。
那什么什么边长计算啊。。。
那什么什么平滑度计算啊。。。
那什么什么路径计算啊。。。
什么什么的。。。

经过什么什么小时后的来回,没有问题。。。



使用道具 举报

管理员

超级大菜鸟

Rank: 9Rank: 9Rank: 9

6#
混混@普宁.中国 实名认证  发表于 2011-9-29 01:38:38 |只看该作者
最后再来一轮。。。其它非核心流程的调试

那是又是不停的断点,不停的运行,不停的查看,不停的写一些测试代码。。。
终于发现了。。。

在linux 跑时,在加载词典的时候,其中的一个词典加载失败



很低级啊。。。。,资源文件名大小写错误!

windows 不敏感
linux 敏感

使用道具 举报

管理员

超级大菜鸟

Rank: 9Rank: 9Rank: 9

7#
混混@普宁.中国 实名认证  发表于 2011-9-29 02:07:10 |只看该作者
总结


1. 当我们的程序中涉及字符和byte序列,转换时

为提高可移植性,请显式指定 charset, 如 stringObj.getBytes("GBK"), new String(bytes, "GBK")....


2. 当程序不能以预期效果运行时,应该适时 throw 出 exception,至少要有所提示或者日志
原来的分词代码中,当词典加载错误时,程序中并没有抛出异常,也没有任何提示. 而是往后跳过此词典的使用。
像这种看起来 “高容错”的程序, 实际中却带来不小的麻烦。 像此次事件,平台一更换,词典加载错误,因为问题没有被抛出,不正常分词结果只会让人莫名其妙

使用道具 举报

Rank: 8Rank: 8

8#
momo 发表于 2011-9-30 15:14:10 |只看该作者
看咱有才群主的文章就是精彩
过了爱做梦的年纪
轰轰烈烈不如平静

使用道具 举报

Rank: 8Rank: 8

9#
那个谁 发表于 2011-10-11 07:43:05 |只看该作者
写的精彩。。。语文谁教的啊。。。

使用道具 举报

管理员

超级大菜鸟

Rank: 9Rank: 9Rank: 9

10#
混混@普宁.中国 实名认证  发表于 2011-10-11 21:01:26 |只看该作者
那个谁 发表于 2011-10-11 07:43
写的精彩。。。语文谁教的啊。。。

学盟培养出来的混混

使用道具 举报

您需要登录后才可以回帖 登录 | 加入学盟

手机版|Scripts 学盟   |

GMT+8, 2024-5-10 00:40 , Processed in 1.062804 second(s), 12 queries .

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部