我需要编写一个代码,将关于产品的几行注释作为输入,并根据在评论中描述该产品的形容词对产品进行评分。我刚刚使用POS标记器来标记每个评论的词性。现在,我必须选择描述名词的形容词,如果名词似乎与产品相关,则需要考虑相应的形容词。这是我用于POS标记的代码。

import java.io.*;
import edu.stanford.nlp.tagger.maxent.MaxentTagger;
public class Tagg {
public static void main(String[] args) throws IOException,
ClassNotFoundException {

String tagged;

// Initialize the tagger
MaxentTagger tagger = new MaxentTagger("edu/stanford/nlp/models/pos-tagger/wsj-        left3words/wsj-0-18-left3words-distsim.tagger");
FileInputStream fstream = new FileInputStream("src/input.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
FileWriter q = new FileWriter("src/output.txt",true);
BufferedWriter out =new BufferedWriter(q);
String sample;
//we will now pick up sentences line by line from the file input.txt and store it in the string sample
while((sample = br.readLine())!=null)
{
//tag the string
tagged = tagger.tagString(sample);
System.out.print(tagged+"\n");
//write it to the file output.txt
out.write(tagged);
out.newLine();
}
out.close();
}
}

我需要一种方法来进行。 。

最佳答案

一个简单的解决方案将使您受益匪浅,那就是使用Stanford CoreNLP随附的依赖项解析器。该算法如下所示:

  • PoS标签和依存关系解析您的句子
  • 确定您对哪些名词感兴趣。如果要处理产品评论,一种简单的方法是将文本中的所有名词与已知产品名称列表进行匹配。
  • 在依赖关系分析器的输出中查找包括您感兴趣的名词的amod关系。

  • 使用online Stanford demo的示例:

    输入:
    I own a tall glass and just bought a big red car.
    
    amod依赖项:
    amod(glass-5, tall-4)
    amod(car-12, big-10)
    amod(car-12, red-11)
    

    假设评论是关于汽车的。最后两个依赖项包含目标名词car,因此您要查找的形容词是bigred

    警告:这是高精度搜索算法,而不是高召回率。您的关键字列表将永远不会详尽无遗,因此您很可能会错过一些形容词。而且,解析器也不是完美的,有时会出错。此外,amod关系是形容词描述名词的多种方式之一。例如,"The car is red"解析为
    det(car-2, The-1)
    nsubj(red-4, car-2)
    nsubj(black-6, car-2)
    cop(red-4, is-3)
    root(ROOT-0, red-4)
    conj_and(red-4, black-6)
    

    如您所见,这里没有amod关系,只有系词和连词。您可以尝试制定更复杂的规则,以尝试提取car is redcar is black的事实。是否要这样做取决于您。以当前形式,当该算法返回形容词时,您可以确信它确实在描述名词。我认为这是一个很好的特性,但这全取决于您的用例。

    由OP评论后编辑:

    是的,I bought a new car.It is awesome.是两个单独的句子,将分别进行分析。此问题称为coreference (anaphora) resolution。事实证明,斯坦福大学也支持此功能,请参阅their webpage。还有a system by CMU,它也在Java中。我没有使用任何一个系统,但是后者有一个非常有用的在线演示。将以上两个句子放进去,我得到
    [I] bought [a new car]2 .
    [It]2 is awesome .
    

    10-08 13:16