0

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抽出に対してのみ実行しましたが、他のルールも追加できるように一般化するにはどうすればよいですか。これを行うために利用できるライブラリがあることは知っていますが、これを手動で行いたいと思いました。

4

2 に答える 2

1

多分あなたはチャンカーを使ってみるべきです。OpenNLPチャンカーを試すことができます。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 ] ._.
于 2012-12-13T11:02:06.450 に答える
0

既存のライブラリ実装の大部分は、この機能を実現するために有限状態マシンを作成します。それらは信頼性が高く、効率的で、オープンです。ただし、非常に単純な実装のアイデアは、POS-Tag 配列に対して正規表現を作成し、オフセットを使用してフレーズをマークすることです。論理的で単純に聞こえますが、正しくない場合もあります。

于 2012-12-17T06:37:14.637 に答える