Este artigo é destinado a quem nunca trabalhou com a Stanford nlp e enfrentou a necessidade de estudá-lo e aplicá-lo o mais rápido possível.
Este software é bastante comum e, em particular, nossa empresa -
BaltInfoCom - utiliza esse programa.
Primeiro, você precisa entender uma coisa simples: a PNL de Stanford trabalha com o princípio de anotar palavras, ou seja, uma ou mais anotações, como POS (parte do discurso - parte do discurso), NER (reconhecimento de entidade nomeada - entidade nomeada) e etc.
A primeira coisa que um iniciante vê quando acessa o site da PNL de Stanford na seção "
início rápido " é o seguinte design:
Properties props = new Properties(); props.setProperty("annotators", "tokenize,ssplit,pos,lemma,ner,regexner,parse,depparse,coref"); StanfordCoreNLP pipeline = new StanfordCoreNLP(props);
Aqui, StanfordCoreNLP é um transportador, para o qual nosso texto é pré-compactado em um objeto CoreDocument. StanfordCoreNLP, esse é o objeto mais importante e frequentemente usado em toda a estrutura, com a qual todo o trabalho principal é realizado.
Primeiro, definimos os parâmetros no StanfordCoreNLP e indicamos a implementação de quais ações precisamos. Além disso, todas as combinações possíveis desses parâmetros podem ser encontradas no site oficial
neste link.
- tokenize - consequentemente, tokenização
- ssplit - dividindo em uma frase
- pos - definição de uma parte do discurso
- lema - adicionando a cada palavra sua forma inicial
- ner - definição de entidades nomeadas, como "Organização", "Face" etc.
- regexner - definindo entidades nomeadas usando expressões regulares
- análise - análise de cada palavra de acordo com a semântica (sexo, número e assim por diante)
- depparse - analisa dependências de sintaxe entre palavras em uma frase
- coref- procure por referências à mesma entidade nomeada no texto, por exemplo, “Mary” e “she”
Aqui está um exemplo de como os anotadores (análise e depparse) funcionam juntos:

Se você não entender as anotações sobre os tokens, nesses sites você encontrará seus significados:
significados de conexões em frases ,
significados de partes do discurso .
Para cada um desses parâmetros, você pode encontrar sinalizadores adicionais para um ajuste mais fino
aqui na seção "Anotadores".
Essas construções são definidas se você deseja usar os modelos internos de Stanford NLP, mas também pode configurá-los manualmente usando o método addAnnotator (Annotator ...) ou reabastecendo os parâmetros antes de criar o objeto StanfordCoreNLP.
Agora, sobre como você pode extrair entidades nomeadas do texto. Para fazer isso, a Stanford NLP possui três classes baseadas em expressões regulares internas e uma classe para marcar tokens através do modelo.
Classes de expressão regular:
- TokensRegexAnnotator - anotador que funciona pelas regras - SequenceMatchRules .
Considere um exemplo de mapeamento para ele, baseado nessas regras.
ner = { type: "CLASS", value: "edu.stanford.nlp.ling.CoreAnnotations$NamedEntityTagAnnotation" } $EMAIL = "/.*([A-z0-9-]+?)(@)([A-z0-9-]+?).*/" { ruleType: "tokens", pattern: (([]) ($EMAIL)), action: (Annotate($0, ner, "MAIL")), priority:0 }
A primeira linha indica que tipo de tags preencheremos neste modelo.
No segundo, criamos uma variável que, de acordo com as regras, deve começar com o caractere "$" e estar no início da linha.
Depois disso, crie um bloco no qual definimos o tipo de regras. Em seguida, um modelo para comparação (no nosso caso, dizemos que precisamos de "[]" - qualquer token após o qual a nossa variável $ EMAIL vai. Depois disso, definimos a ação, no nosso caso, queremos anotar o token.
Observe que, no exemplo, “[]” e “$ EMAIL” estão entre parênteses, porque $ 0 indica qual grupo de capturas queremos destacar do padrão encontrado, enquanto o grupo de captura significa um grupo entre parênteses. Se você definir 0, na frase "sobaka@mail.ru mail" todos os tokens serão anotados como "MAIL". Se você definir 1 (ou seja, o primeiro grupo de captura), somente a palavra "email" será anotada; se 2, somente sobaka@mail.ru.
Para situações em que, de acordo com duas regras, o mesmo token pode ser definido de maneira diferente, você pode definir a prioridade da regra em relação à outra. Por exemplo, no caso da frase a seguir - "Casa $ 25", pode haver duas regras conflitantes, de acordo com uma das quais o número 25 será determinado como o número da casa e, de acordo com a segunda - como seu valor. - RegexNERAnnotator - este anotador funciona usando o RegexNERSequenceClassifier .
O mapeamento para ele é o seguinte
regex1 TYPE overwritableType1,Type2... priority
Aqui regex1 é uma expressão regular no formato TokenSequencePattern .
TYPE é o nome da entidade nomeada.
overwritableType1, Type2 ... - tipos que podemos substituir em casos de uma situação contenciosa.
Prioridade - prioridade para disputas descritas acima.
Observe que neste mapeamento todas as colunas devem ser separadas por tabulações. - TokensRegexNERAnnotator
Esse anotador difere do anterior, pois usa a biblioteca TokensRegex para expressões regulares, o mesmo que o primeiro anotador, que permite usar regras mais flexíveis para correspondência; além de poder registrar valores de tags diferentes da tag NER.
O mapeamento para ele é compilado de acordo com as regras do RegexNERAnnotator
Marcando texto através de um modelo usando NERClassifierCombiner
Para usar esta classe, você deve primeiro ter ou treinar seu modelo.
Como fazer isso pode ser encontrado
aqui ;
Depois de treinar o modelo, resta apenas criar um NERClassifierCombiner, indicando o caminho para o modelo, e chamar o método classify.
NERClassifierCombiner classifier = new NERClassifierCombiner(false, false, serialized_model); String text = "Some lucky people working in BaltInfoCom Org."; List<List<CoreLabel>> out = classifier.classify(text);
Uma lista completa de anotadores pode ser encontrada
aqui .
Além do acima, se você precisar usar a PNL de Stanford para o idioma russo, posso aconselhá-lo a vir
aqui . Existem modelos para identificar partes do discurso (pós-marcador) e para identificar relacionamentos em frases (analisador de dependência).
Tipos de tags representados lá:
russian-ud-pos.tagger é apenas um tagger,
russian-ud-mfmini.tagger - com a lista principal de características morfológicas,
russian-ud-mf.tagger - com uma lista completa de recursos morfológicos, um exemplo de mapeamento para o qual pode ser visto
aqui .