我正在尝试使用下面提到的带有POS标记的文本的规则来提取短语
1)NNP - > NNP( - >表示后面跟着) 2)NNP - > CC - > NNP 3)VP - > NP 等。
我已经用这种方式编写代码,有人可以告诉我如何以更好的方式做。
List<String> nounPhrases = new ArrayList<String>();
for (List<HasWord> sentence : documentPreprocessor) {
//System.out.println(sentence.toString());
System.out.println(Sentence.listToString(sentence, false));
List<TaggedWord> tSentence = tagger.tagSentence(sentence);
String lastTag = null, lastWord = null;
for (TaggedWord taggedWord : tSentence) {
if (lastTag != null && taggedWord.tag().equalsIgnoreCase("NNP") && lastTag.equalsIgnoreCase("NNP")) {
nounPhrases.add(taggedWord.word() + " " + lastWord);
//System.out.println(taggedWord.word() + " " + lastWord);
}
lastTag = taggedWord.tag();
lastWord = taggedWord.word();
}
}
在上面的代码中,我只为NNP做了后续NNP提取,我如何推广它,以便我也可以添加其他规则。我知道有可用的库,但是想手动完成。
答案 0 :(得分:1)
也许你应该尝试使用Chunker。您可以尝试OpenNLP Chunker。看起来你对POS使用相同的标签集。你可以在这里找到用法:
http://opennlp.apache.org/documentation/1.5.2-incubating/manual/opennlp.html#tools.chunker
输入示例:
Rockwell_NNP International_NNP Corp._NNP 's_POS Tulsa_NNP unit_NN said_VBD it_PRP signed_VBD a_DT tentative_JJ agreement_NN extending_VBG its_PRP$ contract_NN with_IN Boeing_NNP Co._NNP to_TO provide_VB structural_JJ parts_NNS for_IN Boeing_NNP 's_POS 747_CD jetliners_NNS ._.
输出:
[NP Rockwell_NNP International_NNP Corp._NNP ] [NP 's_POS Tulsa_NNP unit_NN ] [VP said_VBD ] [NP it_PRP ] [VP signed_VBD ] [NP a_DT tentative_JJ agreement_NN ] [VP extending_VBG ] [NP its_PRP$ contract_NN ] [PP with_IN ] [NP Boeing_NNP Co._NNP ] [VP to_TO provide_VB ] [NP structural_JJ parts_NNS ] [PP for_IN ] [NP Boeing_NNP ] [NP 's_POS 747_CD jetliners_NNS ] ._.
答案 1 :(得分:0)
现有的大多数库实现都会创建一个有限状态机来实现此功能。它们可靠,高效且开放。然而,一个非常天真的实现思路可以是在POS-Tag数组上制定正则表达式,然后使用偏移来标记短语。听起来合乎逻辑且简单,但可能不正确。