2012-12-13 48 views
0

我试图提取使用的规则,如对文本下面提及的那些,其已经POS标签如何编写提取名词短语的高效代码?

1)NNP短语 - > NNP( - >表示随后) 2)NNP - > CC - > NNP 3)VP - > NP etc ..

我已经用这种方式编写代码了,有人能告诉我怎样才能以更好的方式做。

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提取,我怎么能概括它,这样我可以添加其他的规则了。我知道有这样的库可用来做这件事,但是想要手动做到这一点。

回答

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 ] ._. 
+0

是的。正如我之前所说的,想要手动执行而不使用这些库进行短语检测。 –

+0

是的,对不起。我没有阅读完整的问题。一旦我尝试手动做这个。我创建了一个可以识别葡萄牙语NP的有限状态机。与使用机器学习相比,结果并不好。 – wcolen

0

现有的库,实现大多数人并建立一个有限状态机来实现这个功能。他们可靠,高效和开放。然而,一个非常天真的实现想法可以是通过POS-Tag数组制定规则表达式,然后使用偏移量来标记短语。听起来合乎逻辑和简单,但可能不正确。

相关问题