LIMA
Libre Multilingual Analyzer — C++ API
Loading...
Searching...
No Matches
CoordinationConstraints.cpp
Go to the documentation of this file.
1// Copyright 2002-2013 CEA LIST
2// SPDX-FileCopyrightText: 2022 CEA LIST <gael.de-chalendar@cea.fr>
3//
4// SPDX-License-Identifier: MIT
5
19#include "DependencyGraph.h"
20#include "SyntacticData.h"
21#include "SyntagmaticMatrix.h"
22#include "SimplificationData.h"
23
26
29
30#include <string>
31
32using namespace Lima::Common::MediaticData;
35
36namespace Lima
37{
38namespace LinguisticProcessing
39{
40namespace SyntacticAnalysis
41{
42#define SACLOGINIT LOGINIT("LP::SyntacticAnalysis::Coordination")
43
45
46//**********************************************************************
47// factories for constraint functions defined in this file
50
53
56
59
60
61//**********************************************************************
63 const LimaString& complement):
64 ConstraintFunction(language,complement),
65 m_language(language)
66{
67}
68
70 const LinguisticGraphVertex& v1,
71 const LinguisticGraphVertex& v2,
72 AnalysisContent& analysis) const
73{
75 LDEBUG << "testing DefineString for " << v1 << " and " << v2 << " with relation: " /*<< (static_cast<const Common::MediaticData::LanguageData&>(Common::MediaticData::MediaticData::single().mediaData(m_language)).
76 getEntityNames("SyntacticSimplification")[m_relation])*/;
78 auto simplificationData = std::dynamic_pointer_cast<SimplificationData>(analysis.getData("SimplificationData"));
79 if (simplificationData==0)
80 {
82 LERROR << "No simplificationData in DefineString constraint";
83 return false;
84 }
85 if (simplificationData->coordStringsDefs().find(complement) != simplificationData->coordStringsDefs().end())
86 {
88 LERROR << "simplificationData already contains a " << complement << " coord string definition";
89 return false;
90 }
91 if (v1 == graph.firstVertex() || v1 == graph.lastVertex() ||
92 v2 == graph.firstVertex() || v2 == graph.lastVertex() )
93 {
94 LDEBUG << "DefineString: false";
95 return false;
96 }
97 simplificationData->coordStringsDefs().insert(std::make_pair(complement,std::vector<LinguisticGraphVertex>()));
98 std::vector<LinguisticGraphVertex>& stringDef = (*simplificationData->coordStringsDefs().find(complement)).second;
99 LDEBUG << "Add " << v1 << " to string " << complement;
100 stringDef.push_back(v1);
101
102 LinguisticGraphVertex next = v1;
103 while (next != v2)
104 {
105 next = boost::target(*(boost::out_edges(next, *graph.getGraph()).first),*graph.getGraph());
106 LDEBUG << "Add " << next << " to string " << complement;
107 stringDef.push_back(next);
108 }
109
110 LDEBUG << "DefineString: true";
111 return true;
112}
113
114
115SameString::SameString(MediaId language,
116 const LimaString& complement):
117 ConstraintFunction(language,complement),
118 m_language(language)
119{
120 m_microAccessor=&(static_cast<const Common::MediaticData::LanguageData&>(Common::MediaticData::MediaticData::single().mediaData(language)).getPropertyCodeManager().getPropertyAccessor("MICRO"));
121}
122
124 const LinguisticGraphVertex& v1,
125 const LinguisticGraphVertex& v2,
126 AnalysisContent& analysis) const
127{
128
130 LDEBUG << "Testing SameString on " << v1 << " and " << v2;
131
133 auto syntacticData = std::dynamic_pointer_cast<SyntacticData>(analysis.getData("SyntacticData"));
134 auto simplificationData = std::dynamic_pointer_cast<SimplificationData>(analysis.getData("SimplificationData"));
135 LinguisticGraph* graph = syntacticData->graph();
136 if (simplificationData==0)
137 {
139 LERROR << "No simplificationData in DefineString constraint";
140 return false;
141 }
142 std::vector<LinguisticGraphVertex> stringDef;
143 if (simplificationData->coordStringsDefs().find(complement) == simplificationData->coordStringsDefs().end())
144 {
146 LWARN << "No such coord string defined: " << complement;
147// return false;
148 }
149 else
150 {
151 stringDef = (*simplificationData->coordStringsDefs().find(complement)).second;
152 }
153
154 if (simplificationData->coordStrings().find(complement) == simplificationData->coordStrings().end())
155 {
156 simplificationData->coordStrings().insert(std::make_pair(complement, std::vector< std::vector < LinguisticGraphVertex > >()));
157 }
158
159 std::vector<LinguisticGraphVertex> newString;
160 LDEBUG << "Add " << v1 << " to new SameString " << complement;
161 newString.push_back(v1);
162 LinguisticGraphVertex next = v1;
163 while (next != v2)
164 {
165 next = boost::target(*(boost::out_edges(next, *graph).first),*graph);
166 LDEBUG << "Add " << next << " to new string " << complement;
167 newString.push_back(next);
168 }
169 if (!stringDef.empty() && newString.size() != stringDef.size())
170 {
171 LDEBUG << "New string and model for " << complement << " have different sizes";
172
173 return false;
174 }
175 if (stringDef.empty() && (*simplificationData->coordStrings().find(complement)).second.empty() )
176 {
177 LDEBUG << "No definition and no same string yet : using myself";
178 stringDef = newString;
179 }
180 else if (stringDef.empty())
181 {
182 LDEBUG << "No definition yet : using first found same string";
183 stringDef = *(*simplificationData->coordStrings().find(complement)).second.begin();
184 }
185 // testing equality of the new string and its definition
186 std::vector<LinguisticGraphVertex>::const_iterator dit = stringDef.begin();
187 std::vector<LinguisticGraphVertex>::const_iterator nit = newString.begin();
188
189 for (; dit != stringDef.end(); dit++, nit++)
190 {
191
192 MorphoSyntacticData* msdDef=get(vertex_data,*graph,*dit);
193 std::set<LinguisticCode> microFilters = msdDef->allValues(*m_microAccessor);
194 std::list<LinguisticCode> lmicroFilters;
195 std::copy(microFilters.begin(),microFilters.end(),std::insert_iterator< std::list<LinguisticCode> >(lmicroFilters,lmicroFilters.end()));
196 MorphoSyntacticData* msdNew=get(vertex_data,*graph,*nit);
197 if (!(msdNew!=0 && msdNew->hasUniqueMicro(*m_microAccessor,lmicroFilters)))
198 {
199 LDEBUG << "new string vertex " << *nit << " and model string vertex " << *dit << " have different micro categories";
200 return false;
201 }
202 }
203 LDEBUG << "Add string " << v1 << "/" << v2 << " to same strings of " << complement;
204 simplificationData->coordStrings()[complement].push_back(newString);
205 return true;
206}
207
208//----------------------------------------------------------------------
210 const LimaString& complement):
211 ConstraintFunction(language,complement)
212{
213}
214
216 const LinguisticGraphVertex& /*v1*/,
217 const LinguisticGraphVertex& /*v2*/,
218 AnalysisContent& /*analysis*/) const
219{
220
222 LDEBUG << "clearing stored subsentences";
223
224 //SimplificationData* simplificationData =
225 // static_cast<SimplificationData*>(analysis.getData("SimplificationData"));
226
227 return true;
228}
229
230//----------------------------------------------------------------------
232const LimaString& complement):
233ConstraintFunction(language,complement)
234{
235}
236
238 const LinguisticGraphVertex& /*v1*/,
239 const LinguisticGraphVertex& /*v2*/,
240 AnalysisContent& /*analysis*/) const
241{
243 LDEBUG << "clearing stored subsentences";
244
245 //SimplificationData* simplificationData =
246 //static_cast<SimplificationData*>(analysis.getData("SimplificationData"));
247
248 return true;
249}
250
251} // end namespace SyntacticAnalysis
252} // end namespace LinguisticProcessing
253} // end namespace Lima
#define SACLOGINIT
#define DefineModelId
#define DefineStringId
#define SetInstanceId
#define SameStringId
A graph that stores the relations of syntactic dependency between the elements of a DependencyGraph.
#define LWARN
Definition LimaCommon.h:160
#define LDEBUG
Definition LimaCommon.h:157
#define LERROR
Definition LimaCommon.h:161
LinguisticGraph::vertex_descriptor LinguisticGraphVertex
@ vertex_data
boost::adjacency_list< boost::vecS, boost::vecS, boost::bidirectionalS, LinguisticVertexProperties > LinguisticGraph
Property to identify the chains in the graph.
Data used for the simplification of sentences allowing easier heterosyntagmatic analysis.
Data used for the syntactic analyzis of texts.
Holds all data that pass through the ProcessUnits Analysis data are shared pointers,...
std::shared_ptr< AnalysisData > getData(const QString &id)
return AnalysisData by id
Holds linguistic data for one language.
const MediaData & mediaData(MediaId media) const
An AnalysisData containing a LinguisticGraph with a language and an id.
const LinguisticGraphVertex & lastVertex(void) const
Returns the last vertex of the graph.
const LinguisticGraph * getGraph(void) const
Returns the underlying graph structure.
const LinguisticGraphVertex & firstVertex(void) const
Returns the first vertex of the graph.
bool hasUniqueMicro(const Lima::Common::PropertyCode::PropertyAccessor &microAccessor, const std::list< Lima::LinguisticCode > &microFilter)
return true if there is only one micro, and this micro is in microfilter
std::set< LinguisticCode > allValues(const Common::PropertyCode::PropertyAccessor &propertyAccessor) const
DefineModel(MediaId language, const LimaString &complement=LimaString())
bool operator()(const Lima::LinguisticProcessing::LinguisticAnalysisStructure::AnalysisGraph &graph, const LinguisticGraphVertex &v1, const LinguisticGraphVertex &v2, AnalysisContent &analysis) const override
binary constraint function : the constraint only applies on two vertices in the graph (the graph is a...
DefineString(MediaId language, const LimaString &complement=LimaString())
bool operator()(const Lima::LinguisticProcessing::LinguisticAnalysisStructure::AnalysisGraph &graph, const LinguisticGraphVertex &v1, const LinguisticGraphVertex &v2, AnalysisContent &analysis) const override
binary constraint function : the constraint only applies on two vertices in the graph (the graph is a...
SameString(MediaId language, const LimaString &complement=LimaString())
bool operator()(const Lima::LinguisticProcessing::LinguisticAnalysisStructure::AnalysisGraph &graph, const LinguisticGraphVertex &v1, const LinguisticGraphVertex &v2, AnalysisContent &analysis) const override
binary constraint function : the constraint only applies on two vertices in the graph (the graph is a...
bool operator()(const Lima::LinguisticProcessing::LinguisticAnalysisStructure::AnalysisGraph &graph, const LinguisticGraphVertex &v1, const LinguisticGraphVertex &v2, AnalysisContent &analysis) const override
binary constraint function : the constraint only applies on two vertices in the graph (the graph is a...
SetInstance(MediaId language, const LimaString &complement=LimaString())
static const MediaticData & single()
const singleton accessor
Definition Singleton.h:51
std::string limastring2utf8stdstring(const Lima::LimaString &phrase, uint32_t size0)
Convert a wide string to a string , in dest up to size bytes.
Automaton::ConstraintFunctionFactory< SetInstance > SetInstanceFactory(SetInstanceId)
Automaton::ConstraintFunctionFactory< DefineModel > DefineModelFactory(DefineModelId)
Automaton::ConstraintFunctionFactory< DefineString > DefineStringFactory(DefineStringId)
Automaton::ConstraintFunctionFactory< SameString > SameStringFactory(SameStringId)
NAUTITIA.
QString LimaString
Definition LimaString.h:33