forked from nbatfai/samu
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnlp.cpp
115 lines (90 loc) · 3.18 KB
/
nlp.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/**
* @brief SAMU - the potential ancestor of developmental robotics chatter bots
*
* @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;
}