Como eu classifico uma palavra de um texto em coisas como nomes, número, dinheiro, data, etc?

Eu fiz algumas perguntas sobre mineração de texto há uma semana, mas eu estava um pouco confuso e parado, mas agora eu sei o que eu quero fazer wgat.

A situação: eu tenho muitas páginas de download com conteúdo HTML. Alguns deles podem ser um texto de um blog, por exemplo. Eles não são estruturados e vieram de sites diferentes.

O que eu quero fazer: vou dividir todas as palavras com espaço em branco e quero classificar cada um ou um grupo em alguns itens pré-definidos como nomes, números, telefone, email, URL, data, dinheiro, temperatura, etc .

O que eu sei: Eu conheço os conceitos / ouvi sobre Processamento de Linguagem Natural, Reconhecimento de Entidade Nomeada, POSTagging, NayveBayesian, HMM, treinamento e muitas coisas para fazer sorting, etc., mas existem algumas bibliotecas diferentes de NLP com diferentes classificadores e maneiras de fazer isso e eu não sei o que usar ou o que fazer.

O QUE EU PRECISO: Eu preciso de algum exemplo de código de um classificador, NLP, qualquer coisa, que possa classificar cada palavra de um texto separadamente, e não um texto inteiro. Algo assim:

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

Alguém pode me ajudar? Estou confuso com várias APIs, classificadores e algoritmos.

Você deve tentar o Apache OpenNLP . É fácil de usar e personalizar.

Se você está fazendo isso para o Português, há informações sobre como fazer isso na documentação do projeto usando o Amazônia Corpus. Os tipos suportados são:

Pessoa, Organização, Grupo, Local, Evento, ArtProd, Resumo, Coisa, Tempo e Numérico.

  1. Baixe o OpenNLP e o Amazônia Corpus . Extraia ambos e copie o arquivo amazonia.ad para a pasta apache-opennlp-1.5.1-incubating .

  2. Execute a ferramenta TokenNameFinderConverter para converter o corpus Amazônia no formato OpenNLP:

     bin/opennlp TokenNameFinderConverter ad -encoding ISO-8859-1 -data amazonia.ad -lang pt > corpus.txt 
  3. Treine seu modelo (Altere a codificação para a codificação do arquivo corpus.txt, que deve ser a codificação padrão do sistema. Esse comando pode levar alguns minutos):

     bin/opennlp TokenNameFinderTrainer -lang pt -encoding UTF-8 -data corpus.txt -model pt-ner.bin -cutoff 20 
  4. Executá-lo a partir da linha de comando (Você deve executar apenas uma frase e os tokens devem ser separados):

     $ bin/opennlp TokenNameFinder pt-ner.bin Loading Token Name Finder model ... done (1,112s) Meu nome é João da Silva , moro no Brasil . Trabalho na Petrobras e tenho 50 anos . Meu nome é  João da Silva  , moro no  Brasil  .  Trabalho  na  Petrobras  e tenho  50 anos  . 
  5. Executando-o usando a API:

     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); 
  6. Para avaliar o seu modelo, você pode usar a validação cruzada de 10x: (disponível apenas na 1.5.2-INCUBADORA, para usá-la hoje, é necessário usar o tronco SVN) (pode levar várias horas)

     bin/opennlp TokenNameFinderCrossValidator -lang pt -encoding UTF-8 -data corpus.txt -cutoff 20 
  7. Melhore a precisão / recuperação usando a Geração de Recursos Personalizados (verifique a documentação), por exemplo, adicionando um dictionary de nomes.

Você pode usar uma abordagem NER (Nomed Entity Recognizer) para essa tarefa, eu recomendo que você dê uma olhada na página de PNL do Stanford Core e use a funcionalidade ner nos módulos para a sua tarefa. Você pode dividir suas sentenças em tokens e depois passá-las para o sistema NER de Stanford. Eu acho que a página da PNL do Stanford Core tem muitos exemplos que podem ajudá-lo de outra forma, por favor, deixe-me saber se você precisa de um código de brinquedo.

Aqui vai o código de exemplo, este é apenas o trecho de código inteiro:

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

Este problema está na intersecção de várias ideias de diferentes áreas. Você menciona o reconhecimento de entidades nomeadas, isto é, um. No entanto, provavelmente você está olhando para uma mistura de parte da marcação de fala (para substantivos, nomes e afins) e extração de informações (para números, números de telefone, e-mails).

Infelizmente, fazer isso e fazê-lo funcionar em dados reais de trabalho exigirá algum esforço, e não é tão simples quanto usar esta ou aquela API.

Você precisa criar funções específicas para extrair e detectar cada tipo de dados e seus erros.

Ou como seu nome bem conhecido object orientado. Ou seja, para detectar a moeda, o que fazemos é verificar um sinal de dólar no início ou no final e verificar se há caracteres não numéricos anexados, o que significa erro.

Você deve escrever o que você já faz com sua mente. Não é tão difícil se você seguir as regras. Existem 3 regras de ouro em Robótica / IA:

  1. analisá-lo.
  2. simplifique
  3. digitalizá-lo.

Dessa forma você pode conversar com computadores.