gpt4 book ai didi

java - 带连字符的 Lucene 索引/查询策略

转载 作者:行者123 更新时间:2023-12-04 06:35:27 24 4
gpt4 key购买 nike

有许多单词被连字符或空格分隔,但通常用作一个单词。
例如:篮球或篮球可以写成篮球。

现在当我索引为句子时,说:"Hey dude, I played basket ball yesterday".现在我尝试查询 "basketball" [没有双引号]..

在这种情况下,或者反之亦然,(索引 basketball 和查询 basket ball )我不会得到任何结果。有没有办法直接或间接解决这个问题?
Edit:我举的例子只是为了说明问题。在我的实际应用场景中,我将索引和搜索 ID。
如果我索引:011 12345,
我应该可以使用 01112345 查询它。

提前致谢。

最佳答案

连字符不是这里的问题,假设您使用的是诸如连字符之类的标记的 StandardTokenizer 之类的东西,那么搜索“basket ball”的用户将匹配原始文本“Basket-Ball”(以及vica-versa),所以没有有问题。

问题是在两个词和一个词等价物之间进行,例如“篮球”和“篮球”。你基本上需要处理同义词 (例如夹克/外套或在您的情况下篮球/“篮球”)。

您可以通过自己创建等效单词列表或使用像 WordNet 这样的字典来克服这个问题。 ,并用每个术语的同义词补充索引或搜索。 Solr 有一个 SynonymFilter您可能可以利用(另请参阅 here )。

编辑:

这是我不久前写的一个非常基本的同义词过滤器的代码。同义词没有具体化,但您可以轻松地自己添加。

public class SynonymFilter extends TokenFilter {
private static final Logger log = Logger.getLogger(SynonymFilter.class);

private Stack<Token> synStack = new Stack<Token>();

static CharArrayMap<String[]> synLookup = new CharArrayMap<String[]>(5, true);
static {
synLookup.put("basketball".toCharArray(), new String[]{"basket ball"});
synLookup.put("trainer".toCharArray(), new String[]{"sneaker"});
synLookup.put("burger".toCharArray(), new String[]{"hamburger"});
synLookup.put("bike".toCharArray(), new String[]{"bicycle", "cycle"});
}

// TODO reverse map all the syns to each other e.g. sneaker to trainer

protected SynonymFilter(TokenStream input) {
super(input);
}

@Override
public Token next(Token reusableToken) throws IOException {
if (synStack.size() > 0)
return synStack.pop();

Token nextToken = input.next(reusableToken);
if (nextToken != null) {
addSynonyms(nextToken);
}

return nextToken;
}

private void addSynonyms(Token nextToken) {
char[] word = Arrays.copyOf(nextToken.termBuffer(), nextToken.termLength());
String[] synonyms = synLookup.get(word);
if (synonyms != null) {
for (String s : synonyms) {
if (!equals(word, s)) {
char[] chars = s.toCharArray();
Token synToken = new Token(chars, 0, chars.length, nextToken.startOffset(), nextToken.endOffset());
synToken.setPositionIncrement(0);
synStack.add(synToken);
log.info("Found synonym: " + s + " for: " + new String(nextToken.term()));
}
}
}
}

public static boolean equals(char[] word, String subString) {
return equals(word, word.length, subString);
}

public static boolean equals(char[] word, int len, String subString) {

if (len != subString.length())
return false;

for (int i = 0 ; i < subString.length(); i++) {
if (word[len - i - 1] != subString.charAt(subString.length() - i - 1))
return false;
}

return true;

}
}

关于java - 带连字符的 Lucene 索引/查询策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4931589/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com