对于中文分词的简单思考
2007/08/17 00:01 | by edwardproAdmin ]
受了那么大的教训怎么也应该好好总结下了,下面随便说说吧。
1 词库问题
词库在分词中会非常重要,而且量比较大,这是一个很大的效率瓶颈,我个人觉得在这里应该做到如下的:
a) 多级分词 比如 字母+单字的两级索引这样效率稍高
b) 排除重复和陷阱,重复不多解释了,陷阱,我认为就是那种包含词,包含词的坏处很可能造成正确失效
c) 过长的词组的强制拦截,长词是毫无意义的,比如中华人民共和国,我认为这不是一个好词条,应该是中华 人民 共和国 这几个才对,如果用户的词库中包含过长的就应该强制处理
2 检错要求
JE分词的两大问题:1对于特殊字符有比较大的问题,这个问题一开始还没有发现,但在大规模抓取之后就非常严重了 2 错误的分词。
我个人觉得,分词一旦有错误完全应该选择单字法,这对于查询是有意义的,其实这类似与cjk的二分法看似愚蠢,但仔细看看其实却拥有不错的效果(效果是第一位的)
3 多样的接口
主要针对分词 文件 db 等等多种方式导入这是必须的。
接下来几天内抓紧实现下看看,不过在这里要好好地鄙视下JE分词的,虽然我是偷懒了,但这个分词的能力实在。。。不多说了,好多事情要做。
今天人丢大了
2007/08/16 23:54 | by edwardproAdmin ]
列出几点需求:
1 支持词库,这是由于我们的应用特殊性决定的,大部分都不是自然语言如果没有词库分词将形同虚设
2 高性能
3 抗错误能力,在分词无法得到结果的条件下还原成单字,这点对于查询时最关键,宁愿在分词无法完全匹配的时候用单字也不要用错误的组合得到错误的结果。我个人觉得应该有两种分词模式,一种是激进模式也就是类似JE的模式,另外一种是safe模式,用于query中。
有什么就show自己
2007/08/13 01:32 | by edwardproAdmin ]
小徐同学推荐的一部电影《阳光小美女》下载很久了没有看过,今天终于可以看了,真好。
故事蛮简单的,为了实现小女儿的梦想参加一个show的节目,于是全家出动为了实现她的梦想,一路上发生了很多故事。细节可能有遗漏原因是没有中文字幕,只能随便听听,英文还是不合格><
最后小女孩olive参加了比赛了,但她却跳起了脱衣舞,这令节目主办方大怒,加上一系列的闹剧,不过最后一家人还是在喜庆中回家了,小女孩当然不会得到奖项,但她通过这次经历已经得到了她要的东西,就是这样,很多时候生命中只要去做了就好了,干嘛不去尝试呢?我很喜欢这样寓意,记住,有什么都可以秀,秀什么都可以的。
看士兵突击有感
2007/08/12 21:19 | by edwardproAdmin ]
先说说好的:
1 励志:国产电视剧很少有如此的励志之作,这部电视剧以一名不合格士兵的成长为契机,片中的三多非常刻苦,虽然不善于表达,但是他的“行为艺术”确实令人敬佩,用它的努力从养老兵到主力团士兵,再到特种部队士兵,中间的精神值得学习,我总结为:执着 执着 再执着;坚持 坚持 再坚持。
2 情谊:故事的前半段基本穿插着,我军的现状——减员,其中送走两名班长退伍是非常感人的,士兵的情感如此的简单,班长退伍了,他抱着箱子不让班长走。虽然所在连队被解散了,但每次吃饭的歌声依然不输给别人的一个整编连,这就是情谊和精神,也是我们这些和谐青年所真正缺少的。
3 视觉:应该说这不算一部粗制滥造的战争画面的电视剧,片中借鉴了很多外国电视剧的特效,比如闪光弹的弧线 士兵装备等都是现役部队装备,显然导演和编剧都是仔细学习过的值得表扬。
再说一点点意见吧:
故事的结局比较平淡,整个故事在最后缺乏高潮,甚至感觉是因为某种原因而嘎然而止的感觉,有点虎头蛇尾的感觉。

