有没有人知道从文本正文中仅提取名词的最简单方法?
我听说过TreeTagger tool,我试过试一试,但由于某种原因无法让它工作。
有什么建议吗?
感谢Phil
修改
import org.annolab.tt4j.*; TreeTaggerWrapper tt = new TreeTaggerWrapper(); try { 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); // words = list of words } finally { tt.destroy(); }
这是我的代码,英语是语言。我收到错误:新类型TokenHandler(){}必须实现继承的抽象方法TokenHandler.token。我做错了吗?
答案 0 :(得分:22)
首先,您必须对文字进行标记。这可能看起来微不足道(在任何空格分裂可能对你有用)但正式情况下它更难。然后你必须决定什么是名词。 “停车场”是否包含一个名词(停车场),两个名词(汽车,公园)或一个名词(公园)和一个形容词(汽车)?这是一个很难的问题,但是如果没有它,你可能会再次遇到这个问题。
“我看到xyzzy”是否识别出不在字典中的名词? “the”这个词可能将xyzzy标识为名词。
“时光飞逝如箭头”中的名词在哪里?与“像香蕉一样的果蝇”相比(感谢Groucho Marx)。
我们使用布朗标记器(Java)的(http://en.wikipedia.org/wiki/Brown_Corpus)在OpenNLP工具包(opennlp.tools.lang.english.PosTagger; opennlp.tools.postag.POSDictionary上http://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或其他集合。
答案 1 :(得分:1)
结帐LingPipe。据说这可以从英文文本中挑选named entities。但我必须承认NLP不是我的专业领域。
答案 2 :(得分:1)
根据您的修改:
错误说您必须覆盖抽象方法标记,并且您在匿名内部类中有令牌定义,但令牌覆盖的签名可能与TokenHandler中定义的抽象方法的签名不匹配?
答案 3 :(得分:1)
我的以下代码适用于TreeTagger:
public List<String> tag(String str) {
final List<String> tagLemme = new ArrayList<String>();
String[] tokens =tokenizer.tokenize(str);
System.setProperty("treetagger.home", "parametresTreeTagger/TreeTagger");
TreeTaggerWrapper tt = new TreeTaggerWrapper<String>();
try {
tt.setModel("parametresTreeTagger/english/english.par");
tt.setHandler(new TokenHandler<String>(){
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;
}
答案 4 :(得分:0)
查看WordNet数据库。这个词汇数据库。您可以尝试将每个单词与其匹配,并检查它是否是名词。
我怀疑你会有100%的精确度;数据库没有匹配英语中每个可能的单词,但至少它是一个开始。
答案 5 :(得分:0)
最简单的方法可能是将文本中的每个单词与名词词典进行比较。之后,您可能需要进行一些基本解析并接受结果中的近似正确性。很多在线参考解析自然语言。
答案 6 :(得分:0)
使用API(例如WS,RESTful)查找字典网站,您可以使用该网站运行搜索查询。
结果应该采用易于使用的格式(例如XML,JSON),当然应该包含单词的词汇类别。