7.8.10. TokenDelimit

7.8.10.1. 概要

TokenDelimit は1つ以上の空白文字( U+0020 )で分割してトークンを抽出します。たとえば、 Hello WorldHelloWorld にトークナイズされます。

TokenDelimit はタグテキストに適切です。 groonga full-text-search http というテキストから groongafull-text-searchhttp を抽出します。

7.8.10.2. 構文

TokenDelimit は、省略可能な引数があります。

オプションなし(1つ以上の空白文字( U+0020 )で分割してトークンを抽出):

TokenDelimit

区切り文字を指定:

TokenDelimit("delimiter",  "delimiter1", delimiter", "delimiter2", ...)

正規表現で区切り文字を指定:

TokenDelimit("pattern", pattern)

delimiter オプションと pattern オプションは同時に使用できません。

7.8.10.3. 使い方

7.8.10.4. 簡単な使い方

以下は TokenDelimit の例です。

実行例:

tokenize TokenDelimit "Groonga full-text-search HTTP" NormalizerAuto
# [
#   [
#     0,
#     1337566253.89858,
#     0.000355720520019531
#   ],
#   [
#     {
#       "position": 0,
#       "force_prefix": false,
#       "value": "groonga"
#     },
#     {
#       "position": 1,
#       "force_prefix": false,
#       "value": "full-text-search"
#     },
#     {
#       "position": 2,
#       "force_prefix": false,
#       "value": "http"
#     }
#   ]
# ]

TokenDelimit はオプションを指定することもできます。 TokenDelimitdelimiter オプションと pattern オプションを持っています。

delimiter オプションは、指定した文字でトークンに分割できます。

例えば、以下のように Hello,World は、HelloWorld にトークナイズされます。

実行例:

tokenize 'TokenDelimit("delimiter", ",")' "Hello,World"
# [
#   [
#     0,
#     1337566253.89858,
#     0.000355720520019531
#   ],
#   [
#     {
#       "value": "Hello",
#       "position": 0,
#       "force_prefix": false,
#       "force_prefix_search": false
#     },
#     {
#       "value": "World",
#       "position": 1,
#       "force_prefix": false,
#       "force_prefix_search": false
#     }
#   ]
# ]

pattern オプションは、正規表現でトークンを分割できます。pattern オプションを使うことで、不要な空白を除去することができます。

例えば、以下のように pattern オプションによって、 This is a pen. This is an appleThis is a penThis is an apple にトークナイズされます。

通常、 This is a pen. This is an apple.. で分割する際は、"This is an apple."の文頭に不要な空白が含まれます。

以下の例の用に pattern オプションを使うことで、その不要な空白を除去できます。

実行例:

tokenize 'TokenDelimit("pattern", "\\.\\s*")' "This is a pen. This is an apple."
# [
#   [
#     0,
#     1337566253.89858,
#     0.000355720520019531
#   ],
#   [
#     {
#       "value": "This is a pen.",
#       "position": 0,
#       "force_prefix": false,
#       "force_prefix_search": false
#     },
#     {
#       "value": "This is an apple.",
#       "position": 1,
#       "force_prefix": false,
#       "force_prefix_search": false
#     }
#   ]
# ]

7.8.10.5. 高度な使い方

delimiter オプションは、複数の区切り文字を指定することもできます。

例えば、以下のように Hello, World は、HelloWorld にトークナイズされます。

実行例:

tokenize 'TokenDelimit("delimiter", ",", "delimiter", " ")' "Hello, World"
# [
#   [
#     0,
#     1337566253.89858,
#     0.000355720520019531
#   ],
#   [
#     {
#       "value": "Hello",
#       "position": 0,
#       "force_prefix": false,
#       "force_prefix_search": false
#     },
#     {
#       "value": "World",
#       "position": 1,
#       "force_prefix": false,
#       "force_prefix_search": false
#     }
#   ]
# ]

pattern オプションを使って複雑な条件でトークンを抽出できます。

例えば、以下のように delimiter オプションを使って、 これはペンですか!?リンゴですか?「リンゴです。」これはペンですかリンゴですか「リンゴです。」 とトークナイズします。

実行例:

tokenize 'TokenDelimit("pattern", "([。!?]+(?![)」])|[\\r\\n]+)\\s*")' "これはペンですか!?リンゴですか?「リンゴです。」"
# [
#   [
#     0,
#     1545179416.22277,
#     0.0002887248992919922
#   ],
#   [
#     {
#       "value": "これはペンですか",
#       "position": 0,
#       "force_prefix": false,
#       "force_prefix_search": false
#     },
#     {
#       "value": "リンゴですか",
#       "position": 1,
#       "force_prefix": false,
#       "force_prefix_search": false
#     },
#     {
#       "value": "「リンゴです。」",
#       "position": 2,
#       "force_prefix": false,
#       "force_prefix_search": false
#     }
#   ]
# ]

上記の正規表現の末尾の \\s* は、区切り文字の後ろの0個以上の空白にマッチします。

[。!?]+ は、1個以上の または にマッチします。例えば、 [。!?]+これはペンですか!?!? にマッチします。

(?![)」]) は否定先読みです。 (?![)」]) または にマッチしない場合にマッチします。否定先読みは直前の正規表現と合わせて解釈します。

したがって、 [。!?]+(?![)」]) を解釈します。

[。!?]+(?![)」]) は、 または の後ろに または が無い場合にマッチします。

つまり、 [。!?]+(?![)」]) は、 これはペンですか。 にマッチしますが、 「リンゴです。」 にはマッチしません。 の後ろに があるためです。

[\\r\\n]+ は、1個以上の改行文字にマッチします。

まとめると、 ([。!?]+(?![)」])|[\\r\\n]+)\\s* は、 、 改行文字を区切り文字としています。ただし、 または ! の後ろに または がある場合は、 は区切り文字としません。

7.8.10.6. 引数

7.8.10.6.1. 省略可能引数

省略可能引数は2つあります。 delimiterpattern です。

7.8.10.6.1.1. delimiter

指定した1つ以上の文字でトークンを分割します。

区切り文字には、1つ以上の文字を指定できます。

7.8.10.6.1.2. pattern

正規表現を使って、トークンを分割します。

7.8.10.7. 参考