TokenDelimit

概要

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

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

構文

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

TokenDelimit

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

TokenDelimit("pattern", pattern)

The delimiter option and a pattern option are not use at the same time.

使い方

簡単な使い方

以下は 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
#     }
#   ]
# ]

高度な使い方

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* は、 、 改行文字を区切り文字としています。ただし、 または ! の後ろに または がある場合は、 は区切り文字としません。

引数

省略可能引数

There are two optional parameters delimiter and pattern.

delimiter

指定した文字でトークンを分割します。

You can use one or more characters for a delimiter.

pattern

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

参考