1

朋友们,我正在使用 AANV(形容词-副词-名词-动词)方法进行情感分析,作为我 BE 的最后一年项目。在这个项目中,我已经完成了 POS 标记,我正在使用 stanford POS Tagger 进行相同的操作,它给了我适当的结果。例如,假设对于以下句子,它给我的输出如下:

输入句子:

相机工作得很好。

相机非常好。

相机拍摄照片如此缓慢。

POS 标记输出句子:

/DT相机/NN是/VBZ工作/VBN好/RB./。

相机/NN是/VBZ很/RB好/JJ./。

相机/NN 捕捉/VBZ 照片/NN so/RB 慢/RB ./.

如上所述,带有 pos 标记的输出句子,其中我只需要提取形容词、副词、名词、动词及其 POS 类别。为了获得 AANV,我使用正则表达式并写下以下代码:

private void btnShowTagActionPerformed(java.awt.event.ActionEvent evt) {                                           
    Pattern NounPat=Pattern.compile("[A-Za-z]+/NN");
    Pattern AdvPat=Pattern.compile("[A-Za-z]+/RB");
    Pattern AdjPat=Pattern.compile("[A-Za-z]+/JJ");
    Pattern VerbPat=Pattern.compile("[A-Za-z]+/VB.");
    String StrToken;
    Matcher mat;
    StringTokenizer PosToken;
    String TempStr;  
    int j;
    for(int line=0;line<SAPosTagging.tagedReview.length;line++)
    {
       try{

       PosToken=new StringTokenizer(SAPosTagging.tagedReview[line]);
       while(PosToken.hasMoreTokens())
       {
           StrToken=PosToken.nextToken();
           mat=NounPat.matcher(StrToken);
           if(mat.matches())
           {
               TempStr=StrToken;
               txtareaExTagText.append("Noun=>"+StrToken);   //textarea to be appended
               j=TempStr.indexOf("/");
               TempStr=TempStr.substring(0,j);
               System.out.print("\tNoun=>"+TempStr);
           }
           mat=VerbPat.matcher(StrToken);
           if(mat.matches())
           {

               txtareaExTagText.append("\tVerb=>"+StrToken);
               TempStr=StrToken;
               j=TempStr.indexOf("/");
               TempStr=TempStr.substring(0,j);
               System.out.print("\tVerb=>"+TempStr);

           }
           mat=AdvPat.matcher(StrToken);
           if(mat.matches())
           {

               txtareaExTagText.append("\tAdverb=>"+StrToken);
               TempStr=StrToken;
               j=TempStr.indexOf("/");
               TempStr=TempStr.substring(0,j);
               System.out.print("\tAdVerb=>"+TempStr);

           }
           mat=AdjPat.matcher(StrToken);
           if(mat.matches())
           {

              txtareaExTagText.append("\tAdjective=>"+StrToken);
               TempStr=StrToken;
               j=TempStr.indexOf("/");
               TempStr=TempStr.substring(0,j);
               System.out.print("\tAdjective=>"+TempStr);

           }  
       }
       System.out.println();
       txtareaExTagText.append("\n\n");
      }catch(Exception e){}
    }
}                     

借助上面的代码,我在所需的文本区域中得到如下输出(即在提取所需的标签后)

名词=>camera/NN 动词=>is/VBZ 动词=>worked/VBN 副词=>well/RB

名词=>照相机/NN 动词=>is/VBZ 副词=>very/RB 形容词=>good/JJ

名词=>Camera/NN动词=>captures/VBZ名词=>photo/NN副词=>so/RB副词=>slowly/RB**

现在我想将该对形成为 (posword,poscategory) 例如 (camera,n) 以便将这对传递给 sentiwordnet 以便从 Sentiwordnet 检索分数。请给我存储此对结构的代码,而不会干扰句子链接或结构,以便我将其传递给 sentiwordnet。结对时,应保持句子结构。一个句子可能包含多个动词、名词、副词或形容词。

4

1 回答 1

2

我建议您忘记“数据结构”并考虑 OO 类对其进行建模。考虑一个 Sentence 类,你想存储一个句子的什么内容以及如何存储 Sentences。

如果您坚持使用“通用”数据结构,您可以使用 List,其中每个元素代表一个带有 Guava 的 Multimap 类型的句子。

键是名词/动词/等,值是单词。它允许每个键有多个值。参考这里

番石榴示例(未测试):

List<Multimap<String, String>> sentenceList = new ArrayList<>();
for (String line: lines) {
   Multimap<String, String> aux = ArrayListMultimap.create();
   PosToken=new StringTokenizer(SAPosTagging.tagedReview[line]);
   while(PosToken.hasMoreTokens()) {
       // TODO ...
       strToken=PosToken.nextToken();
       // TODO, lets assume it is a noun
       aux.put("noun", strToken);
       // TODO, etc.
   }
  sentenceList.add(aux);
}

OO 示例(未测试):

public class Sentence {
    private List<String> nouns = new ArrayList<>;
    private List<String> verbs = new ArrayList<>;
    // TODO Adverbs, etc.
    public List<String> getNons() { return nouns; };
    // TODO Other getters, etc.
}

List<Sentence> sentenceList = new ArrayList<>();
for (String line: lines) {
   Sentence aux = new Sentence();
   PosToken=new StringTokenizer(SAPosTagging.tagedReview[line]);
   while(PosToken.hasMoreTokens()) {
       // TODO ...
       strToken=PosToken.nextToken();
       // TODO, lets assume it is a noun
       aux.getNouns().add(strToken);
       // TODO, etc.
   }
  sentenceList.add(aux);
}
于 2014-01-13T13:10:07.560 回答