在Java中存储提取的POS标记文本所需的数据结构

时间:2014-01-13 12:52:35

标签: java regex sentiment-analysis pos-tagger

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

输入句子:

相机运转良好。

相机非常好。

相机拍摄的照片非常慢。

POS标记输出语句:

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

Camera / NN是/ VBZ非常/ RB好/ JJ ./。

相机/ NN捕捉/ VBZ照片/ NN所以/ 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){}
    }
}                     

在上面的代码的帮助下,我在我所需的textarea中获得如下输出(如提取所需标签后)

Noun =&gt; camera / NN Verb =&gt;是/ VBZ Verb =&gt; working / VBN Adverb =&gt; well / RB

Noun =&gt; Camera / NN Verb =&gt;是/ VBZ Adverb =&gt; very / RB Adjective =&gt; good / JJ

Noun =&gt; Camera / NN Verb =&gt; captures / VBZNoun =&gt; photo / NN Adverb =&gt; so / RB Adverb =&gt; slow / RB **

现在我想形成一对(posword,poscategory)例如(camera,n),这样这对将被传递到sentiwordnet以便从Sentiwordnet中重新获得分数。请给我代码存储这对结构,而不会干扰句子链接或结构,以便我将它传递给sentiwordnet。 在形成对时,应保持句子结构。可能会发生一个句子包含多个动词,名词,副词或形容词。

1 个答案:

答案 0 :(得分:2)

我建议你忘记'数据结构',并考虑OO类的模型。考虑一个句子类,你想要存储一个句子以及如何存储句子。

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

键是Noun / Verb / Etc,值是单词。它允许每个键有几个值。 参考here

番石榴示例(未经测试):

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