我正在使用 OpenNLP 从文档中提取名词短语。在查看输出时,我发现短语 chunker 忽略了逗号,从而导致名词短语将列表中的多个元素组合成一个短语或将一个句子中的两个子句组合成一个名词短语。作为一个虚拟示例:
public class TestTokenizer {
public static void main(String[] args) throws IOException {
String content = "dog, cat, fish, rat";
String[] tokens = NLPToolsControllerOpenNLP.getInstance().getTokeniser().tokenize(content);
String[] pos = NLPToolsControllerOpenNLP.getInstance().getPosTagger().tag(tokens);
String[] phrases = NLPToolsControllerOpenNLP.getInstance().getPhraseChunker().chunk(tokens, pos);
for(int i = 0; i<tokens.length; i++) {
System.out.println("Token: " + tokens[i] + " and POS: " + phrases[i]);
}
List<String> candidates = new ArrayList<String>();
String phrase = "";
for (int n = 0; n < tokens.length; n++) {
if (phrases[n].equals("B-NP")) {
phrase = tokens[n];
for (int m = n + 1; m < tokens.length; m++) {
if (phrases[m].equals("I-NP")) {
phrase = phrase + " " + tokens[m];
} else {
n = m;
break;
}
}
phrase = phrase.replaceAll("\\s+", " ").trim();
System.out.println("phrase: " + phrase);
}
}
输出:
Token: dog and POS: B-NP
Token: , and POS: I-NP
Token: cat and POS: I-NP
Token: , and POS: I-NP
Token: fish and POS: I-NP
Token: , and POS: O
Token: rat and POS: B-NP
phrase: dog , cat , fish
phrase: rat
括号有同样的问题:因为分块器用 I-NP 标记它们,我最终得到包含它们的名词短语。
OpenNLP 文档说“ OpenNLP Sentence Detector可以检测到标点符号是否标记了句子的结尾。” 因此,我有点惊讶短语检测器无法检测到使用逗号或括号来标记短语的开头或结尾。我在这里缺少什么吗?我应该使用另一种方法吗?我试图避免在大型语料库中逐个处理这些问题。