- 论坛徽章:
- 5
|
本帖最后由 pitonas 于 2014-08-07 06:37 编辑
英文分词或分句, 我不会 ~ {:2_176:}
汉语 分词 :
1: 你必须建立一个非常大 [ 非常大!! include everything ] 的词库
2: 不是 100% 确定, 也许你需要考虑 context
ex: 乒乓球拍卖完了
==> [ 乒乓球, 拍卖, 完, 了 ] or [ 乒乓球拍, 卖, 完, 了 ]- raw: 利比亚政府部队星期六及星期天在东部城市班加西和武装伊斯兰民兵发生冲突
- split: 利比亚|政府|部队|星期六|及|星期天|在|东部|城市|班加西|和|武装|伊斯兰|民兵|发生|冲突
- raw: 造成至少38人丧生
- split: 造成|至少|38|人|丧生
- ------------------------------------------------------------------------------------------
- raw: 乒乓球拍卖完了
- split: 乒乓球|拍卖|完|了
- split: 乒乓球拍|卖|完|了
复制代码 一个原始的,粗糙的代码: ~ {:2_168:}- #!/usr/bin/perl
- use 5.010;
- use utf8;
- binmode STDOUT, ":utf8";
- # a big, very BIG lib
- my @libraries = qw[
- 乒乓球
- 乒乓球拍
- 球拍
- 拍卖
- 卖
- 完
- 了
- 利比亚
- 利比里亚
- 政府
- 政客
- 部队
- 星期
- 星期一
- 星期二
- 星期三
- 星期四
- 星期五
- 星期六
- 星期天
- 及
- 及时
- 在
- 和
- 和平
- 东部
- 东京
- 东西
- 城市
- 班加西
- 班加罗尔
- 武装
- 伊斯兰
- 民兵
- 兵变
- 民众
- 发生
- 冲突
- 冲击
- 造成
- 至少
- 人
- 人物
- 丧生
- 丧命
- ];
- # convert lib to hash
- my %dic = map { $_, undef } @libraries;
- # 2 strings for split
- my $s =
- '利比亚政府部队星期六及星期天在东部城市班加西和武装伊斯兰民兵发生冲突,造成至少38人丧生。';
- my $p = '乒乓球拍卖完了';
- my ( $hans, @hans );
- $hans =
- [ map { [/\p{Han}|\P{Han}+(?{push @hans, $&})/g] } split /[,。]/, $s ];
- $dic{$_} = undef for @hans;
- my $pingpong = [ $p =~ /\p{Han}|\P{Han}+/g ];
- # sub Split
- sub Split {
- my ( $chars, @words ) = @_;
- map {
- my $A = join '', @{$chars}[ 0 .. $_ ];
- my $B = [ @$chars[ $_ + 1 .. $#$chars ] ];
- exists $dic{$A}
- ? do { @$B ? Split( $B, @words, $A ) : [ @words, $A ] }
- : ();
- } 0 .. $#$chars;
- }
- # print split 利比亚政府...
- for my $H (@$hans) {
- my @WORDS = Split $H;
- say "raw:\t", @$H;
- say "split:\t", join '|', @$_ for @WORDS;
- }
- # a sep
- say '-' x 90;
- # print split 乒乓球拍卖完了
- my @ambiguity = Split $pingpong;
- say "raw:\t", $p;
- for my $A (@ambiguity) {
- say "split:\t", join '|', @$A;
- }
复制代码 |
|