LIMA
Libre Multilingual Analyzer — C++ API
Loading...
Searching...
No Matches
SyntacticAnalysisTools.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
23//using namespace boost;
24using namespace std;
25using namespace Lima;
26using namespace Lima::Common::Misc;
27using namespace Lima::Common::MediaticData;
30
31namespace Lima {
32namespace LinguisticProcessing {
33namespace SyntacticAnalysis {
34
35void SyntacticAnalysisTools::displayChains(const AnalysisGraph* anagraph,std::ostream& out)
36{
37 out << "start displaying chains" << endl;
38 const LinguisticGraph* graph=anagraph->getGraph();
39 std::list< std::pair< LinguisticGraphVertex, ChainIdStruct > > startPoints;
40 std::list< LinguisticGraphVertex > toLookAt;
41 std::set< LinguisticGraphVertex > alreadyVisited;
42 toLookAt.push_back(anagraph->firstVertex());
43// LinguisticGraphVertex lastVx=anagraph->lastVertex();
44 while (! toLookAt.empty() )
45 {
46 LinguisticGraphVertex current = toLookAt.front();
47 toLookAt.pop_front();
48 if (alreadyVisited.find(current) != alreadyVisited.end())
49 {
50 continue;
51 }
52 alreadyVisited.insert(current);
54 LDEBUG << "looking at " << current;
55 set< ChainIdStruct > chains=get(vertex_chain_id, *graph, current);
56 for (set<ChainIdStruct>::iterator chainItr=chains.begin();
57 chainItr!=chains.end();
58 chainItr++)
59 {
60 ChainIdStruct chain = *chainItr;
61 if ( (chain.elemType() == BEGIN) || (chain.elemType() == UNIGRAM) )
62 {
63 startPoints.push_back(std::make_pair(current, chain));
64 }
65 }
67 boost::tie(it,itEnd)=out_edges(current,*graph);
68 for (;it!=itEnd;it++)
69 {
70 toLookAt.push_back(target(*it,*graph));
71 }
72 }
73 std::list< std::pair<LinguisticGraphVertex, ChainIdStruct> >::iterator startPointsItr, startPointsItr_end;
74 startPointsItr = startPoints.begin(); startPointsItr_end = startPoints.end();
75 std::set< ChainIdStruct > alreadyDisplayed;
76 for (; startPointsItr != startPointsItr_end; startPointsItr++)
77 {
78 if (alreadyDisplayed.find((*startPointsItr).second) == alreadyDisplayed.end())
79 {
80 displayChain((*startPointsItr).second, (*startPointsItr).first, anagraph, out);
81 alreadyDisplayed.insert((*startPointsItr).second);
82 }
83 }
84/*
85 map<ChainIdStruct,set<LinguisticGraphVertex> > startPoints;
86 map<ChainIdStruct,set<LinguisticGraphVertex> >::iterator startPointsItr;
87 LinguisticGraphVertexIt it,itEnd;
88 boost::tie(it,itEnd) = vertices(*graph);
89 for (;it!=itEnd;it++)
90 {
91 LinguisticGraphVertex vertex = *it;
92 if ( in_degree(vertex,*graph)==0 && out_degree(vertex,*graph)==0 )
93 continue;
94 set< ChainIdStruct > chains=get(vertex_chain_id, *graph, vertex);
95 for (set<ChainIdStruct>::iterator chainItr=chains.begin();
96 chainItr!=chains.end();
97 chainItr++)
98 {
99 ChainIdStruct chain = *chainItr;
100 if ( chain.chainType() != Lima::Common::MediaticData::NO_CHAIN_TYPE )
101 {
102 startPointsItr=startPoints.find(chain);
103 if (startPointsItr==startPoints.end())
104 {
105 bool success=false;
106 boost::tie(startPointsItr,success) =
107 startPoints.insert(make_pair(chain,set<LinguisticGraphVertex>()));
108 }
109 (*startPointsItr).second.insert(vertex);
110 }
111 }
112 }
113
114 LinguisticGraphEdgeIt ite, iteEnd;
115 boost::tie(ite, iteEnd) = edges(*graph);
116 for (;ite!=iteEnd;ite++)
117 {
118 LinguisticGraphEdge edge = *ite;
119 set< ChainIdStruct > chains=get(edge_chain_id,*graph,edge );
120 for (set<ChainIdStruct>::iterator chainItr=chains.begin();
121 chainItr!=chains.end();
122 chainItr++)
123 {
124 ChainIdStruct chain = *chainItr;
125 if ( chain.chainType() != 0 )
126 {
127 startPointsItr=startPoints.find(chain);
128 if (startPointsItr==startPoints.end())
129 {
130 bool success=false;
131 boost::tie(startPointsItr,success) =
132 startPoints.insert(make_pair(chain,set<LinguisticGraphVertex>()));
133 }
134 startPointsItr->second.erase(target(edge,*graph));
135 }
136 }
137 }
138
139 out << "found " << startPoints.size() << " chains." << endl;
140
141 for (map<ChainIdStruct,set<LinguisticGraphVertex> >::iterator chainItr=startPoints.begin();
142 chainItr!=startPoints.end();
143 chainItr++)
144 {
145 ChainIdStruct chain = chainItr->first;
146 set<LinguisticGraphVertex>& chainVertices = chainItr->second;
147 if (chainVertices.size() > 0)
148 {
149 LinguisticGraphVertex start=*(chainVertices.begin());
150 displayChain(chain,start,graph,out);
151 }
152 }
153
154*/
155 out << "end display chains" << endl;
156
157}
158
160 const ChainIdStruct& chain,
162 const AnalysisGraph* anagraph,
163 std::ostream& out)
164{
165 out << "Chain " << chain << "\t";
166 auto graph = anagraph->getGraph();
167 auto currentVx = start;
169 auto lastVx = anagraph->lastVertex();
170 while (currentVx!=lastVx)
171 {
172 MorphoSyntacticData* data=get(vertex_data,*graph,currentVx);
173 Token* token=get(vertex_token,*graph,currentVx);
174 if ( (token != 0) && (data != 0) && (!data->empty()) )
175 out << token->stringForm().toStdString()
176 << "[" << currentVx << "]{"
177 << data->begin()->properties << "} ";
178 else
179 out << token->stringForm().toStdString()
180 << "[" << currentVx << "]{NA} ";
181 boost::tie(it, itEnd) = out_edges(currentVx,*graph);
182 currentVx = lastVx;
183 for (;it!=itEnd;it++)
184 {
185 auto chains = get(vertex_chain_id, *graph, target(*it, *graph));
186 if (chains.find(chain) != chains.end())
187 {
188 currentVx = target(*it,*graph);
189 break;
190 }
191 }
192 }
193 out << endl;
194}
195
198 const MediaId language,
199 std::ostream& out,
200 const bool DisplayLemma)
201{
202
203 out << "start display dependency graph : " << endl;
204
205 const DependencyGraph* depGraph=data.dependencyGraph();
206 const LinguisticGraph* linguisticGraph=data.graph();
207
208 DependencyGraphEdgeIt it,itEnd;
209 boost::tie(it,itEnd)=edges(*depGraph);
210 for (;it!=itEnd;it++)
211 {
212
213// const ChainIdStruct chain= get(edge_depchain_id,*depGraph,*it);
214// if (chain.chainId() != ChainIdStruct::noid) {
215// out << "chain " << chain.chainId();
216// }
217
218 const DepRelTypeProp relType=get(edge_deprel_type,*depGraph,*it);
219 out << " " << static_cast<const Common::MediaticData::LanguageData&>(Common::MediaticData::MediaticData::single().mediaData(language)).getSyntacticRelationName(relType) << " :\t";
220
221 DependencyGraphVertex src = source(*it,*depGraph);
222 DependencyGraphVertex targ = target(*it,*depGraph);
224 MorphoSyntacticData* currentData=get(vertex_data,*linguisticGraph,s);
225 Token* token=get(vertex_token,*linguisticGraph,s);
226 if ( (token != 0) && (currentData != 0) && (!currentData->empty()) )
227 {
228 if (DisplayLemma == true)
229 out << Common::MediaticData::MediaticData::single().stringsPool(language)[currentData->front().lemma].toStdString()
230 << "[" << src << "|" << s << "]{"
231 << currentData->begin()->properties << "} ";
232 else
233 // out << currentData->front().lemma
234 out << token->stringForm().toStdString()
235 << "[" << src << "|" << s << "]{"
236 << currentData->begin()->properties << "} ";
237 }
238 else
239 out << token->stringForm().toStdString()
240 << "[" << src << "|" << s << "]{NA} ";
242 currentData=get(vertex_data,*linguisticGraph,t);
243 token=get(vertex_token,*linguisticGraph,t);
244 if ( (token != 0) && (currentData != 0) && (!currentData->empty()) )
245 {
246 if (DisplayLemma == true)
247 out << Common::MediaticData::MediaticData::single().stringsPool(language)[currentData->front().lemma].toStdString()
248 << "[" << targ << "|" << t << "]{"
249 << currentData->begin()->properties << "} ";
250 else
251 // out << currentData->front().lemma
252 out << token->stringForm().toStdString()
253 << "[" << targ << "|" << t << "]{"
254 << currentData->begin()->properties << "} ";
255 }
256 else
257 out << token->stringForm().toStdString()
258 << "[" << targ << "|" << t << "]{NA} ";
259 out << std::endl;
260 }
261
262 out << "end display dependency graph" << endl;
263
264}
265
268 const MediaId language,
269 std::ostream& out)
270{
271
272 const DependencyGraph* depGraph=data.dependencyGraph();
273 const LinguisticGraph* linguisticGraph=data.graph();
274
275 DependencyGraphEdgeIt it,itEnd;
276 boost::tie(it,itEnd)=edges(*depGraph);
277 for (;it!=itEnd;it++) {
278
279 const DepRelTypeProp relType=get(edge_deprel_type,*depGraph,*it);
280 out << static_cast<const Common::MediaticData::LanguageData&>(Common::MediaticData::MediaticData::single().mediaData(language)).getSyntacticRelationName(relType) << " ";
281
282 LinguisticGraphVertex srcVertex=
283 data.tokenVertexForDepVertex(source(*it,*depGraph));
284 LinguisticGraphVertex tgtVertex=
285 data.tokenVertexForDepVertex(target(*it,*depGraph));
286
287 MorphoSyntacticData* srcData=get(vertex_data,*linguisticGraph,srcVertex);
288 MorphoSyntacticData* tgtData=get(vertex_data,*linguisticGraph,tgtVertex);
289
290 Token* srcToken = get(vertex_token,*linguisticGraph,srcVertex);
291 Token* tgtToken = get(vertex_token,*linguisticGraph,tgtVertex);
292
293 if (srcData==0 || tgtData==0 || srcToken==0 || tgtToken==0) {
294 continue;
295 }
296
297 uint64_t srcPosition=srcToken->position();
298 uint64_t tgtPosition=tgtToken->position();
299
300 string srcMacroCat,tgtMacroCat,srcMicroCat,tgtMicroCat;
301 try {
303 static_cast<const Common::MediaticData::LanguageData&>(Common::MediaticData::MediaticData::single().mediaData(language)).getPropertyCodeManager();
304 const Common::PropertyCode::PropertyManager& macroManager=pcm.getPropertyManager("MACRO");
305 const Common::PropertyCode::PropertyManager& microManager=pcm.getPropertyManager("MICRO");
306 srcMacroCat=macroManager.getPropertySymbolicValue(srcData->firstValue(macroManager.getPropertyAccessor()));
307 srcMicroCat=microManager.getPropertySymbolicValue(srcData->firstValue(microManager.getPropertyAccessor()));
308 tgtMacroCat=macroManager.getPropertySymbolicValue(tgtData->firstValue(macroManager.getPropertyAccessor()));
309 tgtMicroCat=microManager.getPropertySymbolicValue(tgtData->firstValue(microManager.getPropertyAccessor()));
310 }
311 catch (LimaException& e) {
313 LERROR << e.what();
314 continue;
315 }
316
317 if (srcPosition>tgtPosition) {
318 // target of relation before source of relation in text
319 out << "TARGET:" << tgtMacroCat << "/" << tgtMicroCat << " "
320 << "SOURCE:" << srcMacroCat << "/" << srcMicroCat << endl;
321 }
322 else {
323 // source of relation before target of relation in text
324 out << "SOURCE:" << srcMacroCat << "/" << srcMicroCat << " "
325 << "TARGET:" << tgtMacroCat << "/" << tgtMicroCat << endl;
326 }
327 }
328}
329
332 const MediaId language,
333 std::ostream& out)
334{
335 const DependencyGraph* depGraph=data.dependencyGraph();
336 const LinguisticGraph* linguisticGraph=data.graph();
337
338 DependencyGraphEdgeIt it,itEnd;
339 boost::tie(it,itEnd)=edges(*depGraph);
340 for (;it!=itEnd;it++) {
341
342 const DepRelTypeProp relType=get(edge_deprel_type,*depGraph,*it);
343 out << static_cast<const Common::MediaticData::LanguageData&>(Common::MediaticData::MediaticData::single().mediaData(language)).getSyntacticRelationName(relType) << " ";
344
345 // output macro/micro of source and target
346 LinguisticGraphVertex srcVertex=
347 data.tokenVertexForDepVertex(source(*it,*depGraph));
348 LinguisticGraphVertex tgtVertex=
349 data.tokenVertexForDepVertex(target(*it,*depGraph));
350
351 MorphoSyntacticData* srcData=get(vertex_data,*linguisticGraph,srcVertex);
352 MorphoSyntacticData* tgtData=get(vertex_data,*linguisticGraph,tgtVertex);
353
354 string srcMacroCat,tgtMacroCat,srcMicroCat,tgtMicroCat;
355 try {
357 static_cast<const Common::MediaticData::LanguageData&>(Common::MediaticData::MediaticData::single().mediaData(language)).getPropertyCodeManager();
358 const Common::PropertyCode::PropertyManager& macroManager=pcm.getPropertyManager("MACRO");
359 const Common::PropertyCode::PropertyManager& microManager=pcm.getPropertyManager("MICRO");
360 srcMacroCat=macroManager.getPropertySymbolicValue(srcData->firstValue(macroManager.getPropertyAccessor()));
361 srcMicroCat=microManager.getPropertySymbolicValue(srcData->firstValue(microManager.getPropertyAccessor()));
362 tgtMacroCat=macroManager.getPropertySymbolicValue(tgtData->firstValue(macroManager.getPropertyAccessor()));
363 tgtMicroCat=microManager.getPropertySymbolicValue(tgtData->firstValue(microManager.getPropertyAccessor()));
364 }
365 catch (LimaException& e) {
367 LERROR << e.what();
368 continue;
369 }
370
371 out << srcMacroCat << "/" << srcMicroCat << " "
372 << tgtMacroCat << "/" << tgtMicroCat << " ";
373
374 // output distance between source and target
375 Token* srcToken = get(vertex_token,*linguisticGraph,srcVertex);
376 Token* tgtToken = get(vertex_token,*linguisticGraph,tgtVertex);
377 uint64_t srcPosition=srcToken->position();
378 uint64_t tgtPosition=tgtToken->position();
379 uint64_t srcLength=srcToken->length();
380 uint64_t tgtLength=tgtToken->length();
381
382 if (srcPosition>tgtPosition+tgtLength) {
383 // target of relation before source of relation in text
384 out << srcPosition-(tgtPosition+tgtLength);
385 }
386 else if (tgtPosition>srcPosition+srcLength) {
387 // source of relation before target of relation in text
388 out << tgtPosition-(srcPosition+srcLength);
389 }
390 else {
391 // can be equal (l', n'...) or
392 // negative (aux -> length of auxiliary has changed)
393 out << 0;
394 }
395 out << endl;
396 }
397}
398// ajout Ludovic
400 const MediaId language,
401 std::ostream& xmlStream)
402{
403 const DependencyGraph* depGraph=data.dependencyGraph();
404 const LinguisticGraph* linguisticGraph=data.graph();
405
406 xmlStream << "<syntactic_relations>" << std::endl;
407
408 DependencyGraphEdgeIt it,itEnd;
409 boost::tie(it,itEnd)=edges(*depGraph);
410 for (;it!=itEnd;it++) {
411
412 const DepRelTypeProp relType=get(edge_deprel_type,*depGraph,*it);
413// xmlStream << LinguisticData::single().languageData(language).getSyntacticRelationName(relType) << " ";
414
415 //string relLabel = LinguisticData::single().languageData(language).getSyntacticRelationName(relType);
416 string relLabel = static_cast<const Common::MediaticData::LanguageData&>(Common::MediaticData::MediaticData::single().mediaData(language)).getSyntacticRelationName(relType);
417
418 // output macro/micro of source and target
419 LinguisticGraphVertex srcVertex=
420 data.tokenVertexForDepVertex(source(*it,*depGraph));
421 LinguisticGraphVertex tgtVertex=
422 data.tokenVertexForDepVertex(target(*it,*depGraph));
423
424 MorphoSyntacticData* srcData=get(vertex_data,*linguisticGraph,srcVertex);
425 MorphoSyntacticData* tgtData=get(vertex_data,*linguisticGraph,tgtVertex);
426
427 string srcMacroCat,tgtMacroCat,srcMicroCat,tgtMicroCat;
428 try {
430 const Common::PropertyCode::PropertyManager& macroManager=pcm.getPropertyManager("MACRO");
431 const Common::PropertyCode::PropertyManager& microManager=pcm.getPropertyManager("MICRO");
432 srcMacroCat=macroManager.getPropertySymbolicValue(srcData->firstValue(macroManager.getPropertyAccessor()));
433 srcMicroCat=microManager.getPropertySymbolicValue(srcData->firstValue(microManager.getPropertyAccessor()));
434 tgtMacroCat=macroManager.getPropertySymbolicValue(tgtData->firstValue(macroManager.getPropertyAccessor()));
435 tgtMicroCat=microManager.getPropertySymbolicValue(tgtData->firstValue(microManager.getPropertyAccessor()));
436 }
437 catch (LimaException& e) {
439 LERROR << e.what();
440 continue;
441 }
442
443 // output distance between source and target
444 Token* srcToken = get(vertex_token,*linguisticGraph,srcVertex);
445 Token* tgtToken = get(vertex_token,*linguisticGraph,tgtVertex);
446 uint64_t srcPosition=srcToken->position();
447 uint64_t tgtPosition=tgtToken->position();
448 uint64_t srcLength=srcToken->length();
449 uint64_t tgtLength=tgtToken->length();
450
451 string scrString=limastring2utf8stdstring(srcToken->stringForm());
452 string tgtString=Lima::Common::Misc::limastring2utf8stdstring(tgtToken->stringForm());
453 uint64_t pathDistance=0;
454
455 if (srcPosition>tgtPosition+tgtLength) {
456 // target of relation before source of relation in text
457 pathDistance = srcPosition-(tgtPosition+tgtLength);
458 }
459 else if (tgtPosition>srcPosition+srcLength) {
460 // source of relation before target of relation in text
461 pathDistance = tgtPosition-(srcPosition+srcLength);
462 }
463 else {
464 // can be equal (l', n'...) or
465 // negative (aux -> length of auxiliary has changed)
466 pathDistance = 0;
467 }
468 xmlStream << "<syntactic_relation label=\"" << relLabel << "\"" << " dist=\"" << pathDistance<< "\">"
469 << "<source position=\"" << srcPosition
470 << "\" length=\"" << srcLength
471 << "\" string=\"" << scrString
472 << "\" pos_cat=\"" << srcMicroCat
473 << "\"/>"
474 << "<target position=\"" << tgtPosition
475 << "\" length=\"" << tgtLength
476 << "\" string=\"" << tgtString
477 << "\" pos_cat=\"" << tgtMicroCat
478 << "\"/>"
479 << "</syntactic_relation>" << endl;
480 }
481 xmlStream << "</syntactic_relations>" << std::endl;
482}
483
484} // end namespace
485} // end namespace
486} // end namespace
Lima::Common::MediaticData::SyntacticRelationId DepRelTypeProp
Property to identify the chain of the tokens graph concerned by the relation.
DependencyGraph::edge_iterator DependencyGraphEdgeIt
DependencyGraph::vertex_descriptor DependencyGraphVertex
boost::adjacency_list< boost::vecS, boost::vecS, boost::bidirectionalS, DepVertexProperties, DepEdgeProperties > DependencyGraph
The dependency graph class.
@ edge_deprel_type
#define LDEBUG
Definition LimaCommon.h:157
#define LERROR
Definition LimaCommon.h:161
@ vertex_token
LinguisticGraph::vertex_descriptor LinguisticGraphVertex
@ vertex_data
LinguisticGraph::out_edge_iterator LinguisticGraphOutEdgeIt
boost::adjacency_list< boost::vecS, boost::vecS, boost::bidirectionalS, LinguisticVertexProperties > LinguisticGraph
Property to identify the chains in the graph.
@ vertex_chain_id
#define SALOGINIT
#define CORECLIENTLOGINIT
Dependency graph text form displaying tools.
Holds linguistic data for one language.
const FsaStringsPool & stringsPool(MediaId med) const
const MediaData & mediaData(MediaId media) const
Provide tools to parse a property file, and deal with the property coding system.
const PropertyManager & getPropertyManager(const std::string &propertyName) const
Get the PropertyManager associated to a property.
Provide tools to manage a specific property.
const std::string & getPropertySymbolicValue(const LinguisticCode &value) const
The coded property value can hold several property data.
const PropertyAccessor & getPropertyAccessor() const
give the corresponding PropertyAccessor
The main LIMA exception class.
Definition LimaCommon.h:262
virtual const char * what() const override
Definition LimaCommon.h:280
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.
LinguisticCode firstValue(const Common::PropertyCode::PropertyAccessor &propertyAccessor) const
Return the first non empty value for the given accessor.
static void displayChain(const LinguisticAnalysisStructure::ChainIdStruct &chain, LinguisticGraphVertex start, const LinguisticAnalysisStructure::AnalysisGraph *anagraph, std::ostream &out)
static void displayChains(const LinguisticAnalysisStructure::AnalysisGraph *graph, std::ostream &out)
static void displayRelationsDistanceOfArguments(const SyntacticData &data, const MediaId language, std::ostream &out)
static void displayRelationsOrderOfArguments(const SyntacticData &data, const MediaId language, std::ostream &out)
static void displayDependancies(const SyntacticData &data, const MediaId language, std::ostream &out, const bool DisplayLemma=false)
static void displayRelationsXMLFormat(const SyntacticData &data, const MediaId language, std::ostream &out)
This class points to a graph, its dependency graph and the structure that holds the maping between th...
LinguisticGraphVertex tokenVertexForDepVertex(const DependencyGraphVertex &v) const
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.
NAUTITIA.
STL namespace.