从文本中提取名词(Java)

有没有人知道从文本正文中提取名词的最简单方法?

我听说过TreeTagger工具 ,我试过试一试 ,但由于某些原因无法让它工作。

有什么建议么?

谢谢菲尔

编辑:

  import org.annolab.tt4j。*;  TreeTaggerWrapper tt = new TreeTaggerWrapper(); 试试{tt.setModel(“/ Nouns / english.par”);  tt.setHandler(new TokenHandler(){void token(String token,String pos,String lemma){System.out.println(token +“\ t”+ pos +“\ t”+ lemma);}});  tt.process(字);  // words =单词列表} finally {tt.destroy();  } 

那是我的代码,英语是语言。 我收到错误:新类型TokenHandler(){}必须实现inheritance的抽象方法TokenHandler.token。 难道我做错了什么?

首先,您必须对文本进行标记。 这可能看起来微不足道(在任何空格分裂可能对你有用)但正式情况下它更难。 然后你必须决定什么是名词。 “停车场”是否包含一个名词(停车场),两个名词(汽车,公园)或一个名词(公园)和一个形容词(汽车)? 这是一个很难的问题,但是如果没有它,你可能会再次遇到这个问题。

“我看到xyzzy”是否识别出不在字典中的名词? 单词“the”可能将xyzzy标识为名词。

“时间飞逝如箭头”中的名词在哪里? 与“像香蕉一样的果蝇”相比(感谢Groucho Marx)。

我们在OpenNLP工具包中使用Brown tagger(Java)( http://en.wikipedia.org/wiki/Brown_Corpus )( http://上的opennlp.tools.lang.english.PosTagger; opennlp.tools.postag.POSDictionary) opennlp.sourceforge.net/ )以普通英语找到名词,我建议从那开始 – 它会为你做大部分的思考。 否则,请查看任何POSTAGgers( http://en.wikipedia.org/wiki/POS_tagger )或( http://www-nlp.stanford.edu/links/statnlp.html#Taggers )。

在计算机的词性标注中,通常区分英语的50到150个单独的词性,例如,NN表示单数常用名词,NNS表示复数常用名词,NP表示单数专有名词(参见POS)布朗语料库中使用的标签)

在http://en.wikipedia.org/wiki/Natural_language_processing_toolkits中有一个非常完整的NLP工具包列表。 我强烈建议你使用其中一个,而不是试图匹配Wordnet或其他集合。

查看LingPipe 。 据说这可以从英文文本中挑选出命名实体 。 但我必须承认, NLP不是我的专业领域。

根据您的编辑:

该错误表明您必须覆盖抽象方法标记,并且您在匿名内部类中有令牌定义,但令牌覆盖的签名可能与TokenHandler中定义的抽象方法的签名不匹配?

我的以下代码适用于TreeTagger:

public List tag(String str) { final List tagLemme = new ArrayList(); String[] tokens =tokenizer.tokenize(str); System.setProperty("treetagger.home", "parametresTreeTagger/TreeTagger"); TreeTaggerWrapper tt = new TreeTaggerWrapper(); try { tt.setModel("parametresTreeTagger/english/english.par"); tt.setHandler(new TokenHandler(){ public void token(String token, String pos, String lemma) { tagLemme.add(token + "_" + pos + "_" + lemma); //System.out.println(token + "_" + pos + "_" + lemma); } }); tt.process(asList(tokens)); } catch (IOException e) { e.printStackTrace(); } catch (TreeTaggerException e) { e.printStackTrace(); } finally { tt.destroy(); } return tagLemme; } 

看看WordNet数据库。 这个词汇数据库。 您可以尝试将每个单词与其匹配,并检查它是否是名词。

我怀疑你会有100%的精确度; 数据库没有匹配英语中的每个可能的单词,但至少它是一个开始。

查找带有API(例如WS,RESTful)的字典网站,您可以使用它来运行搜索查询。

结果应该是一种易于使用的格式(例如XML,JSON),当然应该包含单词的词汇类别。

最简单的方法可能是将文本中的每个单词与名词词典进行比较。 之后,您可能需要进行一些基本解析并接受结果中的近似正确性。 很多在线引用解析自然语言。