[Arirang Analyzer - lucene 6.5.0] Term startOffset 정렬 오류
ITWeb/검색일반 2017. 6. 9. 10:23[arirang-analyzer-6.5.0]
term analyzed 시 startOffset 정보에 대한 정렬이 역전 되는 오류
개별 term 에서의 startOffset 이 역전 되기 때문에 아래 class 의 method 에서 정렬을 다시 맞춰줍니다.
(정상적인 방법 이라기 보다는 일단 문제를 회피하기 위한 방법 입니다.)
Class : KoreanFilter
Method 1 :
private void analysisKorean(String input) throws MorphException {
// input = trimHangul(input);
List<AnalysisOutput> outputs = morph.analyze(input);
if (outputs.size() == 0) {
return;
}
Map<String, KoreanToken> map = new LinkedHashMap<String, KoreanToken>();
if (hasOrigin) {
map.put("0:" + input, new KoreanToken(input, offsetAtt.startOffset()));
}
extractKeyword(outputs, offsetAtt.startOffset(), map, 0);
Collection<KoreanToken> values = map.values();
for (KoreanToken kt : values) {
kt.setOutputs(outputs);
}
// 이 부분에서 map 에 등록된 정보를 정렬 합니다.
morphQueue.addAll(map.values());
}
Method 2 :
private void analysisKorean(String input) throws MorphException {
// input = trimHangul(input);
List<AnalysisOutput> outputs = morph.analyze(input);
if (outputs.size() == 0) {
return;
}
Map<String, KoreanToken> map = new LinkedHashMap<String, KoreanToken>();
if (hasOrigin) {
map.put("0:" + input, new KoreanToken(input, offsetAtt.startOffset()));
}
extractKeyword(outputs, offsetAtt.startOffset(), map, 0);
Collection<KoreanToken> values = map.values();
for (KoreanToken kt : values) {
kt.setOutputs(outputs);
}
morphQueue.addAll(map.values());
// 이 부분에서 morphQueue 에 등록된 정보를 정렬 합니다.
morphQueue.sort(Comparator.comparingInt(KoreanToken::getOffset));
}
Method 3 :
protected void extractKeyword(List<AnalysisOutput> outputs, int startoffset,
final Map<String, KoreanToken> map, int position) {
... 원본 코드 생략
// 이 부분에서 map 에 대한 등록된 정보를 정렬 합니다.
}
정렬 방법 :
참고) https://stackoverflow.com/questions/109383/sort-a-mapkey-value-by-values-java
final List<Map.Entry<String, KoreanToken>> offsetSorts = map.entrySet().stream()
.sorted(Map.Entry.comparingByValue(Comparator.comparingInt(KoreanToken::getOffset)))
.collect(Collectors.toList());
map.clear();
offsetSorts.stream().forEachOrdered(e -> map.put(e.getKey(), e.getValue()));
Method 4 :
KoreanFilter 를 상속받아 CustomKoreanFilter 를 만들어 사용 하면 됩니다.