Java 名词短语抽取中的标点符号
我正在使用OpenNLP从文档中提取名词短语。在查看输出时,我发现短语组块器忽略逗号,导致名词短语组合,例如,将列表中的多个元素组合成一个短语或将句子中的两个子句组合成一个名词短语。例如:Java 名词短语抽取中的标点符号,java,nlp,opennlp,phrase,Java,Nlp,Opennlp,Phrase,我正在使用OpenNLP从文档中提取名词短语。在查看输出时,我发现短语组块器忽略逗号,导致名词短语组合,例如,将列表中的多个元素组合成一个短语或将句子中的两个子句组合成一个名词短语。例如: public class TestTokenizer { public static void main(String[] args) throws IOException { String content = "dog, cat, fish, rat"; String
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);
}
}
括号也有同样的问题:因为chunker用I-NP标记它们,所以我最终得到了包含它们的名词短语
OpenNLP文档说,“OpenNLP句子检测器可以检测标点符号是否标记句子的结尾。”因此,我有点惊讶短语检测器无法检测到使用逗号或括号来标记短语的开头或结尾。这里有我遗漏的东西吗?我是否应该使用另一种方法?我试图避免在大型语料库中逐个处理这些问题。逗号并不总是表示短语边界。例如,“鲍勃、爱丽丝和约翰去了市场”。“鲍勃”通常不被认为是一个短语。
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