我希望标记一个字符串,例如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之间的标记器或多或少是相似的,可能会将我推向正确的方向。谢谢!
发布于 2020-10-23 00:56:41
Shingle Filter:这个过滤器从令牌流构造出标记n克的标记块.它将运行的令牌组合成一个令牌。
您还可以使用下面的属性。
maxShingleSize : (整数,必须是>= minShingleSize,默认值2)每个标记的最大数目。
以下是应用的字段类型。
<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

https://stackoverflow.com/questions/64492024
复制相似问题