Skip to content

Commit

Permalink
fix word connect with '-' split error huaban#3 by yaochitc
Browse files Browse the repository at this point in the history
  • Loading branch information
piaolingxue committed Mar 26, 2014
1 parent a7ec29a commit e6487e1
Show file tree
Hide file tree
Showing 3 changed files with 145 additions and 118 deletions.
4 changes: 3 additions & 1 deletion conf/user.dict
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,6 @@
显瘦 3
又拍云 3
iphone 3
鲜芋仙 3
鲜芋仙 3
UTF-8 3 nz
utf-8 3 nz
62 changes: 40 additions & 22 deletions src/main/java/com/huaban/analysis/jieba/CharacterUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,54 +2,72 @@

import java.util.regex.Pattern;


public class CharacterUtil {
public static Pattern reSkip = Pattern.compile("(\\d+\\.\\d+|[a-zA-Z0-9]+)");
private static final char[] connectors = new char[] {'+', '#', '&', '.', '_'};

private static final char[] connectors = new char[] { '+', '#', '&', '.', '_', '-' };


public static boolean isChineseLetter(char ch) {
if (ch >= 0x4E00 && ch <= 0x9FA5) return true;
if (ch >= 0x4E00 && ch <= 0x9FA5)
return true;
return false;
}

}


public static boolean isEnglishLetter(char ch) {
if ((ch >= 0x0041 && ch <= 0x005A) || (ch >= 0x0061 && ch <= 0x007A))
return true;
return false;
}



public static boolean isDigit(char ch) {
if (ch >= 0x0030 && ch <= 0x0039) return true;
if (ch >= 0x0030 && ch <= 0x0039)
return true;
return false;
}



public static boolean isConnector(char ch) {
for (char connector : connectors)
if (ch == connector) return true;
if (ch == connector)
return true;
return false;
}



public static boolean ccFind(char ch) {
if(isChineseLetter(ch)) return true;
if(isEnglishLetter(ch)) return true;
if(isDigit(ch)) return true;
if(isConnector(ch)) return true;
if (isChineseLetter(ch))
return true;
if (isEnglishLetter(ch))
return true;
if (isDigit(ch))
return true;
if (isConnector(ch))
return true;
return false;
}


/**
* 全角 to 半角,大写 to 小写
* @param input 输入字符
*
* @param input
* 输入字符
* @return 转换后的字符
*/
public static char regularize(char input){
public static char regularize(char input) {
if (input == 12288) {
return 32;
}else if (input > 65280 && input < 65375) {
}
else if (input > 65280 && input < 65375) {
return (char) (input - 65248);
}else if (input >= 'A' && input <= 'Z') {
return (input += 32);
}
}
else if (input >= 'A' && input <= 'Z') {
return (input += 32);
}
return input;
}
}

}
197 changes: 102 additions & 95 deletions src/test/java/com/huaban/analysis/jieba/JiebaSegmenterTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

import com.huaban.analysis.jieba.JiebaSegmenter.SegMode;


