2

スタンフォードの NLP postagger を使用して、プログラム内の名詞、形容詞にタグを付けました。

    interest_NN 
    bui_NNS 
    ground_VBP
     avail_NN 
    respond_NN
     detail_NN 
    like_IN 
    quickli_NNS
    current_JJ 

ここで、タグ _NN、_NNS、_JJ を持つ単語のみを選択し、これらのタグを単語から削除する必要があります。

    quickli
    current
    avail

このようにして、単語から -NN タグを削除してみました。しかし、最初の 2words タグを削除し、例外を取得しました

           while(tagread.hasNext())
           {
        String s=tagread.next();

        int flag=1;
        jTextArea2.append("\n" +s.toLowerCase());


        String ofInterest2 = s.substring(0, s.indexOf("_NN"));


         for(int i=0;i<s.length();i++){
             if(s.equals(ofInterest2))
                 {
                 flag=0;
                 }
         }
         if(flag!=0)
         {
             System.out.println(ofInterest2);

         }
    }

例外:

 java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.substring(Unknown Source)

では、私のアプローチの何が問題なのですか?またはさらに進める方法は?

4

3 に答える 3

0

文字列メソッドを使用してタグ付けテキストを削除しないでください。NLP の API を使用して、比較のために品詞を抽出します。

オブジェクトの を生成し、TaggedWord API を使用してList品詞を直接抽出します。TaggedWord

// Call the API to parse your sentence.
List<TaggedWord> words = tagger.tagSentence( ... );

// For each word tagged in the sentence...
for( TaggedWord word : words ) {
  String tag = word.tag();

  // Check the part-of-speech directly, without having to parse the string.
  if( "NN".equalsIgnoreCase( tag ) ) {
    System.out.printf( "%s is a noun\n", word.word() );
  }
}

Stanford の NLP API も参照してください。

名詞をチェックするには、次のことを避ける必要があります。

if( "NN".equalsIgnoreCase( tag ) ) {
  System.out.printf( "%s is a noun\n", word.word() );
}

これは、品詞がさまざまな方法でタグ付けできるためです (例: NN、NNS)。正規表現またはstartsWith.

の作成者TaggedWordisNoun. isVerbisNounPluralおよびその他のそのような方法。そうは言っても、正規表現を使用して文字列を一致させることができます。startsWith正規表現よりも高速であるため、名詞のチェックにもコードで使用しています。例えば:

if( tag != null && tag.toUpperCase().startsWith( "NN" ) ) {
  System.out.printf( "%s is a noun\n", word.word() );
}

真のオブジェクト指向にするには、TaggedWord のサブクラスを挿入して、タガーが使用できるようにします。サブクラスはisNounメソッドを公開します。

于 2013-03-08T23:02:05.863 に答える
0

indexOf指定した引数が文字列内に見つからない場合、-1 を返します。この行で:

String ofInterest2 = s.substring(0, s.indexOf("_NN"));

s.indexOfおそらく文字列に「_NN」が見つかりませんでしたs。次に、0to -1of s の部分文字列を要求すると、それは意味をなさないため、例外が発生します。

于 2013-03-08T23:03:50.003 に答える
0

テキスト「ground_VBP」全体の部分文字列を取得しようとしていますが、s.indexOf("_NN"). 部分文字列が見つからないため、 が返されます-1。しかし、関数-1への有効なインデックスではないため、報告した をスローしました。substringsubstringStringIndexOutOfBoundsException

indexOfメソッドが 0 以上を返す場合 (つまり、見つかった場合) にのみ部分文字列を取得する必要があります。

于 2013-03-08T23:04:09.197 に答える