Стабильное регулярное выражение или простая библиотека для многоязычного токенизации? - PullRequest
0 голосов
/ 22 июня 2019

У нас есть продукт, который требует умения искать, и в основном ориентирован на английский язык.Таким образом, токенизация в пространствах работает относительно хорошо (несмотря на то, что это не всегда лучшая идея).

В последнее время мы расширяемся на японский рынок и обнаружили ряд осложняющих факторов.У японского языка есть два ключевых момента: 1) wordsCanBeStrungTogetherWithoutSpaces 2) В японском языке используются разные знаки препинания символов

У нас есть обходной путь для 1, но наличие «слова» с несколькими сотнями символов вызывает некоторые сложности,так что было бы идеально решить для (2).В самом строгом смысле я пытаюсь найти решение для японского, но на самом деле я хотел бы найти способ хотя бы разделить предложения независимо от алфавита.Есть ли регулярное выражение, которое хорошо для разделения на основе диапазона Юникод?Или он должен быть индивидуальным и включать каждый другой язык?

При быстром поиске выявляется https://unicodelookup.com/#full%20stop/1 Похоже, что различные "точки полной остановки" без паттерна (насколько я могу судить),но не так много, и я мог бы построить, чтобы соответствовать тем.Меня беспокоит то, что есть крайние случаи, о которых я не знаю, о которых я не знаю.

Ответы [ 2 ]

1 голос
/ 22 июня 2019

Для начала попробуйте что-нибудь подобное.
Слово в группе 1.

[^\pL\pN]*([\pL\pN](?:[\pL\pN_-]|(?![?.!])\pP(?=[\pL\pN\pP]))*)(?<!\pP)

https://regex101.com/r/YEgUQ3/1

Объяснил

 # Unicode

 [^\pL\pN]*                    # Strip non-letters/numbers               
 (                             # (1 start)
      [\pL\pN]                      # First letter/number
      (?:                           # Word body
           [\pL\pN_-]                    # Letter/number or '-'
        |                              # or,
           (?! [?.!] )                   # ( Not Special word ending punctuation, Add more here )
           \pP                           # Punctuation
           (?= [\pL\pN\pP] )             #   if followed by punctuation/letter/number
      )*                            # Do many times
 )                             # (1 end)
 (?<! \pP )                    # Don't end on a punctuation
0 голосов
/ 24 июня 2019

Похоже, что Unicode категории на самом деле хорошо разработаны для этого. Следующее регулярное выражение работает нормально:

[\p{L}\p{Nd}]+ https://regex101.com/r/YEgUQ3/2

И имеет простое объяснение:

\p{L} matches any kind of letter from any language
\p{Nd} matches a digit zero through nine in any script except ideographic scripts

Где, очевидно, letter означает строго не пунктуацию. И идеографические числа кажутся просто словами.

...