忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT 视频 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 464 | 回复: 4

结巴中文分词的Perl扩展 [复制链接]

论坛徽章:
0
发表于 2017-04-16 22:42 |显示全部楼层
最近抽空写了一个Lingua::ZH::Jieba模块。

https://metacpan.org/pod/Lingua::ZH::Jieba

我是用SWIG去包的CppJieba,那是结巴的一个C++实现。实际上用SWIG做这一类C++的Perl binding还是很方便的,到今天这个程度(0.003版)我断断续续写了几次,包括在github上把Travis和AppVeyor两个CI都设置起来,加起来估计也没到8小时。

欢迎大家试用。

论坛徽章:
0
发表于 2017-04-17 09:13 |显示全部楼层
楼主++++++

论坛徽章:
0
发表于 2017-04-17 17:19 |显示全部楼层
本帖最后由 L_WC 于 2017-04-19 12:49 编辑

回复 1# zhouzhen1

首先感谢lz, 刚好前段时间有个需求要用分词,我用perl调的python的jieba....如果这个perl的好用了,很有帮助。。。谢谢
刚使用了一下,
1. 有个问题想请教一下,extract的score 是根据什么来的。

2 . 在 $jieba->insert_user_word("中国人");  之后只有 {cut_all => 1} 模式才能输出 中国人 这个分词。

  1. <div>use Lingua::ZH::Jieba;</div><div>binmode STDOUT, ":utf8";</div><div>
  2. </div><div>my $jieba = Lingua::ZH::Jieba->new();</div><div>$jieba->insert_user_word("中国人");</div><div>
  3. </div><div>#my $words_cutall = $jieba->cut("我来到北京清华大学,我是中国人", { cut_all => 1 } );</div><div>#my $words_cutall = $jieba->cut("我来到北京清华大学,我是中国人" );</div><div>my $words_cutall = $jieba->cut("我来到北京清华大学,我是中国人", { no_hmm => 1 } );</div><div>print join('/', @$words_cutall), "\n";</div>
复制代码

。。。。update 一下 2017/4/19  用lz的分词包写了一个文本比对的例子
  1. [root@L121 tmp]# perl jieba.pl
  2. Similar is :0.815374248327211
  3. [root@L121 tmp]# cat  jieba.pl
  4. use Lingua::ZH::Jieba;
  5. use Smart::Comments;
  6. binmode STDOUT, ":utf8";

  7. my ($txt1, $txt2) = ("我来到北京清华大学,我是中国人","我来到北京清华大学,中国人民很友好");

  8. my $jieba = Lingua::ZH::Jieba->new();
  9. my $words_cutall1 = $jieba->cut( $txt1, { cut_all => 1 } );
  10. my $words_cutall2 = $jieba->cut( $txt2, { cut_all => 1 } );
  11. #print join('/', @$words_cutall1), "\n";
  12. #print join('/', @$words_cutall2), "\n";

  13. use v5.10;
  14. my $all_list = get_all_words($words_cutall1, $words_cutall2);
  15. my %h_1 = get_words_count($words_cutall1);
  16. my %h_2 = get_words_count($words_cutall2);

  17. my $sum = 0;
  18. my $sum_1 = 0;
  19. my $sum_2 = 0;
  20. foreach my $k (get_all_words($words_cutall1, $words_cutall2)){
  21. $h_1{$k} = 0 unless exists $h_1{$k};
  22. $h_2{$k} = 0 unless exists $h_2{$k};
  23. $sum_1 += $h_1{$k} * $h_1{$k};
  24. $sum_2 += $h_2{$k} * $h_2{$k};
  25. $sum += $h_1{$k} * $h_2{$k};
  26. }

  27. say "Similar is :", $sum/(sqrt($sum_1) * sqrt($sum_2));

  28. sub get_words_count{
  29. my $words = shift;
  30. my %h;
  31. $h{$_}++ for @$words;
  32. return %h;
  33. }


  34. sub get_all_words{
  35. my ($words1, $words2) = @_;
  36. my @words = (@$words1, @$words2);
  37. my %h;
  38. $h{$_}++ for @words;
  39. return   keys %h;
  40. }
复制代码


论坛徽章:
0
发表于 2017-04-19 14:28 |显示全部楼层
感.谢. l.z.

论坛徽章:
0
发表于 2017-05-05 22:20 |显示全部楼层
回复 3# L_WC

一段时间没上,忙成狗了。。不好意思你的两个问题我目前还不好回答,因为我只是wrap了CppJieba的项目(https://github.com/yanyiwu/cppjieba,它是Python Jieba用C++的一个实现),但是我并不了解其中的NLP原理。改天我研究一下再回复你吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

【有奖调查】AI时代如何迎接未知挑战?

人工智能一直在医疗行业扮演着重要角色,最早的专家系统和后来的基因诊断都是人工智能技术在医疗的行业探索。近年来,随着深度学习等技术的进步,人工智能在医疗行业的应用领域不断扩展,医学影像智能诊断、语音电子病历、癌症智能诊断等均已逐渐成为热门发展方向。
而作为人工智能重要推动力的深度学习技术的快速发展却亟需认知系统的强力支撑。
----------------------------------------
活动时间:2017年5月15日-6月5日

调查入口>>
  

北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:1101082001
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP