gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:04:29 24 4
gpt4 key购买 nike

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

输入句子:

相机工作良好。

相机非常好。

相机拍摄照片的速度很慢。

词性标注输出句子:

/DT 相机/NN 正常/VBZ 工作/VBN 良好/RB ./。

相机/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){}
}
}

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

名词=>相机/NN 动词=>是/VBZ 动词=>工作/VBN 副词=>好/RB

名词=>相机/NN动词=>是/VBZ副词=>非常/RB形容词=>好/JJ

名词=>相机/NN动词=>捕获/VBZNoun=>照片/NN副词=>所以/RB副词=>慢慢地/RB**

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

最佳答案

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

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

键是名词/动词等,值是单词。它允许每个键有多个值。引用here .

Guava 示例(未测试):

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

关于java - 在 Java 中存储提取的 POS 标签文本所需的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21091808/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com