在 Moses Tokenizer 中,$pre =~ /\./ && $pre =~ /\p{IsAlpha}/) 是什么意思?
What does ($pre =~ /\./ && $pre =~ /\p{IsAlpha}/) mean in the Moses Tokenizer?
Moses Tokenizer是机器翻译和自然语言处理实验中广泛使用的tokenizer
有一行正则表达式检查:
if (($pre =~ /\./ && $pre =~ /\p{IsAlpha}/) ||
($NONBREAKING_PREFIX{$pre} && $NONBREAKING_PREFIX{$pre}==1) ||
($i<scalar(@words)-1 && ($words[$i+1] =~ /^[\p{IsLower}]/)))
如有错误请指正,第2、3个条件要检查
- 前缀是否在不间断前缀列表中
- 该词是否不是最后一个词,是否还有一个小写的词作为下一个词。
问题是第一个条件,它检查:
($pre =~ /\./ && $pre =~ /\p{IsAlpha}/)
是否$pre =~ /\./
检查前缀是否为单句号?
并且 $pre =~ /\p{IsAlpha}/
检查前缀是否是 perluniprop?
中字母列表中的字母
一个相关的问题是句号是否已经在 perluniprop 字母表中?如果是这样,这个条件不会永远不成立吗?
Please correct me if I'm wrong [about $NONBREAKING_PREFIX{$pre} && $NONBREAKING_PREFIX{$pre}==1
checking] whether the prefix is in a list of nonbreaking prefixes
不知道 %NONBREAKING_PREFIX
包含什么内容就无法判断,但这是一个合理的猜测。
Please correct me if I'm wrong [about $i<scalar(@words)-1 && ($words[$i+1] =~ /^[\p{IsLower}]/)
checking] whether the word is not the last token and there is still a lowercased token as the next word
假设代码遍历 @words
,并且 $i
是当前单词的索引,那么它会检查当前单词后面是否跟有以小写字母开头的单词 (由 Unicode 定义)。
Is the $pre =~ /\./
checking whether the prefix is a single fullstop?
不完全是。它检查 $pre
中字符串中的 任何 个字符是否是句号。
$ perl -e'CORE::say "abc.def" =~ /\./ ? "match" : "no match"'
match
$ perl -e'CORE::say "abc!def" =~ /\./ ? "match" : "no match"'
no match
Perl 首先尝试在位置 0 找到匹配项,然后在位置 1 等,直到找到匹配项。
And is $pre =~ /\p{IsAlpha}/ checking whether the prefix is an alpha from the list of alphabet in the perluniprop?
\p{IsAlpha}
确实是在perluniprops中定义的。 [注意正确的拼写。]它定义了
\p{Is_*} ⇒ \p{*}
\p{Alpha} ⇒ \p{XPosixAlpha}
\p{XPosixAlpha} ⇒ \p{Alphabetic=Y}
\p{Alpha: *} ⇒ \p{Alphabetic=*}
\p{Alphabetic} ⇒ \p{Alphabetic=Y}
所以\p{IsAlpha}
是\p{Alphabetic=Y}
[1]的别名。 Unicode 定义了哪些字符是 Alphabetic[2]。有不少:
$ unichars '\p{Alpha}' | wc -l
10391
回到问题。 $pre =~ /\p{IsAlpha}/
检查 $pre
中字符串中的 任何 个字符是否为字母字符。
One related question is whether the fullstop is already inside the perluniprop alphabet?
没有
$ perl -e'CORE::say "." =~ /\p{IsAlpha}/ ? "match" : "no match"'
no match
$ uniprops .
U+002E <.> \N{FULL STOP}
\pP \p{Po}
All Any ASCII Assigned Basic_Latin Punct Is_Punctuation Case_Ignorable CI Common Zyyy Po P
Gr_Base Grapheme_Base Graph X_POSIX_Graph GrBase Other_Punctuation Pat_Syn Pattern_Syntax
PatSyn POSIX_Graph POSIX_Print POSIX_Punct Print X_POSIX_Print Punctuation STerm Term
Terminal_Punctuation Unicode X_POSIX_Punct
相比之下,
$ uniprops a
U+0061 <a> \N{LATIN SMALL LETTER A}
\w \pL \p{LC} \p{L_} \p{L&} \p{Ll}
AHex POSIX_XDigit All Alnum X_POSIX_Alnum Alpha X_POSIX_Alpha Alphabetic Any ASCII
ASCII_Hex_Digit Assigned Basic_Latin ID_Continue Is_IDC Cased Cased_Letter LC
Changes_When_Casemapped CWCM Changes_When_Titlecased CWT Changes_When_Uppercased CWU Ll L
Gr_Base Grapheme_Base Graph X_POSIX_Graph GrBase Hex X_POSIX_XDigit Hex_Digit IDC ID_Start
IDS Letter L_ Latin Latn Lowercase_Letter Lower X_POSIX_Lower Lowercase PerlWord POSIX_Word
POSIX_Alnum POSIX_Alpha POSIX_Graph POSIX_Lower POSIX_Print Print X_POSIX_Print Unicode Word
X_POSIX_Word XDigit XID_Continue XIDC XID_Start XIDS
If so, wouldn't this condition never be true?
$ perl -E'CORE::say /\./ && /\p{IsAlpha}/ ? "match" : "no match" for $ARGV[0]' a
no match
$ perl -E'CORE::say /\./ && /\p{IsAlpha}/ ? "match" : "no match" for $ARGV[0]' .
no match
$ perl -E'CORE::say /\./ && /\p{IsAlpha}/ ? "match" : "no match" for $ARGV[0]' a.
match
忽略下划线和空格,所以\p{IsAlpha}
、\p{Is_Alpha}
和\p{I s_A l p_h_a}
都是等价的。
字母字符列表与字母字符列表略有不同。
$ unichars '\p{Letter}' | wc -l
9540
$ unichars '\p{Alpha}' | wc -l
10391
所有字母都是字母,但一些字母标记、罗马数字等也是如此
Moses Tokenizer是机器翻译和自然语言处理实验中广泛使用的tokenizer
有一行正则表达式检查:
if (($pre =~ /\./ && $pre =~ /\p{IsAlpha}/) ||
($NONBREAKING_PREFIX{$pre} && $NONBREAKING_PREFIX{$pre}==1) ||
($i<scalar(@words)-1 && ($words[$i+1] =~ /^[\p{IsLower}]/)))
如有错误请指正,第2、3个条件要检查
- 前缀是否在不间断前缀列表中
- 该词是否不是最后一个词,是否还有一个小写的词作为下一个词。
问题是第一个条件,它检查:
($pre =~ /\./ && $pre =~ /\p{IsAlpha}/)
是否
$pre =~ /\./
检查前缀是否为单句号?并且
$pre =~ /\p{IsAlpha}/
检查前缀是否是 perluniprop? 中字母列表中的字母
一个相关的问题是句号是否已经在 perluniprop 字母表中?如果是这样,这个条件不会永远不成立吗?
Please correct me if I'm wrong [about
$NONBREAKING_PREFIX{$pre} && $NONBREAKING_PREFIX{$pre}==1
checking] whether the prefix is in a list of nonbreaking prefixes
不知道 %NONBREAKING_PREFIX
包含什么内容就无法判断,但这是一个合理的猜测。
Please correct me if I'm wrong [about
$i<scalar(@words)-1 && ($words[$i+1] =~ /^[\p{IsLower}]/)
checking] whether the word is not the last token and there is still a lowercased token as the next word
假设代码遍历 @words
,并且 $i
是当前单词的索引,那么它会检查当前单词后面是否跟有以小写字母开头的单词 (由 Unicode 定义)。
Is the
$pre =~ /\./
checking whether the prefix is a single fullstop?
不完全是。它检查 $pre
中字符串中的 任何 个字符是否是句号。
$ perl -e'CORE::say "abc.def" =~ /\./ ? "match" : "no match"'
match
$ perl -e'CORE::say "abc!def" =~ /\./ ? "match" : "no match"'
no match
Perl 首先尝试在位置 0 找到匹配项,然后在位置 1 等,直到找到匹配项。
And is $pre =~ /\p{IsAlpha}/ checking whether the prefix is an alpha from the list of alphabet in the perluniprop?
\p{IsAlpha}
确实是在perluniprops中定义的。 [注意正确的拼写。]它定义了
\p{Is_*} ⇒ \p{*}
\p{Alpha} ⇒ \p{XPosixAlpha}
\p{XPosixAlpha} ⇒ \p{Alphabetic=Y}
\p{Alpha: *} ⇒ \p{Alphabetic=*}
\p{Alphabetic} ⇒ \p{Alphabetic=Y}
所以\p{IsAlpha}
是\p{Alphabetic=Y}
[1]的别名。 Unicode 定义了哪些字符是 Alphabetic[2]。有不少:
$ unichars '\p{Alpha}' | wc -l
10391
回到问题。 $pre =~ /\p{IsAlpha}/
检查 $pre
中字符串中的 任何 个字符是否为字母字符。
One related question is whether the fullstop is already inside the perluniprop alphabet?
没有
$ perl -e'CORE::say "." =~ /\p{IsAlpha}/ ? "match" : "no match"'
no match
$ uniprops .
U+002E <.> \N{FULL STOP}
\pP \p{Po}
All Any ASCII Assigned Basic_Latin Punct Is_Punctuation Case_Ignorable CI Common Zyyy Po P
Gr_Base Grapheme_Base Graph X_POSIX_Graph GrBase Other_Punctuation Pat_Syn Pattern_Syntax
PatSyn POSIX_Graph POSIX_Print POSIX_Punct Print X_POSIX_Print Punctuation STerm Term
Terminal_Punctuation Unicode X_POSIX_Punct
相比之下,
$ uniprops a
U+0061 <a> \N{LATIN SMALL LETTER A}
\w \pL \p{LC} \p{L_} \p{L&} \p{Ll}
AHex POSIX_XDigit All Alnum X_POSIX_Alnum Alpha X_POSIX_Alpha Alphabetic Any ASCII
ASCII_Hex_Digit Assigned Basic_Latin ID_Continue Is_IDC Cased Cased_Letter LC
Changes_When_Casemapped CWCM Changes_When_Titlecased CWT Changes_When_Uppercased CWU Ll L
Gr_Base Grapheme_Base Graph X_POSIX_Graph GrBase Hex X_POSIX_XDigit Hex_Digit IDC ID_Start
IDS Letter L_ Latin Latn Lowercase_Letter Lower X_POSIX_Lower Lowercase PerlWord POSIX_Word
POSIX_Alnum POSIX_Alpha POSIX_Graph POSIX_Lower POSIX_Print Print X_POSIX_Print Unicode Word
X_POSIX_Word XDigit XID_Continue XIDC XID_Start XIDS
If so, wouldn't this condition never be true?
$ perl -E'CORE::say /\./ && /\p{IsAlpha}/ ? "match" : "no match" for $ARGV[0]' a
no match
$ perl -E'CORE::say /\./ && /\p{IsAlpha}/ ? "match" : "no match" for $ARGV[0]' .
no match
$ perl -E'CORE::say /\./ && /\p{IsAlpha}/ ? "match" : "no match" for $ARGV[0]' a.
match
忽略下划线和空格,所以
\p{IsAlpha}
、\p{Is_Alpha}
和\p{I s_A l p_h_a}
都是等价的。字母字符列表与字母字符列表略有不同。
$ unichars '\p{Letter}' | wc -l 9540 $ unichars '\p{Alpha}' | wc -l 10391
所有字母都是字母,但一些字母标记、罗马数字等也是如此