2013-06-22 49 views
2

我需要编写一段代码,对产品进行几行评论作为输入,并根据描述评论中产品的形容词对产品进行评分。我刚刚使用POS tagger来标记每条评论的词性。现在,我必须选出描述名词的形容词,如果名词似乎与产品有关,我需要考虑相应的形容词。这是我用于POS标记的代码。它只是正常工作。查找使用斯坦福大学NLP描述名词的形容词

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

我需要一种方法来继续。 。

+0

请不要使用DataInputStream来读取文本,也请从您的示例中删除它,这个不好的想法经常被复制。 http://vanillajava.blogspot.co.uk/2012/08/java-memes-which-refuse-to-die.html –

回答

5

一个简单的解决方案可以帮助您获得更长的使用方式,即使用斯坦福CoreNLP附带的依赖解析器。该算法是这样的:

  1. 词类标记和依赖解析你的句子
  2. 决定你是该名词的兴趣。如果你正在处理的产品评论,这样做的一个简单的方法就是使所有在文本中的名词与已知产品名称的列表进行比较。
  3. 寻找在依赖解析器,其中包括您有兴趣的名词输出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 . 
+0

优秀!所以,你在说,我从“我买了一辆新车”中选出了“真棒”。这真棒“有点困难,我应该为此工作? – venkatKA

+1

请参阅编辑后。 – mbatchkarov

+0

感谢一群人..这真的有帮助 – venkatKA