PNL: extraia fatos do texto usando o analisador Tomita

PNL - processamento de linguagem natural





A maioria dos dados do mundo não está estruturada - são apenas textos em russo ou em qualquer outro idioma. Fatos extraídos de tais textos podem ser de particular interesse para os negócios, portanto, tais tarefas costumam surgir. Uma área separada da inteligência artificial lida com essa questão: processamento de linguagem natural, o mesmo PNL ( Processamento de Linguagem Natural ).





:









.









, , , .





  • -





, ,





,  , , , , . , , , , , :









№2 ,15 2020., 5400,00





.. 15299,00 ,





№575 , 145 17.09.2020 2020 , 18% — 5300 .





, 23, 51 01.09.2020 — 7500 .





№1-03 01.07.2020 211 2020 23000 ..(18%)





-?

- – () , (- ) .  GitHub, .





-?

  • – ,





















-?

- , , , . ,  ,  , .





tomitaparser.exe ( . ) :





  • config.proto — . , . tomitaparser.exe;





  • dic.gzt – . . , , , . ;





  • mygram.cxx – . , . . ;





  • facttypes.proto – ;





  • kwtypes.proto – . , .





 utf8 , ( ).





«dic.gzt», , .





encoding "utf8"; //   

//        ,     
import "base.proto";
import "articles_base.proto";
//     
TAuxDicArticle "payment" {
    key = { "tomita:mygram.cxx" type=CUSTOM }
};
      
      



. , — , . . «->»  . , – . . . (Noun, Verb, Adj), (Comma, Punct, Ampersand, PlusSign) . .  .  





. , « () , .  .





() , (), , . ()  «< >»  .  -  . , «cxx», – «mygram.cxx». . . — , , «», «», «».





#encoding "utf8" //   

//  "|"    ""
Rent -> '' | '' | '';
//  "" ,       0   
//  <gnc-agr[1]>   ,         ,   
Purpose -> Rent Adj<gnc-agr[1]> Noun<gnc-agr[1]>;
      
      



. , , , . , , .





//   StreetW    ,   StreetAbbr -   
StreetW -> '' | '' | '' | '';
StreetAbbr -> '' | '' | '' | '-' | '';

//       StreetDescr,       StreetW   StreetAbbr
StreetDescr -> StreetW | StreetAbbr;
StreetNameNoun -> (Adj<gnc-agr[1]>) Word<gnc-agr[1], rt> (Word<gram="">);
StreetNameAdj -> Adj<h-reg1> Adj*;
      
      



«StreetNameNoun»  , . , , «<rt>». , , . , , . . , , .. , «()». «StreetNameAdj»  , . . «<h-reg1>». , «*». , .





Address -> StreetDescr StreetNameNoun<gram="", h-reg1>;
Address -> StreetDescr StreetNameNoun<gram="", h-reg1>;

Address -> StreetNameAdj<gnc-agr[1]> StreetW<gnc-agr[1]>;
Address -> StreetNameAdj StreetAbbr;
      
      



. , . , . . , . :





//       «dic.gzt»
TAuxDicArticle "month" {
    key = { "" | "" | "" | "" | "" | "" | "" | "" | "" | "" | "" | "" }
};
      
      



:





Month -> Noun<kwtype="month">;
Year -> AnyWord<wff=/[1-2]?[0-9]{1,3}?\.?/>;

Period -> Month Year;
      
      



«kwtype» , «month» , 0 2999 «» «.» . , . «Result» :





Result -> Purpose AnyWord* Address AnyWord* Period;
Result -> Purpose AnyWord* Address;
Result -> Purpose;
      
      



«AnyWord» «*» , 0 . : , . : , .





. – «facttypes.proto» «dic.gzt»  (, - , ).





import "facttypes.proto"; //    «dic.gzt» 
      
      



«facttypes.proto» «Payment»  (): , . :





//   
import "base.proto";
import "facttypes_base.proto";

message Payment: NFactType.TFact {
    required string Purpose = 1;
    optional string Address = 2;
    optional string Period = 3;
};
      
      



«Payment» «NFactType.TFact», «required» «optional» , . , , «interp» , . , .





//  «Purpose»    «Purpose»  «Payment»
//  «Address»    «Address»  «Payment»
//  «Period»    «Period»  «Payment»
Result -> Purpose interp(Payment.Purpose) AnyWord* Address interp(Payment.Address) AnyWord* Period interp(Payment.Period);
Result -> Purpose interp(Payment.Purpose) AnyWord* Address interp(Payment.Address);
Result -> Purpose interp(Payment.Purpose);
      
      



, , , .





encoding "utf8"; //   

TTextMinerConfig {
    //   
    Dictionary = "dic.gzt";
    //  
    Input = {File = "input.txt"}
    //      
    Output = {File = "output.txt"
            Format = text}
    // ,     
    Articles = [
        { Name = "payment" }
        ]
    // ,  
    Facts = [
        { Name = "Payment" }
        ]
    //       
    PrettyOutput = "pretty.html"
}
      
      



:





> tomitaparser.exe config.proto
      
      



No arquivo " input.txt " colocamos o texto fonte colocado logo no início do artigo. Após o trabalho, o analisador escreveu o resultado no arquivo " output.txt ":





2      , 15   2020 . ,   5400,00  
    Payment
    {
        Purpose =   
        Address =   
        Period =  2020
    }
     . .      15299,00  ,   
    Payment
    {
        Purpose =  
    }575      , 145  17.09.2020   2020  ,   18% - 5300  . 
    Payment
    {
        Purpose =  
        Address =   
        Period =  2020
    }
          , 23 ,  51  01.09.2020 - 7500  . 
    Payment
    {
        Purpose =   
        Address =  
    }1-03  01.07.2020       211   2020  23000  .. ( 18% ) 
    Payment
    {
        Purpose =  
        Address =  
        Period =  2020
    }
      
      



Extrair fatos da linguagem natural é uma tarefa nada trivial no mundo de TI até hoje. Agora temos mais uma ferramenta disponível em nossas mãos. Como você pode ver, criar sua primeira gramática pode ser muito fácil, enquanto você gasta um pouco de tempo aprendendo. para Tomita, é fornecida documentação detalhada e abrangente. No entanto, a qualidade dos fatos destacados depende fortemente do próprio desenvolvedor e de seu conhecimento na área de especialização.








All Articles