package org.ansj.library;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.ansj.app.crf.Model;
import org.ansj.app.crf.SplitWord;
import org.ansj.app.crf.model.CRFModel;
import org.ansj.dic.PathToStream;
import org.ansj.domain.KV;
import org.ansj.util.MyStaticValue;
import org.nlpcn.commons.lang.util.logging.Log;
public class CrfLibrary {
private static final Log LOG = MyStaticValue.getLog(CrfLibrary.class);
// CRF模型
private static final Map<String, KV<String, SplitWord>> CRF = new HashMap<>();
public static final String DEFAULT = "crf";
static {
for (Entry<String, String> entry : MyStaticValue.ENV.entrySet()) {
if (entry.getKey().startsWith(DEFAULT)) {
put(entry.getKey(), entry.getValue());
}
}
putIfAbsent(DEFAULT, "jar://crf.model");
}
public static SplitWord get() {
return get(DEFAULT);
}
/**
* 根据key获取crf分词器
*
* @param key
* @return crf分词器
*/
public static SplitWord get(String key) {
KV<String, SplitWord> kv = CRF.get(key);
if (kv == null) {
if (MyStaticValue.ENV.containsKey(key)) {
putIfAbsent(key, MyStaticValue.ENV.get(key));
return get(key);
}
LOG.warn("crf " + key + " not found in config ");
return null;
}
SplitWord sw = kv.getV();
if (sw == null) {
sw = initCRFModel(kv);
}
return sw;
}
/**
* 加载CRF模型
*
* @param modelPath
* @return
*/
private static synchronized SplitWord initCRFModel(KV<String, SplitWord> kv) {
try {
if (kv.getV() != null) {
return kv.getV();
}
long start = System.currentTimeMillis();
LOG.debug("begin init crf model!");
try (InputStream is = PathToStream.stream(kv.getK())) {
SplitWord crfSplitWord = new SplitWord(Model.load(CRFModel.class, is));
kv.setV(crfSplitWord);
LOG.info("load crf use time:" + (System.currentTimeMillis() - start) + " path is : " + kv.getK());
return crfSplitWord;
}
} catch (Exception e) {
LOG.error(kv + " load err " + e.getMessage());
return null;
}
}
/**
* 动态添加
*
* @param dicDefault
* @param dicDefault2
* @param dic2
*/
public static void put(String key, String path) {
put(key, path, null);
}
public static void put(String key, String path, SplitWord sw) {
CRF.put(key, KV.with(path, sw));
MyStaticValue.ENV.put(key, path);
}
/**
* 删除一个key
*
* @param key
* @return
*/
public static KV<String, SplitWord> remove(String key) {
MyStaticValue.ENV.remove(key) ;
return CRF.remove(key);
}
/**
* 刷新一个,将值设置为null
*
* @param key
* @return
*/
public static void reload(String key) {
KV<String, SplitWord> kv = CRF.get(key);
if (kv != null) {
CRF.get(key).setV(null);
}
LOG.warn("make sure ,this reload not use same obj , it to instance a new model");
}
public static Set<String> keys() {
return CRF.keySet();
}
public static void putIfAbsent(String key, String path) {
if (!CRF.containsKey(key)) {
CRF.put(key, KV.with(path, (SplitWord) null));
}
}
}