2017-02-09 3 views
2

Moses 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}/) 
  1. ли $pre =~ /\./ проверки префикс является ли один fullstop?

  2. И есть $pre =~ /\p{IsAlpha}/ проверяет, является ли префикс альфой из списка алфавита в perluniprop?

  3. Один из связанных вопросов заключается в том, находится ли полный стоп внутри алфавита perluniprop? Если это так, разве это условие никогда не будет истинным?

+2

Они проверяют, если эти вещи * содержатся *. Нет, FULL STOP не является буквенной буквой. – ikegami

+0

А теперь я вижу. Итак, '$ pre = ~/\ p {IsAlpha} /' проверяет, находятся ли все символы в '$ pre' в алфавите peruniprop, правильно? – alvas

+2

Нет, он проверяет, содержит ли $ pre * * соответствующий символ, поэтому он проверяет, соответствует ли * любой символ * в $ pre. – ikegami

ответ

3

Пожалуйста, поправьте меня, если я ошибаюсь [о $NONBREAKING_PREFIX{$pre} && $NONBREAKING_PREFIX{$pre}==1 проверки] ли префикс в списке неразрывный префиксов

Не могу сказать, не зная, что %NONBREAKING_PREFIX содержит, но это справедливое предположение.

Пожалуйста, поправьте меня, если я ошибаюсь [о $i<scalar(@words)-1 && ($words[$i+1] =~ /^[\p{IsLower}]/) проверке], является ли слово не последний маркер и есть еще строчный маркер в качестве следующего слова

Если предположить, что код итерация над @words, а $i - это индекс текущего слова, затем он проверяет, следует ли за текущим словом слово, которое начинается с строчной буквы (как определено Unicode).

Является ли $pre =~ /\./ проверкой, является ли префикс единым полным ходом?

Не совсем. Он проверяет, является ли любым символов в строке в $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 и т. Д., Пока не найдет совпадение.

И $ до = ~/\ р {IsAlpha}/проверки префикса является ли альфа из списка алфавита в 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 определяет, какие символы являются алфавитом [2]. Существует немало:

$ unichars '\p{Alpha}' | wc -l 
10391 

Так что, к вопросу. $pre =~ /\p{IsAlpha}/ проверяет, является ли любым символов в строке в $pre является алфавитным символом.

Один связанный с этим вопрос заключается в том, является ли fullstop уже внутри алфавита perluniprop?

No.

$ 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 

Если да, то не было бы не это условие не будет правдой?

$ 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 

  1. подчеркивания и пробелы игнорируются, так \p{IsAlpha}, \p{Is_Alpha} и \p{I s_A l p_h_a} все эквивалентны.

  2. Список буквенных символов немного отличается от списка буквенных символов.

    $ unichars '\p{Letter}' | wc -l 
    9540 
    
    $ unichars '\p{Alpha}' | wc -l 
    10391 
    

    Все буквы алфавитный, но так некоторые буквенные знаки, римские цифры и т.д.

+0

Вы можете использовать 'perl -E'say 'hello"' 'вместо' CORE :: say'. –

+0

'-E' не является передовой совместимой. Я не хочу, чтобы на код влияло обновление Perl. – ikegami