一个稳定的正则表达式或用于多语言标记化的简单库?

时间:2019-06-21 21:16:47

标签: regex nlp tokenize

我们提供的产品需要搜索功能,并且主要针对英语。因此,在空间上进行分词的效果相对较好(尽管并非总是最好的主意)。

我们最近正在扩展到日本市场,并且发现了许多复杂因素。日语有2个关键陷阱:1)wordsCanBeStrungTogetherWithoutSpaces 2)日语使用不同的标点符号symbols

我们有一个针对1的解决方法,但是拥有一个包含数百个字符的“单词”会带来一些麻烦,因此,理想的是解决(2)。从最严格的意义上讲,我试图解决日语问题,但实际上,我希望有一种方法可以至少拆分句子,而不考虑字母。是否有一个正则表达式适合基于unicode范围进行拆分?还是需要自定义并包括每种不同的语言?

快速搜索显示https://unicodelookup.com/#full%20stop/1似乎各种“句号”都没有模式(据我所知),但是数量并不多,我可以进行匹配。我担心的是,有些极端情况我不知道。

2 个答案:

答案 0 :(得分:1)

尝试类似的方法开始。
这个词在第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

答案 1 :(得分:0)

看来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显然不是严格的标点符号。表意数字似乎只是文字。