用于多语言标记化的稳定正则表达式或简单库?
A stable regular expression or simple library for multi-lingual tokenization?
我们的产品需要搜索功能,并且主要以英语为主。因此,空间标记化效果相对较好(尽管并不总是最好的主意)。
我们最近正在进军日本市场,发现了一些复杂的因素。日语有 2 个关键问题:1) wordsCanBeStrungTogetherWithoutSpaces
2) 日语使用不同的标点符号 symbols
我们有 1 的解决方法,但是 "word" 有几百个字符会导致一些复杂情况,因此解决 (2) 是理想的选择。从最严格的意义上讲,我正在尝试解决日语问题,但实际上我想要一种至少可以不考虑字母表来拆分句子的方法。是否有适合基于 unicode 范围进行拆分的正则表达式?还是需要自定义并包括每种不同的语言?
快速搜索显示 https://unicodelookup.com/#full%20stop/1 似乎各种 "full stop" 没有模式(据我所知),但数量不多,我可以构建以匹配那些.我担心的是有些边缘情况我不知道我不知道。
尝试这样的事情开始。
该词在组 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
看起来 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
的意思是严格来说不是标点符号。表意数字似乎只是文字。
我们的产品需要搜索功能,并且主要以英语为主。因此,空间标记化效果相对较好(尽管并不总是最好的主意)。
我们最近正在进军日本市场,发现了一些复杂的因素。日语有 2 个关键问题:1) wordsCanBeStrungTogetherWithoutSpaces 2) 日语使用不同的标点符号 symbols
我们有 1 的解决方法,但是 "word" 有几百个字符会导致一些复杂情况,因此解决 (2) 是理想的选择。从最严格的意义上讲,我正在尝试解决日语问题,但实际上我想要一种至少可以不考虑字母表来拆分句子的方法。是否有适合基于 unicode 范围进行拆分的正则表达式?还是需要自定义并包括每种不同的语言?
快速搜索显示 https://unicodelookup.com/#full%20stop/1 似乎各种 "full stop" 没有模式(据我所知),但数量不多,我可以构建以匹配那些.我担心的是有些边缘情况我不知道我不知道。
尝试这样的事情开始。
该词在组 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
看起来 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
的意思是严格来说不是标点符号。表意数字似乎只是文字。