https://github.com/nbatfai/isaac
Raw File
Tip revision: 56711cf763dbad59f0b089c56ec813f458a91a6b authored by Norbert Bátfai on 13 November 2015, 05:33:44 UTC
Update README
Tip revision: 56711cf
nlp.cpp
/**
 * @brief ISAAC - deep Q learning with neural networks for predicting the next sentence of a conversation
 *
 * @file nlp.cpp
 * @author  Norbert Bátfai <nbatfai@gmail.com>
 * @version 0.0.1
 *
 * @section LICENSE
 *
 * Copyright (C) 2015 Norbert Bátfai, batfai.norbert@inf.unideb.hu
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * @section DESCRIPTION
 * SAMU
 * 
 * The main purpose of this project is to allow the evaluation and 
 * verification of the results of the paper entitled "A disembodied 
 * developmental robotic agent called Samu Bátfai". It is our hope 
 * that Samu will be the ancestor of developmental robotics chatter 
 * bots that will be able to chat in natural language like humans do.
 *
 */

#include "nlp.hpp"

SPOTriplets NLP::sentence2triplets ( const char* sentence )
{
  SPOTriplets triplets;

  Sentence sent = sentence_create ( sentence, dict_ );
  sentence_split ( sent, parse_opts_ );
  int num_linkages = sentence_parse ( sent, parse_opts_ );

  SPOTriplet triplet;
  std::string alter_p;

  bool ready = false;

  for ( int l {0}; l< num_linkages && !ready; ++l )
    {
      Linkage linkage = linkage_create ( l, sent, parse_opts_ );

      std::vector<std::string> words;

      for ( int k=0; k<linkage_get_num_links ( linkage ); ++k )
        {

          const char *p = linkage_get_word ( linkage, k );
          if ( p )
            words.push_back ( p );
          else
            words.push_back ( "null" );

        }

      for ( int k {0}; k<linkage_get_num_links ( linkage ) && !ready; ++k )
        {

          const char* c = linkage_get_link_label ( linkage, k );

          if ( *c == 'S' )
            {
              triplet.p = linkage_get_word ( linkage, k );
              alter_p = words[linkage_get_link_rword ( linkage, k )];
              triplet.s = words[linkage_get_link_lword ( linkage, k )];
            }

          if ( *c == 'O' )
            {
              triplet.o = words[linkage_get_link_rword ( linkage, k )];

              if ( triplet.p == words[linkage_get_link_lword ( linkage, k )] )
                {

                  triplet.cut ( );

                  triplets.push_back ( triplet );

                  ready = true;
                  break;
                }
              else if ( alter_p == words[linkage_get_link_lword ( linkage, k )] )
                {
                  triplet.p = alter_p;

                  triplet.cut ( );

                  triplets.push_back ( triplet );

                  ready = true;
                  break;

                }
            }
        }

      linkage_delete ( linkage );
    }

  sentence_delete ( sent );

  return triplets;
}
back to top