/**
* @version $Id: LabelDic.java 1839 2014-04-16 02:33:51Z yukihiro-kinjyo $
*
* 2011/09/14 02:10:11
* @author imai-yoshikazu
*
* Copyright 2011-2014 TIDAコンソーシアム All Rights Reserved.
*/
package com.tida_okinawa.corona.correction.parsing.impl;
import java.util.ArrayList;
import java.util.List;
import com.tida_okinawa.corona.correction.common.ListMap;
import com.tida_okinawa.corona.io.model.dic.ILabel;
import com.tida_okinawa.corona.io.model.dic.ILabelDic;
import com.tida_okinawa.corona.io.model.dic.ITerm;
/**
* ラベルパターン照合用
*
* @author imai
*
*/
public class LabelDic {
/**
* 原形 => ITerm
*/
ListMap<String, ITerm> termMap = new ListMap<String, ITerm>();
/**
* ITerm => ILabel
*/
ListMap<ITerm, ILabel> labelMap = new ListMap<ITerm, ILabel>();
/**
* ラベル辞書を登録
*
* @param dic
*/
public void addDic(ILabelDic dic) {
addDic(dic.getItems());
}
/**
* ラベル辞書を登録
*
* @memo 子ラベルを考慮
*
* @param list
*/
private void addDic(List<?> list) {
for (Object item : list) {
ILabel labelItem = (ILabel) item;
// 用語チェック
if (labelItem.getTerms() != null) {
boolean hitTermMap = false;
for (ITerm term : labelItem.getTerms()) {
// inactiveのチェック
if (term.isInActive()) {
continue;
}
List<ITerm> tlist = termMap.get(term.getValue());
if (tlist != null && tlist.size() > 0) {
for (ITerm t : tlist) {
// 同一の用語がすでに登録済み
if (t == term) {
hitTermMap = true;
break;
}
}
}
if (!hitTermMap) {
// 原形 => ITerm
termMap.add(term.getValue(), term);
}
// ITerm => ILabel
labelMap.add(term, labelItem);
}
}
// 子ラベルチェック
if (labelItem.getChildren() != null) {
addDic(labelItem.getChildren());
}
}
}
/**
* 原形に該当するラベルの一覧
*
* @param base
* @return
*/
List<ILabel> getLabels(String base) {
List<ILabel> labels = new ArrayList<ILabel>();
List<ITerm> terms = getTerms(base);
if (terms != null) {
for (ITerm term : terms) {
labels.addAll(getLabels(term));
}
}
return labels;
}
/**
* 原形に該当する品詞の候補
*
* @param base
* @return null: 該当なし
*/
List<ITerm> getTerms(String base) {
return termMap.get(base);
}
/**
* 品詞に該当するラベルの一覧
*
* @param term
* @return
*/
List<ILabel> getLabels(ITerm term) {
List<ILabel> allLabels = new ArrayList<ILabel>();
List<ILabel> labels = labelMap.get(term);
if (labels != null) {
allLabels.addAll(labels);
}
return allLabels;
}
}