我正在使用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
括号有同样的问题:因为chunker用I-NP标记它们,我最终得到包含它们的名词短语。
OpenNLP文档说&#34; OpenNLP句子检测器可以检测到标点符号是否标记了句子的结尾。&#34;因此,我有点惊讶的是,短语检测器无法检测到使用逗号或括号来标记短语的开头或结尾。这里有什么我想念的吗?我应该使用另一种方法吗?我试图避免在大型语料库中逐案处理这些问题。