gpt4 book ai didi

java - Lucene 错误匹配

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

我有一个 csv 文件

 id|name
1|PC
2|Activation
3|USB

public class TESTResult
{
private Long id;
private String name;
private Float score;
// with setters & getters
}


public class TEST
{
private Long id;
private String name;

// with setters & getters
}

public class JobTESTTagger {
private static Version VERSION;
private static CharArraySet STOPWORDS;
private static RewriteMethod REWRITEMETHOD;
private static Float MINSCORE = 0.0001F;
static {
BooleanQuery.setMaxClauseCount(100000);
VERSION = Version.LUCENE_44;
STOPWORDS = StopAnalyzer.ENGLISH_STOP_WORDS_SET;
REWRITEMETHOD = MultiTermQuery.CONSTANT_SCORE_FILTER_REWRITE;
}

public static ArrayList<TESTResult> searchText(String text, String keyId,
List<TEST> TESTs) {
ArrayList<TESTResult> results = new ArrayList<TESTResult>();
MemoryIndex index = new MemoryIndex();
EnglishAnalyzer englishAnalyzer = new EnglishAnalyzer(VERSION,STOPWORDS);
QueryParser parser = new QueryParser(VERSION, "text", englishAnalyzer);

parser.setMultiTermRewriteMethod(REWRITEMETHOD);
index.addField("text", text, englishAnalyzer);
for (int i = 0; i < TESTs.size(); i++) {
TEST TEST = TESTs.get(i);
String criteria = "\"" + TEST.getName().trim() + "\"";
if (criteria == null || criteria.isEmpty())
continue;

criteria = criteria.replaceAll("\r", " ");
criteria = criteria.replaceAll("\n", " ");

try {
Query query = parser.parse(criteria);
Float score = index.search(query);
if (score > MINSCORE) {
int result = new TESTResult(TEST.getId(), TEST.getName(),score);
results.add(result);
}

} catch (ParseException e) {
System.out.println("Could not parse article.");
}
}
return results;
}

public static void main(String[] args) {
ArrayList<TESTResult> testresults = searchText(text, keyId, iths);
CsvReader reader = new CsvReader("C:\a.csv");
reader.setDelimiter('|');
reader.readHeaders();

List<TEST> result = new ArrayList<TEST>();
while (reader.readRecord()) {
Long id = Long.valueOf(reader.get("id").trim());
String name = reader.get("name").trim();
TEST concept = new TEST(id, name);
result.add(concept);
}

String text = "这些 Activity 很好。我家里有一台很好的电脑。"; }

我正在将“Activity ”与“激活”相匹配。这怎么可能。谁能告诉我 Lucene 如何匹配这些单词。

谢谢

最佳答案

EnglishAnalyzer 以及大多数特定于语言的分析器使用 a stemmer 。这意味着它将术语简化为术语的词干(或根),以便尝试更宽松地匹配。大多数情况下,这种方法效果很好,可以删除后缀并将派生词与公共(public)词根相匹配。因此,当我搜索“鱼”时,我还会找到“fished”、“fishing”和“fishes”。

但在这种情况下,“activities”和“activation”都归结为“activ”的根,从而产生您所看到的匹配项。另一个例子:“organ”、“organic”和“organize”都有共同的词干“organ”。

你可以阻止也可以不阻止,这两种方法都不是完美的。如果你不阻止,你就会错过相关结果。如果这样做,您会得到一些奇怪的、不相关的结果。

为了处理特定的有问题的情况,您可以在 EnglishAnalyzer 中定义词干分析器排除集,以防止仅针对这些特定的有问题的术语进行词干分析。在这种情况下,我认为“激活”是防止阻塞的可能术语,尽管您可以采用任何一种方式。所以我可以做这样的事情:

CharArraySet stemExclusionSet = new CharArraySet(VERSION, 1, true);
stemExclusionSet.add("activation");
EnglishAnalyzer englishAnalyzer = new EnglishAnalyzer(VERSION, STOPWORDS, stemExclusionSet);

关于java - Lucene 错误匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23484652/

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