Java 我如何将文本中的一个单词按名称、数字、金钱、日期等分类?
一周前我问了一些关于文本挖掘的问题,但我还是有点困惑,但现在我知道了我想做的事情 情况:我有很多包含HTML内容的下载页面。例如,其中一些可以是来自博客的文本。它们不是结构化的,来自不同的站点 我想做什么:我将用空格分割所有单词,并将每个单词或一组单词分类到一些预定义的iten中,如姓名、号码、电话、电子邮件、url、日期、货币、温度等 我知道的:我知道关于自然语言处理的概念/听说过,命名实体再迁移器,Postaging,NayveBayesian,HMM,训练和很多分类的事情,等等,但是有一些不同的NLP库,有不同的分类器和方法,我不知道它们有什么用途或做什么 我需要什么:我需要一些来自分类器的代码示例,NLP,不管什么,它可以分别对文本中的每个单词进行分类,而不是对整个文本进行分类。大概是这样的:Java 我如何将文本中的一个单词按名称、数字、金钱、日期等分类?,java,nlp,classification,text-mining,named-entity-recognition,Java,Nlp,Classification,Text Mining,Named Entity Recognition,一周前我问了一些关于文本挖掘的问题,但我还是有点困惑,但现在我知道了我想做的事情 情况:我有很多包含HTML内容的下载页面。例如,其中一些可以是来自博客的文本。它们不是结构化的,来自不同的站点 我想做什么:我将用空格分割所有单词,并将每个单词或一组单词分类到一些预定义的iten中,如姓名、号码、电话、电子邮件、url、日期、货币、温度等 我知道的:我知道关于自然语言处理的概念/听说过,命名实体再迁移器,Postaging,NayveBayesian,HMM,训练和很多分类的事情,等等,但是有一些
//This is pseudo-code for what I want, and not a implementation
classifier.trainFromFile("file-with-train-words.txt");
words = text.split(" ");
for(String word: words){
classifiedWord = classifier.classify(word);
System.out.println(classifiedWord.getType());
}
有人能帮我吗?我对各种API、分类器和算法感到困惑。这个问题是来自不同领域的几个想法的交叉点。您提到命名实体识别,这是一个。但是,您可能会看到(名词、名称等)和(数字、电话号码、电子邮件)的混合
不幸的是,这样做并使其在实际工作数据上工作需要一些努力,而不是像使用这个或那个API那样简单。这个问题是来自不同领域的几个想法的交叉点。您提到命名实体识别,这是一个。但是,您可能会看到(名词、名称等)和(数字、电话号码、电子邮件)的混合
不幸的是,这样做并使其在实际工作数据上工作需要一些努力,而且不像使用这个或那个API那么简单。您可以使用命名实体识别器(NER)方法完成此任务,我强烈建议您查看并使用任务模块中的
NER
功能。你可以把你的句子分解成记号,然后把它们传递给斯坦福大学的NER系统。
我认为斯坦福核心NLP页面有很多例子可以帮助你,如果你需要玩具代码,请告诉我
下面是示例代码这只是整个代码的一个片段:
// creates a StanfordCoreNLP object, with NER
Properties props = new Properties();
props.put("annotators", "ner");
StanfordCoreNLP pipeline = new StanfordCoreNLP(props);
classifier.trainFromFile("file-with-train-words.txt");
words = text.split(" ");
for(String word: words){
Annotation document = new Annotation(word);
pipeline.annotate(document);
System.out.println(Annotation);
}
您可以使用命名实体识别器(NER)方法执行此任务,我强烈建议您查看并使用任务模块中的
NER
功能。你可以把你的句子分解成记号,然后把它们传递给斯坦福大学的NER系统。
我认为斯坦福核心NLP页面有很多例子可以帮助你,如果你需要玩具代码,请告诉我
下面是示例代码这只是整个代码的一个片段:
// creates a StanfordCoreNLP object, with NER
Properties props = new Properties();
props.put("annotators", "ner");
StanfordCoreNLP pipeline = new StanfordCoreNLP(props);
classifier.trainFromFile("file-with-train-words.txt");
words = text.split(" ");
for(String word: words){
Annotation document = new Annotation(word);
pipeline.annotate(document);
System.out.println(Annotation);
}
你应该试试。它易于使用和定制
如果您是为葡萄牙语编写的,那么在使用Amazonia语料库的项目文档中会有关于如何编写葡萄牙语的信息。支持的类型包括:
人、组织、团体、地点、事件、艺术品、摘要、事物、时间和数字
amazonia.ad
复制到apache-opennlp-1.5.1-incubating
文件夹中bin/opennlp TokenNameFinderConverter ad -encoding ISO-8859-1 -data amazonia.ad -lang pt > corpus.txt
amazonia.ad
复制到apache-opennlp-1.5.1-incubating
文件夹中bin/opennlp TokenNameFinderConverter ad -encoding ISO-8859-1 -data amazonia.ad -lang pt > corpus.txt
您必须创建用于提取和检测每种数据类型及其错误的特定函数 或作为其众所周知的名称面向对象的方式。 也就是说,为了检测货币,我们要做的是在开头或结尾检查美元符号,并检查是否有附加的非数字字符,这意味着错误 你应该用你的思想写下你已经在做的事情。如果你遵守规则就没那么难了。 机器人学/人工智能有3条黄金法则:
InputStream modelIn = new FileInputStream("pt-ner.bin");
try {
TokenNameFinderModel model = new TokenNameFinderModel(modelIn);
}
catch (IOException e) {
e.printStackTrace();
}
finally {
if (modelIn != null) {
try {
modelIn.close();
}
catch (IOException e) {
}
}
}
// load the name finder
NameFinderME nameFinder = new NameFinderME(model);
// pass the token array to the name finder
String[] toks = {"Meu","nome","é","João","da","Silva",",","moro","no","Brasil",".","Trabalho","na","Petrobras","e","tenho","50","anos","."};
// the Span objects will show the start and end of each name, also the type
Span[] nameSpans = nameFinder.find(toks);
bin/opennlp TokenNameFinderCrossValidator -lang pt -encoding UTF-8 -data corpus.txt -cutoff 20