package com.tistory.devyongsik.analyzer.dictionary;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.tistory.devyongsik.analyzer.DictionaryProperties;
import com.tistory.devyongsik.analyzer.dictionaryindex.SynonymDictionaryIndex;
public class DictionaryFactory {
private Logger logger = LoggerFactory.getLogger(DictionaryFactory.class);
private static DictionaryFactory factory = new DictionaryFactory();
private Map<String, List<String>> compoundDictionaryMap = new HashMap<String, List<String>>();
private Map<String, String> customNounDictionaryMap = new HashMap<String, String>();
private Map<String, String> stopWordDictionaryMap = new HashMap<String, String>();
private List<String> synonymList = new ArrayList<String>();
private Map<DictionaryType, List<String>> dictionaryMap = new HashMap<DictionaryType, List<String>>();
public static DictionaryFactory getFactory() {
return factory;
}
private DictionaryFactory() {
initDictionary();
}
private void initDictionary() {
DictionaryLoader dictionaryLoader = new DictionaryLoader();
dictionaryLoader.loadDictionaries();
}
public List<String> get(DictionaryType dictionaryType) {
return dictionaryMap.get(dictionaryType);
}
public List<String> getSynonymList() {
return synonymList;
}
public void setSynonymList(List<String> synonymList) {
this.synonymList = synonymList;
}
public Map<String, List<String>> getCompoundDictionaryMap() {
return compoundDictionaryMap;
}
public void setCompoundDictionaryMap(
Map<String, List<String>> compoundDictionaryMap) {
this.compoundDictionaryMap = compoundDictionaryMap;
}
public Map<String, String> getCustomNounDictionaryMap() {
return customNounDictionaryMap;
}
public void setCustomNounDictionaryMap(
Map<String, String> customNounDictionaryMap) {
this.customNounDictionaryMap = customNounDictionaryMap;
}
public Map<String, String> getStopWordDictionaryMap() {
return stopWordDictionaryMap;
}
public void setStopWordDictionaryMap(Map<String, String> stopWordDictionaryMap) {
this.stopWordDictionaryMap = stopWordDictionaryMap;
}
class DictionaryLoader {
public void loadDictionaries() {
DictionaryType[] dictionaryTypes = DictionaryType.values();
for(DictionaryType dictionaryType : dictionaryTypes) {
if(logger.isInfoEnabled()) {
logger.info("["+dictionaryType.getDescription()+"] "+"create wordset from file");
}
List<String> dictionary = loadDictionary(dictionaryType);
dictionaryMap.put(dictionaryType, dictionary);
}
List<String> dictionaryData = dictionaryMap.get(DictionaryType.COMPOUND);
String[] extractKey = null;
String key = null;
String[] nouns = null;
for(String data : dictionaryData) {
extractKey = data.split(":");
key = extractKey[0];
nouns = extractKey[1].split(",");
compoundDictionaryMap.put(key, Arrays.asList(nouns));
}
List<String> customNouns = dictionaryMap.get(DictionaryType.CUSTOM);
for(String noun : customNouns) {
customNounDictionaryMap.put(noun, null);
}
synonymList = dictionaryMap.get(DictionaryType.SYNONYM);
List<String> stopWords = dictionaryMap.get(DictionaryType.STOP);
for(String stopWord : stopWords) {
stopWordDictionaryMap.put(stopWord, null);
}
}
private List<String> loadDictionary(DictionaryType name) {
BufferedReader in = null;
String dictionaryFile = DictionaryProperties.getInstance().getProperty(name.getPropertiesKey());
InputStream inputStream = DictionaryFactory.class.getClassLoader().getResourceAsStream(dictionaryFile);
if(inputStream == null) {
logger.info("couldn't find dictionary : " + dictionaryFile);
inputStream = DictionaryFactory.class.getResourceAsStream(dictionaryFile);
logger.info(dictionaryFile + " file loaded.. from classloader.");
}
List<String> words = new ArrayList<String>();
try {
String readWord = "";
in = new BufferedReader( new InputStreamReader(inputStream ,"utf-8"));
while( (readWord = in.readLine()) != null ) {
words.add(readWord.trim());
}
if(logger.isInfoEnabled()) {
logger.info(name.getDescription() + " : " + words.size());
}
if(logger.isInfoEnabled()) {
logger.info("create wordset from file complete");
}
}catch(IOException e){
logger.error(e.toString());
}finally{
try {
in.close();
} catch (IOException e) {
logger.error(e.toString());
}
}
return words;
}
}
public void rebuildDictionary(DictionaryType dictionaryType) {
if(DictionaryType.CUSTOM == dictionaryType) {
List<String> customNouns = dictionaryMap.get(DictionaryType.CUSTOM);
customNounDictionaryMap.clear();
for(String noun : customNouns) {
customNounDictionaryMap.put(noun, null);
}
return;
}
if(DictionaryType.COMPOUND == dictionaryType) {
List<String> customNouns = dictionaryMap.get(DictionaryType.CUSTOM);
customNounDictionaryMap.clear();
for(String noun : customNouns) {
customNounDictionaryMap.put(noun, null);
}
}
if(DictionaryType.STOP == dictionaryType) {
List<String> stopWords = dictionaryMap.get(DictionaryType.STOP);
stopWordDictionaryMap.clear();
for(String stopWord : stopWords) {
stopWordDictionaryMap.put(stopWord, null);
}
}
if(DictionaryType.SYNONYM == dictionaryType) {
List<String> synonymWords = dictionaryMap.get(DictionaryType.SYNONYM);
SynonymDictionaryIndex indexModule = SynonymDictionaryIndex.getIndexingModule();
indexModule.indexingDictionary(synonymWords);
}
}
}