免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6033 | 回复: 15

求中英文分词或分句的代码 [复制链接]

论坛徽章:
0
发表于 2014-08-06 17:55 |显示全部楼层
如:利比亚政府部队星期六及星期天在东部城市班加西和武装伊斯兰民兵发生冲突,造成至少38人丧生。    分次后得到 :利比亚 / 政府 / 部队 / 星期六 / 及 / 星期天 / 在 / 东部 / 城市 / 班加西 / 和 / 武装 / 伊斯兰 / 民兵 / 发生 / 冲突 / 造成 / 至少 / 38 / 人 / 丧生

At least 38 people have been killed in the eastern Libya city of Benghazi as Libyan government forces clashed with armed Islamist militants on Saturday and Sunday
处理后 :At / least / 38 / people / have / been / killed / in / the / eastern / Libya / city / of / Benghazi / as / Libyan / government / forces / clashed / with / armed / Islamist / militants / on / Saturday / and / Sunday

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
发表于 2014-08-07 11:06 |显示全部楼层
你题目中的英文部分:
  1. echo 'At least 38 people have been killed in the eastern Libya city of Benghazi as Libyan government forces clashed with armed Islamist militants on Saturday and Sunday'|perl -lne 'print if s/([^ ]+)/ $1 \/ /g'
  2. At /   least /   38 /   people /   have /   been /   killed /   in /   the /   eastern /   Libya /   city /   of /   Benghazi /   as /   Libyan /   government /   forces /   clashed /   with /   armed /   Islamist /   militants /   on /   Saturday /   and /   Sunday /
复制代码
这肯定不是你需要的啦~
---------------------------------------
至于中文,别逗了。。。

论坛徽章:
0
发表于 2014-08-07 11:14 |显示全部楼层
英文这个例子些简单了,要是像中文那种格式里面含有不能切割的短语你这样就不行了 回复 2# huang6894


   

论坛徽章:
0
发表于 2014-08-07 11:42 |显示全部楼层
应该可以用perl去写,应为我有c#的源代码 也是实现中英文分词的超准的 ,语言都是想通的嘛,所以我想用perl试试看 回复 4# huang6894


   

论坛徽章:
0
发表于 2014-08-07 11:43 |显示全部楼层
其实我给出的例子 就是那个个代码实现的结果 ,你帮我看看前天的那个帖子吧 回复 4# huang6894


   

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
发表于 2014-08-07 13:08 |显示全部楼层
回复 5# 大山里出来的孩子


    show your c# code~

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
发表于 2014-08-07 13:33 |显示全部楼层
本帖最后由 pitonas 于 2014-08-07 06:37 编辑

英文分词或分句, 我不会 ~ {:2_176:}

汉语        分词 :
1: 你必须建立一个非常大 [ 非常大!! include everything ] 的词库
2: 不是 100% 确定, 也许你需要考虑 context

ex: 乒乓球拍卖完了
==> [ 乒乓球, 拍卖, 完, 了 ] or [ 乒乓球拍, 卖, 完, 了 ]
  1. raw:    利比亚政府部队星期六及星期天在东部城市班加西和武装伊斯兰民兵发生冲突
  2. split:  利比亚|政府|部队|星期六|及|星期天|在|东部|城市|班加西|和|武装|伊斯兰|民兵|发生|冲突
  3. raw:    造成至少38人丧生
  4. split:  造成|至少|38|人|丧生
  5. ------------------------------------------------------------------------------------------
  6. raw:    乒乓球拍卖完了
  7. split:  乒乓球|拍卖|完|了
  8. split:  乒乓球拍|卖|完|了
