Skip to content

Commit

Permalink
update wiki, add some new word to dict.
Browse files Browse the repository at this point in the history
  • Loading branch information
piaolingxue committed Aug 10, 2013
1 parent 76a2491 commit dd33b10
Show file tree
Hide file tree
Showing 3 changed files with 133 additions and 123 deletions.
23 changes: 16 additions & 7 deletions README.org
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,11 @@
}
#+END_SRC


* 算法(wiki补充...)
- [ ] 基于 =trie= 树结构实现高效词图扫描
- [ ] 生成所有切词可能的有向无环图 =DAG=
- [ ] 采用动态规划算法计算最佳切词组合
- [ ] 基于 =HMM= 模型,采用 =Viterbi= (维特比)算法实现未登录词识别

* 性能评估
- 测试机配置
Expand All @@ -58,21 +62,26 @@
#+BEGIN_SRC screen
循环调用一万次
第一次测试结果:
time escape:12373, rate:2486.986533kb/s, words:917319.94/s
time elapsed:12373, rate:2486.986533kb/s, words:917319.94/s
第二次测试结果:
time escape:12284, rate:2505.005241kb/s, words:923966.10/s
time elapsed:12284, rate:2505.005241kb/s, words:923966.10/s
第三次测试结果:
time escape:12336, rate:2494.445880kb/s, words:920071.30/s
time elapsed:12336, rate:2494.445880kb/s, words:920071.30/s

循环调用2万次
第一次测试结果:
time escape:22237, rate:2767.593144kb/s, words:1020821.12/s
time elapsed:22237, rate:2767.593144kb/s, words:1020821.12/s
第二次测试结果:
time escape:22435, rate:2743.167762kb/s, words:1011811.87/s
time elapsed:22435, rate:2743.167762kb/s, words:1011811.87/s
第三次测试结果:
time escape:22102, rate:2784.497726kb/s, words:1027056.34/s
time elapsed:22102, rate:2784.497726kb/s, words:1027056.34/s
统计结果:词典加载时间1.8s左右,分词效率每秒2Mb多,近100万词。

2 Processor Intel(R) Core(TM) i3-2100 CPU @ 3.10GHz
12G 测试效果
time elapsed:19597, rate:3140.428063kb/s, words:1158340.52/s
time elapsed:20122, rate:3058.491639kb/s, words:1128118.44/s

#+END_SRC


Expand Down
3 changes: 2 additions & 1 deletion conf/jieba/user.dict
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
小清新 3
百搭 3
显瘦 3
又拍云 3
又拍云 3
iphone 3
230 changes: 115 additions & 115 deletions src/test/java/com/huaban/analysis/jieba/JiebaSegmenterTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,128 +17,128 @@
*
*/
public class JiebaSegmenterTest extends TestCase {
private JiebaSegmenter segmenter = new JiebaSegmenter();
String[] sentences =
new String[] {
"这是一个伸手不见五指的黑夜。我叫孙悟空,我爱北京,我爱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",
"你认识那个和主席握手的的哥吗?他开一辆黑色的士。", "枪杆子中出政权"};
private JiebaSegmenter segmenter = new JiebaSegmenter();
String[] sentences =
new String[] {
"这是一个伸手不见五指的黑夜。我叫孙悟空,我爱北京,我爱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",
"你认识那个和主席握手的的哥吗?他开一辆黑色的士。", "枪杆子中出政权"};

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

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

@Test
public void testCutForSearch() {
for (String sentence : sentences) {
List<SegToken> tokens = segmenter.process(sentence, SegMode.SEARCH);
System.out.print(String.format("\n%s\n%s", sentence, tokens.toString()));
}
@Test
public void testCutForSearch() {
for (String sentence : sentences) {
List<SegToken> tokens = segmenter.process(sentence, SegMode.SEARCH);
System.out.print(String.format("\n%s\n%s", sentence, tokens.toString()));
}
}

@Test
public void testCutForIndex() {
for (String sentence : sentences) {
List<SegToken> tokens = segmenter.process(sentence, SegMode.INDEX);
System.out.print(String.format("\n%s\n%s", sentence, tokens.toString()));
}
@Test
public void testCutForIndex() {
for (String sentence : sentences) {
List<SegToken> tokens = segmenter.process(sentence, SegMode.INDEX);
System.out.print(String.format("\n%s\n%s", sentence, tokens.toString()));
}
}

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

@Test
public void testSegmentSpeed() {
long length = 0L;
long wordCount = 0L;
long start = System.currentTimeMillis();
for (int i = 0; i < 20000; ++i)
for (String sentence : sentences) {
segmenter.process(sentence, SegMode.INDEX);
length += sentence.getBytes().length;
wordCount += sentence.length();
}
long elapsed = (System.currentTimeMillis() - start);
System.out.println(String.format("time escape:%d, rate:%fkb/s, words:%.2f/s", elapsed,
(length * 1.0) / 1024.0f / (elapsed * 1.0 / 1000.0f), wordCount * 1000.0f
/ (elapsed * 1.0)));
}
@Test
public void testSegmentSpeed() {
long length = 0L;
long wordCount = 0L;
long start = System.currentTimeMillis();
for (int i = 0; i < 20000; ++i)
for (String sentence : sentences) {
segmenter.process(sentence, SegMode.INDEX);
length += sentence.getBytes().length;
wordCount += sentence.length();
}
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)));
}
}

0 comments on commit dd33b10

Please sign in to comment.