朋友我正在使用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。 在形成对时,应保持句子结构。可能会发生一个句子包含多个动词,名词,副词或形容词。
答案 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);
}