CoreNLP是由斯坦福大学开源的一套Java NLP工具,提供诸如:词性标注(part-of-speech (POS) tagger)、命名实体识别(named entity recognizer (NER))、情感分析(sentiment analysis)等功能。
【开源中文分词工具探析】系列:
1. 前言
CoreNLP的中文分词基于CRF模型:
\[
P_w(y|x) = \frac{exp \left( \sum_i w_i f_i(x,y) \right)}{Z_w(x)}
\]
其中,\(Z_w(x)\)为归一化因子,\(w\)为模型的参数,\(f_i(x,y)\)为特征函数。
2. 分解
以下源码分析基于3.7.0版本,分词示例见SegDemo类。
模型
主要模型文件有两份,一份为词典文件dict-chris6.ser.gz:
// dict-chris6.ser.gz 对应于长度为7的Set数组词典
// 共计词数:0+7323+125336+142252+82139+26907+39243
ChineseDictionary::loadDictionary(String serializePath) {
Set[] dict = new HashSet[MAX_LEXICON_LENGTH + 1];
for (int i = 0; i <= MAX_LEXICON_LENGTH; i++) {
dict[i] = Generics.newHashSet();
}
dict = IOUtils.readObjectFromURLOrClasspathOrFileSystem(serializePath);
return dict;
}
词典的索引值为词的长度,比如第0个词典中没有词,第1个词典为长度为1的词,第6个词典为长度为6的词。其中,第6个词典为半成词,比如,有词“《双峰》(电”、“80年国家领”、“1824年英”。
另一份为CRF训练模型文件/ctb.gz:
CRFClassifier::loadClassifier(ObjectInputStream ois, Properties props) {
Object o = ois.readObject();
if (o instanceof List) {
labelIndices = (List>) o; // label索引
}
classIndex = (Index) ois.readObject(); // 序列标注label
featureIndex = (Index) ois.readObject(); // 特征
flags = (SeqClassifierFlags) ois.readObject(); // 模型配置
Object featureFactory = ois.readObject(); // 特征模板,用于生成特征
else if (featureFactory inst