/**
* @author matrix
*
Expand All @@ -20,105 +21,108 @@ public class JiebaSegmenterTest extends TestCase {
private JiebaSegmenter segmenter = new JiebaSegmenter();
String[] sentences =
new String[] {
"找小姐",
"找美女",
"找小妹",
"学生妹",
"职业狐狸精",
"男公关",
"上门",
"抽獎",
"好声音",
"好聲音",
"夢之声",
"夢之聲",
"訂票",
"改簽",
"熱线",
"熱線",
"热線",
"電话",
"電話",
"醫院",
"代刷",
"撲剋牌",
"137-1234-1234",
"这是一个伸手不见五指的黑夜。我叫孙悟空,我爱北京,我爱Python和C++。",
"我不喜欢日本和服。",
"雷猴回归人间。",
"工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作",
"我需要廉租房",
"永和服装饰品有限公司",
"我爱北京天安门",
"abc",
"隐马尔可夫",
"雷猴是个好网站",
"“,”和“SOFTware(软件)”两部分组成",
"草泥马和欺实马是今年的流行词汇",
"伊藤洋华堂总府店",
"中国科学院计算技术研究所",
"罗密欧与朱丽叶",
"我购买了道具和服装",
"PS: 我觉得开源有一个好处,就是能够敦促自己不断改进,避免敞帚自珍",
"湖北省石首市",
"湖北省十堰市",
"总经理完成了这件事情",
"电脑修好了",
"做好了这件事情就一了百了了",
"人们审美的观点是不同的",
"我们买了一个美的空调",
"线程初始化时我们要注意",
"一个分子是由好多原子组织成的",
"祝你马到功成",
"他掉进了无底洞里",
"中国的首都是北京",
"孙君意",
"外交部发言人马朝旭",
"领导人会议和第四届东亚峰会",
"在过去的这五年",
"还需要很长的路要走",
"60周年首都阅兵",
"你好人们审美的观点是不同的",
"买水果然后来世博园",
"买水果然后去世博园",
"但是后来我才知道你是对的",
"存在即合理",
"的的的的的在的的的的就以和和和",
"I love你,不以为耻,反以为rong",
"因",
"",
"hello你好人们审美的观点是不同的",
"很好但主要是基于网页形式",
"hello你好人们审美的观点是不同的",
"为什么我不能拥有想要的生活",
"后来我才",
"此次来中国是为了",
"使用了它就可以解决一些问题",
",使用了它就可以解决一些问题",
"其实使用了它就可以解决一些问题",
"好人使用了它就可以解决一些问题",
"是因为和国家",
"老年搜索还支持",
"干脆就把那部蒙人的闲法给废了拉倒!RT @laoshipukong : 27日,全国人大常委会第三次审议侵权责任法草案,删除了有关医疗损害责任“举证倒置”的规定。在医患纠纷中本已处于弱势地位的消费者由此将陷入万劫不复的境地。 ",
"大", "", "他说的确实在理", "长春市长春节讲话", "结婚的和尚未结婚的", "结合成分子时", "旅游和服务是最好的",
"这件事情的确是我的错", "供大家参考指正", "哈尔滨政府公布塌桥原因", "我在机场入口处", "邢永臣摄影报道",
"BP神经网络如何训练才能在分类时增加区分度?", "南京市长江大桥", "应一些使用者的建议,也为了便于利用NiuTrans用于SMT研究",
"长春市长春药店", "邓颖超生前最喜欢的衣服", "胡锦涛是热爱世界和平的政治局常委",
"程序员祝海林和朱会震是在孙健的左面和右面, 范凯在最右面.再往左是李松洪", "一次性交多少钱", "两块五一套,三块八一斤,四块七一本,五块六一条",
"小和尚留了一个像大和尚一样的和尚头", "我是中华人民共和国公民;我爸爸是共和党党员; 地铁和平门站", "张晓梅去人民医院做了个B超然后去买了件T恤",
"AT&T是一件不错的公司,给你发offer了吗?", "C++和c#是什么关系?11+122=133,是吗?PI=3.14159",
"你认识那个和主席握手的的哥吗?他开一辆黑色的士。", "枪杆子中出政权", "鲜芋仙 3"};
"找小姐",
"找美女",
"找小妹",
"学生妹",
"职业狐狸精",
"男公关",
"上门",
"抽獎",
"好声音",
"好聲音",
"夢之声",
"夢之聲",
"訂票",
"改簽",
"熱线",
"熱線",
"热線",
"電话",
"電話",
"醫院",
"代刷",
"撲剋牌",
"137-1234-1234",
"这是一个伸手不见五指的黑夜。我叫孙悟空,我爱北京,我爱Python和C++。",
"我不喜欢日本和服。",
"雷猴回归人间。",
"工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作",
"我需要廉租房",
"永和服装饰品有限公司",
"我爱北京天安门",
"abc",
"隐马尔可夫",
"雷猴是个好网站",
"“,”和“SOFTware(软件)”两部分组成",
"草泥马和欺实马是今年的流行词汇",
"伊藤洋华堂总府店",
"中国科学院计算技术研究所",
"罗密欧与朱丽叶",
"我购买了道具和服装",
"PS: 我觉得开源有一个好处,就是能够敦促自己不断改进,避免敞帚自珍",
"湖北省石首市",
"湖北省十堰市",
"总经理完成了这件事情",
"电脑修好了",
"做好了这件事情就一了百了了",
"人们审美的观点是不同的",
"我们买了一个美的空调",
"线程初始化时我们要注意",
"一个分子是由好多原子组织成的",
"祝你马到功成",
"他掉进了无底洞里",
"中国的首都是北京",
"孙君意",
"外交部发言人马朝旭",
"领导人会议和第四届东亚峰会",
"在过去的这五年",
"还需要很长的路要走",
"60周年首都阅兵",
"你好人们审美的观点是不同的",
"买水果然后来世博园",
"买水果然后去世博园",
"但是后来我才知道你是对的",
"存在即合理",
"的的的的的在的的的的就以和和和",
"I love你,不以为耻,反以为rong",
"因",
"",
"hello你好人们审美的观点是不同的",
"很好但主要是基于网页形式",
"hello你好人们审美的观点是不同的",
"为什么我不能拥有想要的生活",
"后来我才",
"此次来中国是为了",
"使用了它就可以解决一些问题",
",使用了它就可以解决一些问题",
"其实使用了它就可以解决一些问题",
"好人使用了它就可以解决一些问题",
"是因为和国家",
"老年搜索还支持",
"干脆就把那部蒙人的闲法给废了拉倒!RT @laoshipukong : 27日,全国人大常委会第三次审议侵权责任法草案,删除了有关医疗损害责任“举证倒置”的规定。在医患纠纷中本已处于弱势地位的消费者由此将陷入万劫不复的境地。 ",
"大", "", "他说的确实在理", "长春市长春节讲话", "结婚的和尚未结婚的", "结合成分子时", "旅游和服务是最好的", "这件事情的确是我的错",
"供大家参考指正", "哈尔滨政府公布塌桥原因", "我在机场入口处", "邢永臣摄影报道", "BP神经网络如何训练才能在分类时增加区分度?",
"南京市长江大桥", "应一些使用者的建议,也为了便于利用NiuTrans用于SMT研究", "长春市长春药店", "邓颖超生前最喜欢的衣服",
"胡锦涛是热爱世界和平的政治局常委", "程序员祝海林和朱会震是在孙健的左面和右面, 范凯在最右面.再往左是李松洪", "一次性交多少钱",
"两块五一套,三块八一斤,四块七一本,五块六一条", "小和尚留了一个像大和尚一样的和尚头", "我是中华人民共和国公民;我爸爸是共和党党员; 地铁和平门站",
"张晓梅去人民医院做了个B超然后去买了件T恤", "AT&T是一件不错的公司,给你发offer了吗?",
"C++和c#是什么关系?11+122=133,是吗?PI=3.14159", "你认识那个和主席握手的的哥吗?他开一辆黑色的士。", "枪杆子中出政权",
"鲜芋仙 3" };


@Override
protected void setUp() throws Exception {
WordDictionary.getInstance().init(new File("conf"));
}


@Override
protected void tearDown() throws Exception {
super.tearDown();
}


@Test
public void testCutForSearch() {
for (String sentence : sentences) {
Expand All @@ -127,6 +131,7 @@ public void testCutForSearch() {
}
}


@Test
public void testCutForIndex() {
for (String sentence : sentences) {
Expand All @@ -135,21 +140,24 @@ public void testCutForIndex() {
}
}


@Test
public void testBugSentence() {
String[] bugs =
new String[] {
"iphone5",
"鲜芋仙 3",
"RT @laoshipukong : 27日,",
"AT&T是一件不错的公司,给你发offer了吗?",
"干脆就把那部蒙人的闲法给废了拉倒!RT @laoshipukong : 27日,全国人大常委会第三次审议侵权责任法草案,删除了有关医疗损害责任“举证倒置”的规定。在医患纠纷中本已处于弱势地位的消费者由此将陷入万劫不复的境地。 "};
"utf-8",
"iphone5",
"鲜芋仙 3",
"RT @laoshipukong : 27日,",
"AT&T是一件不错的公司,给你发offer了吗?",
"干脆就把那部蒙人的闲法给废了拉倒!RT @laoshipukong : 27日,全国人大常委会第三次审议侵权责任法草案,删除了有关医疗损害责任“举证倒置”的规定。在医患纠纷中本已处于弱势地位的消费者由此将陷入万劫不复的境地。 " };
for (String sentence : bugs) {
List<SegToken> tokens = segmenter.process(sentence, SegMode.SEARCH);
System.out.print(String.format("\n%s\n%s", sentence, tokens.toString()));
}
}


@Test
public void testSegmentSpeed() {
long length = 0L;
Expand All @@ -163,7 +171,6 @@ public void testSegmentSpeed() {
}
long elapsed = (System.currentTimeMillis() - start);
System.out.println(String.format("time elapsed:%d, rate:%fkb/s, words:%.2f/s", elapsed,
(length * 1.0) / 1024.0f / (elapsed * 1.0 / 1000.0f), wordCount * 1000.0f
/ (elapsed * 1.0)));
(length * 1.0) / 1024.0f / (elapsed * 1.0 / 1000.0f), wordCount * 1000.0f / (elapsed * 1.0)));
}
}

0 comments on commit e6487e1

Please sign in to comment.