但总体这确实是一部很赞的电视剧,绝对是和 激情燃烧的岁月 亮剑等电视剧具有相同水准的电视剧。
lunece 用的高亮类
2007/08/10 18:12 | by edwardproAdmin ]
网上有很多高亮的类,但我觉得太负责了(也许他们觉得这样性能更高),我写了一个很简单采用je分词+正则解决高亮问题,实际使用下来还是不错的:
- import java.util.Iterator;
- import java.util.List;
- /**
- * @author edwardpro
- *
- */
- public class HighlightProcess {
- /**
- *
- */
- private String str;
- private String key;
- private static final String HIGH_LIGHT = ";
- public HighlightProcess(String str, String key) {
- // TODO Auto-generated constructor stub
- this.str = str;
- this.key = key;
- }
- /**
- * @return the str
- */
- public String getStr() {
- return str;
- }
- /**
- * @param str
- * the str to set
- */
- public void setStr(String str) {
- this.str = str;
- }
- public String getResult() {
- List list = WordsManager.splitStrToList(key);
- for (Iterator it = list.iterator(); it.hasNext();) {
- String target = (String) it.next();
- this.str = RegxTools.regxReplace(this.str, target, HIGH_LIGHT);
- }
- return this.str;
- }
- }
分词这边使用了一个工厂方法,用来装载词库的,返回的是JE分词对象:
java 代码- import java.io.File;
- import java.io.FileNotFoundException;
- import java.io.FileReader;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.Iterator;
- import java.util.List;
- import java.util.StringTokenizer;
- import jeasy.analysis.MMAnalyzer;
- import org.apache.log4j.Logger;
- public class WordsManager {
- private static final Logger logger = Logger.getLogger(WordsManager.class);
- private static MMAnalyzer mmanalyzer;
- private static final String DEF_SPT = "<>";
- static {
- init();
- }
- private static void init() {
- reload();
- mmanalyzer = new MMAnalyzer();
- }
- public static void reload() {
- if (AppInit.getScb().getExtDic() != null
- && !AppInit.getScb().getExtDic().equalsIgnoreCase("")) {
- File dir = new File(AppInit.getScb().getExtDic());
- File[] dics = dir.listFiles();
- // add dict file
- for (int i = 0; i < dics.length; i++) {
- try {
- MMAnalyzer.addDictionary(new FileReader(dics[i]));
- } catch (FileNotFoundException e) {
- // TODO Auto-generated catch block
- logger.error("Read File Error", e);
- }
- }
- }
- }
- /**
- * @return the mmanalyzer
- */
- public static MMAnalyzer getMmanalyzer() {
- return mmanalyzer;
- }
- /**
- * @param mmanalyzer
- * the mmanalyzer to set
- */
- public static void setMmanalyzer(MMAnalyzer mmanalyzer) {
- WordsManager.mmanalyzer = mmanalyzer;
- }
- public static String[] splitStrToArray(String source) {
- try {
- String target = mmanalyzer.segment(source, DEF_SPT);
- String[] ts = target.split(DEF_SPT);
- return ts;
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return null;
- }
- public static List splitStrToList(String source) {
- List ret = new ArrayList();
- try {
- String target = mmanalyzer.segment(source, DEF_SPT);
- StringTokenizer st = new StringTokenizer(target, DEF_SPT);
- for (; st.hasMoreTokens();) {
- ret.add(st.nextToken());
- }
- } catch (IOException e) {
- // TODO Auto-generated catch block
- logger.error("segment error", e);
- }
- return ret;
- }
- public static void removeTag(String content) {
- MMAnalyzer.removeWord(content);
- }
- }
正则方法:
java 代码java 代码- String reg="$1";
- public static String regxReplace(String str, String key, String rep) {
- Pattern p = Pattern.compile("(" + key + ")", Pattern.CASE_INSENSITIVE);
- Matcher m = p.matcher(str);
- return m.replaceAll(rep);
- }
原理很简单,利用分词分开,然后用这则一个个匹配掉目标中的关键字,由于实际中大部分都是替换标题和200字的描述所以并没有使用流方法,下次有时间改用流或者stringbuffer或者其他更接近分词的方法来做下看看,有什么问题,欢迎大家拍砖
- public HighlightProcess(String str, String key) {
- // TODO Auto-generated constructor stub
- this.str = str;
- this.key = key;
- }
- /**
- * @return the str
- */
- public String getStr() {
- return str;
- }
- /**
- * @param str
- * the str to set
- */
- public void setStr(String str) {
- this.str = str;
- }
- public String getResult() {
- List list = WordsManager.splitStrToList(key);
- for (Iterator it = list.iterator(); it.hasNext();) {
- String target = (String) it.next();
- this.str = RegxTools.regxReplace(this.str, target, HIGH_LIGHT);
- }
- return this.str;
- }
- }
分词这边使用了一个工厂方法,用来装载词库的,返回的是JE分词对象:
- import java.io.File;
- import java.io.FileNotFoundException;
- import java.io.FileReader;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.Iterator;
- import java.util.List;
- import java.util.StringTokenizer;
- import jeasy.analysis.MMAnalyzer;
- import org.apache.log4j.Logger;
- public class WordsManager {
- private static final Logger logger = Logger.getLogger(WordsManager.class);
- private static MMAnalyzer mmanalyzer;
- private static final String DEF_SPT = "<>";
- static {
- init();
- }
- private static void init() {
- reload();
- mmanalyzer = new MMAnalyzer();
- }
- public static void reload() {
- if (AppInit.getScb().getExtDic() != null
- && !AppInit.getScb().getExtDic().equalsIgnoreCase("")) {
- File dir = new File(AppInit.getScb().getExtDic());
- File[] dics = dir.listFiles();
- // add dict file
- for (int i = 0; i < dics.length; i++) {
- try {
- MMAnalyzer.addDictionary(new FileReader(dics[i]));
- } catch (FileNotFoundException e) {
- // TODO Auto-generated catch block
- logger.error("Read File Error", e);
- }
- }
- }
- }
- /**
- * @return the mmanalyzer
- */
- public static MMAnalyzer getMmanalyzer() {
- return mmanalyzer;
- }
- /**
- * @param mmanalyzer
- * the mmanalyzer to set
- */
- public static void setMmanalyzer(MMAnalyzer mmanalyzer) {
- WordsManager.mmanalyzer = mmanalyzer;
- }
- public static String[] splitStrToArray(String source) {
- try {
- String target = mmanalyzer.segment(source, DEF_SPT);
- String[] ts = target.split(DEF_SPT);
- return ts;
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return null;
- }
- public static List splitStrToList(String source) {
- List ret = new ArrayList();
- try {
- String target = mmanalyzer.segment(source, DEF_SPT);
- StringTokenizer st = new StringTokenizer(target, DEF_SPT);
- for (; st.hasMoreTokens();) {
- ret.add(st.nextToken());
- }
- } catch (IOException e) {
- // TODO Auto-generated catch block
- logger.error("segment error", e);
- }
- return ret;
- }
- public static void removeTag(String content) {
- MMAnalyzer.removeWord(content);
- }
- }
正则方法:
- String reg="$1";
- public static String regxReplace(String str, String key, String rep) {
- Pattern p = Pattern.compile("(" + key + ")", Pattern.CASE_INSENSITIVE);
- Matcher m = p.matcher(str);
- return m.replaceAll(rep);
- }
原理很简单,利用分词分开,然后用这则一个个匹配掉目标中的关键字,由于实际中大部分都是替换标题和200字的描述所以并没有使用流方法,下次有时间改用流或者stringbuffer或者其他更接近分词的方法来做下看看,有什么问题,欢迎大家拍砖
从手机没带想到的
2007/08/10 09:42 | by edwardproAdmin ]
思路很简单: 通过客户端设置手机的呼叫转移,将来电转接到客户端并通过电脑可以对话,安全性方面也可以考虑双向控制,即客户端开通转移后,可以用手机关闭呼叫转移,并在24小时内不能再在手机不确认状态下获得呼叫转移功能。
三网合一状态下实现这种状态并不难,一点小小的想象吧,上班啦^^
死亡日记
2007/08/10 00:32 | by edwardproAdmin ]
这两天正在看《一升的眼泪》之前看了本《追逐日光》,这两本书都是死亡笔记,都是得了绝症的人写下的生命最后的历程,在我看来这些书都很值得感动,也许木藤亚也也是一个普通的小女生,书中很多小女生的小花絮。
如果跌倒了,不是还可以看到蓝天吗?
这句话我以前也曾说过,只是觉得这样的话语真的很激励人,坦率地说这几天过得不好,被老大大k一顿之后,心情郁闷,想起来似乎每次换工作我都会遇到信任危机,我倒是已经习惯了,做得好些就是了,说实话最近,不,应该是最近半年确实懒散,大概是之前的公司练嘴更多的缘故吧,看来我及时走了正道,恭喜自己下,虽然不再年青,但我依然要做自己喜欢的兴趣的事情,即使顶着再大的压力也是。及时技术经理告诉我放弃研究新技术吧,进度要紧,业务部门是不会在乎你的实现是否先进的,他们只关心你是否实现只是一个结果,既然又你更熟悉的方法干啥不用呢?我依然故我,虽然他们都很担心我的前途,不过对自己还是很有信心的,缺医少药,那些东西还是都弄通了就是这样,之后慢慢提高吧,做自己的风格,这是我对自己的基本要求,呵呵。
其实很多人会忌讳死亡笔记这样的东西,觉得晦气,我们技术经理就有个个人迷信,他的数据库命名不出现 3 和4这些现象的于是我们会看到1 2 5 6 7 8 9 这样序列,呵呵,也许每个人都有自己的习惯。可是那些书真的很激励人,你可以想想,如果你得到了医生的裁决书你会怎么过?花天酒地享受一番,还是整天成论,最后不等死亡来领已经自杀了,所以看着这样的书真的很鼓励自己,所以面对压力我相信自己能处理好,好在大部分都差不多
使用form dom要注意的小问题
2007/08/09 00:43 | by edwardproAdmin ]
几天调一个js遇到灵异问题:
var s=$('sform');
s.action="bb.html";
<form action="a.html" id='sform'>
<input type="hidden" name="action" />
...
</form>
js目标很简单,改变form上的action的值,结果却。。。alert出来 s.action 居然是一个对象,反复想,终于发现问题就出在from里的action组件,formObj.action居然被form里的同名组件覆盖了,修改后问题解决。
webflow 还是不错的
2007/08/03 12:55 | by edwardproAdmin ]
不是我鄙视gcd人,是gcd人自己干出来的
2007/08/02 16:25 | by edwardproAdmin ]
身体还是没完全恢复
2007/08/01 11:26 | by edwardproAdmin ]
,每天吃饭都要考马丁林了。
蝴蝶般的女孩——初中的同桌
2007/07/29 18:54 | by edwardproAdmin ]
笛是班上的尖子生,我是班上最令班主任讨厌的孩子,因为我爱哭爱闹,做事不按常理,经常做一些奇怪的事情,所以班主任为了治理我安排了一个“恶女”给我,以此对我“看管教育”,但此女却因为看管方式比较简单粗暴而简单粗暴又不是我的弱项,因此常常因此影响上课质量,老师在痛定思痛后把这个看管我的任务交给了笛——她严重的好学生严厉的女生之一,不过后来想起来老师也许错了^^。
继续说吧,记得我们坐在一起的第二天就因为我俩的体积差距过大,造成了一次事故——事故是这样的:那个时候我们上课都要起立叫老师好(分上午和下午),但她的身高不高,为了写字方便她把间距调小了,结果我不知深浅,把课桌给掀翻了,而这次事故的受害者是她的新铅笔盒(我们那个时候铅笔盒可是很代表身份的东西),用她的话,那个铅笔盒坏得太恶心了。自然班主任根据她的经验判断我的一次有组织有计划有预谋的行动,但为了维护她最得意的助手的权威,于是她这次给我下了非常重的惩罚,在我的小本本上写了很多很多(我们那个时候每个学生都有个老师和家长的通讯本本,要求家长每天看老师的评语和留言并签名),于是我回家自然收到了爸爸的重罚>.<。回到学校她知道了,其实她自己明白这只不过是一次意外而已,但我却被如此重罚,她最后大发慈悲决定让给我打8折价格赔了铅笔盒,对于那个时候的我,家里是没有零花钱的,我所有的收入都要从早饭里挤出来,而我唯一的爱好就是军事杂志,我拿出了一个月的杂志预算出来,这对于我来说也是巨款了。
这之后我们和平相处了,其实她很可爱也不是别人眼中那么凶悍的女生,至少在我面前不凶悍而是可爱,她的家里条件要比我好多了,那个时候就有很多好看的衣服,夏天她特别喜欢一条超短牛仔短裤,老师觉得很不好,还在全班面前暗指我偷看,让我很没有面子,但其实我真的没有,冤枉就不说了,不过她还是很喜欢穿那条裤子还有一条可爱的小裙子,其实很喜欢她的衣服打扮,朴素但美丽,没有华丽感但有一种气质(当然这些只是现在结合当年的记忆的评价,当时可没有想出那么多道理来)
不过说起来她还是有点凶悍,她有个坏习惯:就是喜欢扭人,只要我一有什么不满意,比如手超过线了,凳子坐多了之类的就会上手扭,心情好了,或者在其他同学的掺乎下也会行凶(我惨吧)而我呢,人胖胖的肉又多,所以每次都会留下一个乌青,让我的手臂很难见人尤其夏天连背心都不能穿。
由于我们两个成绩差不多,虽然考试要调换位子的,但我们总是能被分配在一起,这是其他同桌没有的,不过这也导致了后来的作弊事件和我害她多错了,以及我因此多赚一道的祸害,但那些都很美的故事。
也学80年的同学都知道,小时候有送贺卡的风俗,收到多说明地位高,我每年收到的只有3张,她的 鲍的 小月同学的,我很开心,因为还有人送啦,对于我这样一个班主任眼中的坏孩子,是不容易的。
中学毕业的时候我们两个人考的都不算理想都只发挥了自己的60%的水平,最后一次见面在学校是沉默的,因为大家心情都不好,前途渺茫啊。我连她的联系方式都没有要。
第二年我依然收到了她的贺卡,她叫我猪,让我减肥,不要多吃了。我却什么感觉都没有笑了笑,其实我心里很开心,但我却没有表达出来没有回卡,也没有给她电话,表达谢意
那年的暑假我们在一个同学家又见面了,这次见面出奇的平淡,我们几乎没有说话,她只说了一句,你砸又难看了。。。
最后一次见面我清楚记得,是在化学高中会考结束的那天,我坐90路到五角场,当时我已经搬家到了现在地方,所以会经过她家的,而恰好和她在同一辆车上,我们相互打了招呼,然后说88,这次我依然没有问她要电话号码,
再之后一次同学聚会,有人曾yy问我,怎么没有叫她呀?我知道她说的是谁,她也明白我听懂了什么,但我们都就此作罢了,我故作镇定,回家却发疯地在网上搜罗信息,但我失败了,什么都没有,终于我和蝴蝶同学说再见了,你现在哪里我都不知道,有人说她出国了,有人说她在哪里哪里,但事实肯定是我们不会相见,即使见面你还能认出那个我吗?当年可爱的小胖猪已经不再了。
突然写了好多好多,只是源于自己突然记忆起来一些东西,有些长,有些罗嗦,但很真实,如果非要说是恋爱那我现在承认吧,只是当时我真的不懂,但恰恰美就美在我的不懂上,这个故事的结局很完美。还记得情书中最后女主角的尴尬一笑吗?是的,所以我没有任何遗憾,这就是我16岁那年的故事,现在想起来好美呀,好纯洁呀,单纯的翅膀和两个有意思的小孩子,一只会追逐这一只小蝴蝶乱舞的小猪,成为美丽的回忆。就像老狼的岁月老歌一样,我一定会唱起那个同桌,小蝴蝶同学。
你问我没有心思找回来她,我想我没有,毕竟那是活在10年前的她不是现在的找回来有什么意思么?虽然我在校友录上找到了她的高中,但我想我不会去联系她的,毫无价值,何必把梦又拉回现实呢?如果真的能见到只能说明和当年分座位考试都能分一起那么有缘了,当年多少同桌羡慕我们呀,这都是只是过去的故事了,那个年代那个我,还是让她睡在记忆里,去慢慢品味只要不掉电还能记得就好了,我不贪婪的。
病中随想
2007/07/27 11:11 | by edwardproAdmin ]
又发烧了
2007/07/27 05:22 | by edwardproAdmin ]





