7.9.10. TokenDelimit#

7.9.10.1. 概要#

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

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

7.9.10.2. 構文#

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

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

TokenDelimit

区切り文字を指定:

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

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

TokenDelimit("pattern", pattern)

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

7.9.10.3. 使い方#

7.9.10.4. 簡単な使い方#

以下は TokenDelimit の例です。

実行例:

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

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

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

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

実行例:

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 apple は This is a pen と This 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.9.10.5. 高度な使い方#

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

例えば、以下のように Hello, World は、Hello と World にトークナイズされます。以下の例では、"," と " " が区切り文字です。

実行例:

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,
#     1337566253.89858,
#     0.000355720520019531
#   ],
#   [
#     {
#       "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.9.10.6. 引数#

7.9.10.6.1. 省略可能引数#

省略可能引数は2つあります。 delimiter と pattern です。

7.9.10.6.1.1. delimiter#

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

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

7.9.10.6.1.2. pattern#

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

7.9.10.7. 参考#