代码之家  ›  专栏  ›  技术社区  ›  Graham S.

Solr-如何以复合“word-1,word-1+word-2,word-1+word-2…word-n”的方式标记字符串中的单词?

  •  0
  • Graham S.  · 技术社区  · 3 年前

    我想标记一个字符串,例如 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" 因为我只想以复合方式对单词进行标记(例如单词1、单词1+单词2、单词1+单词2+单词3等),而不是组合(例如单词1-单词1+单词2-单词2+单词3-等)。

    目前,我只能使用以下方式生成前三个令牌 StandardTokenizerFactory ClassicTokenizerFactory 和传统 NGramTokenizerFactory 仅适用于单词的字符(索引有点贵)。

    我考虑过的一个选择是使用 标准化令牌工厂 获取前三个令牌,然后创建 copyField 到另一个使用 PatternTokenizerFactory 定义了一个正则表达式来获取最后两个令牌,但如果可能的话,我更愿意只使用一个字段来获取所需的令牌。

    如果你更熟悉ElasticSearch,我仍然想听听你的想法,因为Solr和ES之间的标记器或多或少是相似的,可能会把我推向正确的方向。谢谢!

    0 回复  |  直到 3 年前
        1
  •  2
  •   Abhijit Bashetti    3 年前

    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

    image