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 提取词性进行比较。

生成一个对象ListTaggedWord然后使用TaggedWord API直接提取词性:

// 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() );
  }
}

另请参阅斯坦福的 NLP API:

要检查名词,您应该避免以下情况:

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

这是因为词性可以以多种方式标记(例如,NN、NNS)。您可以使用正则表达式或startsWith.

您应该要求作者TaggedWord提供一个isNoun. isVerbisNounPlural以及其他类似的方法。也就是说,是的,您可以使用正则表达式来匹配字符串。我还在startsWith我的代码中使用来检查名词,因为它比正则表达式更快。例如:

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

要真正实现 OO,请注入 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不是substring函数的有效索引,所以substring扔了StringIndexOutOfBoundsException你报告的。

indexOf如果方法返回 0 或更大的值(即找到),您应该只使用子字符串。

于 2013-03-08T23:04:09.197 回答