7.8.10. TokenDelimit#
7.8.10.1. 概要#
TokenDelimit は1つ以上の空白文字( U+0020 )で分割してトークンを抽出します。たとえば、 Hello World は Hello と World にトークナイズされます。
TokenDelimit はタグテキストに適切です。 groonga full-text-search http というテキストから groonga 、 full-text-search 、 http を抽出します。
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 はオプションを指定することもできます。 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.8.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,
# 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つあります。 delimiter と pattern です。
7.8.10.6.1.1. delimiter#
指定した1つ以上の文字でトークンを分割します。
区切り文字には、1つ以上の文字を指定できます。
7.8.10.6.1.2. pattern#
正規表現を使って、トークンを分割します。