Что означает ($pre =~ /\./ && $pre =~ /\p{IsAlpha}/) в Moken Tokenizer?

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? Если так, разве это условие никогда не будет правдой?

1 ответ

Решение

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

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

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

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

Это $pre =~ /\./ проверять, является ли префикс единственным 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 и т. Д., Пока не найдет совпадение.

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

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

Итак, вернемся к вопросу. $pre =~ /\p{IsAlpha}/ проверяет, есть ли какие-либо символы в строке $pre это буквенный символ

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

Нет.

$ 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
    

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

Другие вопросы по тегам