Java 我如何将文本中的一个单词按名称、数字、金钱、日期等分类?

Java 我如何将文本中的一个单词按名称、数字、金钱、日期等分类?,java,nlp,classification,text-mining,named-entity-recognition,Java,Nlp,Classification,Text Mining,Named Entity Recognition,一周前我问了一些关于文本挖掘的问题,但我还是有点困惑,但现在我知道了我想做的事情 情况:我有很多包含HTML内容的下载页面。例如,其中一些可以是来自博客的文本。它们不是结构化的,来自不同的站点 我想做什么:我将用空格分割所有单词,并将每个单词或一组单词分类到一些预定义的iten中,如姓名、号码、电话、电子邮件、url、日期、货币、温度等 我知道的:我知道关于自然语言处理的概念/听说过,命名实体再迁移器,Postaging,NayveBayesian,HMM,训练和很多分类的事情,等等,但是有一些

一周前我问了一些关于文本挖掘的问题,但我还是有点困惑,但现在我知道了我想做的事情

情况:我有很多包含HTML内容的下载页面。例如,其中一些可以是来自博客的文本。它们不是结构化的,来自不同的站点

我想做什么:我将用空格分割所有单词,并将每个单词或一组单词分类到一些预定义的iten中,如姓名、号码、电话、电子邮件、url、日期、货币、温度等

我知道的:我知道关于自然语言处理的概念/听说过,命名实体再迁移器,Postaging,NayveBayesian,HMM,训练和很多分类的事情,等等,但是有一些不同的NLP库,有不同的分类器和方法,我不知道它们有什么用途或做什么

我需要什么:我需要一些来自分类器的代码示例,NLP,不管什么,它可以分别对文本中的每个单词进行分类,而不是对整个文本进行分类。大概是这样的:

//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语料库的项目文档中会有关于如何编写葡萄牙语的信息。支持的类型包括:

人、组织、团体、地点、事件、艺术品、摘要、事物、时间和数字

  • 下载OpenNLP和。同时提取并将文件
    amazonia.ad
    复制到
    apache-opennlp-1.5.1-incubating
    文件夹中

  • 执行TokenNameFinderConverter工具将Amazonia语料库转换为OpenNLP格式:

    bin/opennlp TokenNameFinderConverter ad -encoding ISO-8859-1 -data amazonia.ad -lang pt > corpus.txt
    
  • 训练您的模型(将编码更改为corpus.txt文件的编码,这应该是您的系统默认编码。此命令可能需要几分钟):

  • 从命令行执行它(您应该只执行一句话,标记应该分开):

  • 为了评估您的模型,您可以使用10倍交叉验证:(仅在1.5.2-Cutter中提供,今天使用它,您需要使用SVN主干)(可能需要几个小时)

  • 通过使用自定义特征生成(检查文档),例如通过添加名称词典,提高精度/召回率

  • 你应该试试。它易于使用和定制

    如果您是为葡萄牙语编写的,那么在使用Amazonia语料库的项目文档中会有关于如何编写葡萄牙语的信息。支持的类型包括:

    人、组织、团体、地点、事件、艺术品、摘要、事物、时间和数字

  • 下载OpenNLP和。同时提取并将文件
    amazonia.ad
    复制到
    apache-opennlp-1.5.1-incubating
    文件夹中

  • 执行TokenNameFinderConverter工具将Amazonia语料库转换为OpenNLP格式:

    bin/opennlp TokenNameFinderConverter ad -encoding ISO-8859-1 -data amazonia.ad -lang pt > corpus.txt
    
  • 训练您的模型(将编码更改为corpus.txt文件的编码,这应该是您的系统默认编码。此命令可能需要几分钟):

  • 从命令行执行它(您应该只执行一句话,标记应该分开):

  • 为了评估您的模型,您可以使用10倍交叉验证:(仅在1.5.2-Cutter中提供,今天使用它,您需要使用SVN主干)(可能需要几个小时)

  • 通过使用自定义特征生成(检查文档),例如通过添加名称词典,提高精度/召回率


  • 您必须创建用于提取和检测每种数据类型及其错误的特定函数

    或作为其众所周知的名称面向对象的方式。 也就是说,为了检测货币,我们要做的是在开头或结尾检查美元符号,并检查是否有附加的非数字字符,这意味着错误

    你应该用你的思想写下你已经在做的事情。如果你遵守规则就没那么难了。 机器人学/人工智能有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