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
# ],
# [
# {
# "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.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,
# 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.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
#
正規表現を使って、トークンを分割します。