Solr - 如何以复合 "word-1, word-1 + word-2, word-1 + word-2 ... word-n" 方式标记字符串中的单词?
Solr - How to tokenize words in a string in a compounding "word-1, word-1 + word-2, word-1 + word-2 ... word-n" manner?
我想标记一个字符串,例如 Best Beat Makers
以几乎类似于 NGram 的方式为每个单词生成标记,例如:
IN: "Best Beat Makers"
OUT: ["Best", "Beat", "Makers", "Best Beat", "Best Beat Makers"]
^ ^
| |
How can I generate these tokens?
结果应该不包括"Beat Makers"
,因为我只想以复合方式标记单词(例如 word1、word1 + word2、word1 + word2 + word3、等)而不是组合(例如 word1、word1 + word2、word2 + word3 等)。
目前,我只能使用StandardTokenizerFactory
或ClassicTokenizerFactory
生成前三个标记,而传统的NGramTokenizerFactory
仅适用于单词的字符(并且是索引有点贵)。
我考虑过的一个选项是使用 StandardTokenizerFactory
获取前三个标记,然后创建一个 copyField
到另一个字段,该字段使用 PatternTokenizerFactory
并定义正则表达式以获取最后两个标记,但如果可能的话,我更愿意只使用一个字段来获取我需要的标记。
如果您更熟悉 ElasticSearch,我仍然想听听您的想法,因为 Solr 和 ES 之间的分词器或多或少相似,可能会把我推向正确的方向。谢谢!
Shingle Filter
:
该过滤器从令牌流中构造带状符号,它们是令牌 n-grams。它将令牌运行组合成一个令牌。
你也使用下面的属性。
maxShingleSize :
(整数,必须 >= minShigleSize,默认为 2)每个 shingle 的最大令牌数。
这是应用的字段类型。
<fieldType name="text_tokens" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.ShingleFilterFactory" maxShingleSize="3" outputUnigrams="true"/>
</analyzer>
</fieldType>
输入是:"Welcome to Apache Solr"
预期输出为:
Unigram: "Welcome", "to", "Apache", "Solr"
Bigram: "Welcome to", "to Apache", "Apache Solr"
Trigram: "Welcome to Apache", "to Apache Solr"
下面是您分享的文字分析。
输入是:Best Beat Makers
我想标记一个字符串,例如 Best Beat Makers
以几乎类似于 NGram 的方式为每个单词生成标记,例如:
IN: "Best Beat Makers"
OUT: ["Best", "Beat", "Makers", "Best Beat", "Best Beat Makers"]
^ ^
| |
How can I generate these tokens?
结果应该不包括"Beat Makers"
,因为我只想以复合方式标记单词(例如 word1、word1 + word2、word1 + word2 + word3、等)而不是组合(例如 word1、word1 + word2、word2 + word3 等)。
目前,我只能使用StandardTokenizerFactory
或ClassicTokenizerFactory
生成前三个标记,而传统的NGramTokenizerFactory
仅适用于单词的字符(并且是索引有点贵)。
我考虑过的一个选项是使用 StandardTokenizerFactory
获取前三个标记,然后创建一个 copyField
到另一个字段,该字段使用 PatternTokenizerFactory
并定义正则表达式以获取最后两个标记,但如果可能的话,我更愿意只使用一个字段来获取我需要的标记。
如果您更熟悉 ElasticSearch,我仍然想听听您的想法,因为 Solr 和 ES 之间的分词器或多或少相似,可能会把我推向正确的方向。谢谢!
Shingle Filter
:
该过滤器从令牌流中构造带状符号,它们是令牌 n-grams。它将令牌运行组合成一个令牌。
你也使用下面的属性。
maxShingleSize :
(整数,必须 >= minShigleSize,默认为 2)每个 shingle 的最大令牌数。
这是应用的字段类型。
<fieldType name="text_tokens" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.ShingleFilterFactory" maxShingleSize="3" outputUnigrams="true"/>
</analyzer>
</fieldType>
输入是:"Welcome to Apache Solr"
预期输出为:
Unigram: "Welcome", "to", "Apache", "Solr"
Bigram: "Welcome to", "to Apache", "Apache Solr"
Trigram: "Welcome to Apache", "to Apache Solr"
下面是您分享的文字分析。
输入是:Best Beat Makers