复制代码
一个原始的,粗糙的代码: ~ {:2_168:}
  1. #!/usr/bin/perl

  2. use 5.010;
  3. use utf8;
  4. binmode STDOUT, ":utf8";

  5. # a big, very BIG lib
  6. my @libraries = qw[
  7.   乒乓球
  8.   乒乓球拍
  9.   球拍
  10.   拍卖
  11.   卖
  12.   完
  13.   了
  14.   利比亚
  15.   利比里亚
  16.   政府
  17.   政客
  18.   部队
  19.   星期
  20.   星期一
  21.   星期二
  22.   星期三
  23.   星期四
  24.   星期五
  25.   星期六
  26.   星期天
  27.   及
  28.   及时
  29.   在
  30.   和
  31.   和平
  32.   东部
  33.   东京
  34.   东西
  35.   城市
  36.   班加西
  37.   班加罗尔
  38.   武装
  39.   伊斯兰
  40.   民兵
  41.   兵变
  42.   民众
  43.   发生
  44.   冲突
  45.   冲击
  46.   造成
  47.   至少
  48.   人
  49.   人物
  50.   丧生
  51.   丧命
  52. ];

  53. # convert lib to hash
  54. my %dic = map { $_, undef } @libraries;

  55. # 2 strings for split
  56. my $s =
  57. '利比亚政府部队星期六及星期天在东部城市班加西和武装伊斯兰民兵发生冲突,造成至少38人丧生。';

  58. my $p = '乒乓球拍卖完了';

  59. my ( $hans, @hans );
  60. $hans =
  61.   [ map { [/\p{Han}|\P{Han}+(?{push @hans, $&})/g] } split /[,。]/, $s ];


  62. $dic{$_} = undef for @hans;

  63. my $pingpong = [ $p =~ /\p{Han}|\P{Han}+/g ];

  64. # sub Split
  65. sub Split {
  66.     my ( $chars, @words ) = @_;
  67.     map {
  68.         my $A = join '', @{$chars}[ 0 .. $_ ];
  69.         my $B = [ @$chars[ $_ + 1 .. $#$chars ] ];
  70.         exists $dic{$A}
  71.           ? do { @$B ? Split( $B, @words, $A ) : [ @words, $A ] }
  72.           : ();
  73.     } 0 .. $#$chars;
  74. }

  75. # print split 利比亚政府...
  76. for my $H (@$hans) {
  77.     my @WORDS = Split $H;
  78.     say "raw:\t", @$H;
  79.     say "split:\t", join '|', @$_ for @WORDS;
  80. }

  81. # a sep
  82. say '-' x 90;

  83. # print split 乒乓球拍卖完了
  84. my @ambiguity = Split $pingpong;
  85. say "raw:\t", $p;

  86. for my $A (@ambiguity) {
  87.     say "split:\t", join '|', @$A;
  88. }

复制代码

论坛徽章:
0
发表于 2014-08-07 14:07 |显示全部楼层
那里面很多文件我不知道哪一个,发个你先看看
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Sj110.Com.Chinese;

namespace 中文分词测试程序
{
        public partial class FormTokenizerSample : Form
        {
                public FormTokenizerSample()
                {
                        InitializeComponent();
                }

                private void linkLabelCopyright_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
                {
                        System.Diagnostics.Process.Start("IEXPLORE.EXE", "\"http://www.sj110.com\"");
                }

                private void buttonTokenize_Click(object sender, EventArgs e)
                {
                        DateTime startTime = DateTime.Now;
                        if (this.textBoxInputString.Text.Trim().Length == 0) return;
                        List<string> resultList = Tokenizer.Tokenize(this.textBoxInputString.Text);
                        TimeSpan duration = DateTime.Now - startTime;

                        StringBuilder sb = new StringBuilder();
                        foreach (string result in resultList)
                        {
                                sb.AppendFormat("{0} / ", result);
                        }
                        if(sb.Length > 0)
                                sb.Remove(sb.Length - 3, 3);

                        this.textBoxResult.Text = sb.ToString();
                        this.labelTokenizeTimeValue.Text = duration.ToString();
                }
        }
回复 7# huang6894


   

论坛徽章:
0
发表于 2014-08-07 14:08 |显示全部楼层
你真是大神啊,加我qq好吗 ?1142330672 回复 8# pitonas


   

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
发表于 2014-08-07 15:47 |显示全部楼层
大神不QQ,
QQ非大神! ~ {:2_168:}

我的代码翻译自这里, 但是代码我的 $师傅 rubyish 删除了 ~{:2_179:}
寻找单词
http://bbs.chinaunix.net/thread-4133356-1-1.html

回复 10# 大山里出来的孩子


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP