140 LDEBUG <<
"CreateIdiomaticAlternative, match is " << result;
142 " contiguous and" << (result.
isContextual()?
" non":
"") <<
" absolute";
144 if (result.empty())
return false;
146 auto annotationData = std::dynamic_pointer_cast< AnnotationData >(analysis.
getData(
"AnnotationData"));
147 if (annotationData->dumpFunction(
"IdiomExpr") == 0)
152 auto recoData = std::dynamic_pointer_cast<RecognizerData>(analysis.
getData(
"RecognizerData"));
154 std::set<LinguisticGraphVertex> addedVertices;
166 if (recoData->matchOnRemovedVertices(result))
171 <<
": overlapping with a previous one";
177 if (newToken.second->empty())
181 LERROR <<
"CreateIdiomaticAlternative::operator() Got empty morphosyntactic data. Abort";
182 delete newToken.first;
183 delete newToken.second;
191 annotationData->addMatching(
"AnalysisGraph", idiomaticVertex,
"annot", agv);
197 addedVertices.insert(idiomaticVertex);
213 if (result.size() > 1)
215 recoData->setNextVertex(idiomaticVertex);
220 boost::tie(outItr,outItrEnd) = out_edges(idiomaticVertex,*(graph.
getGraph()));
221 for (;outItr!=outItrEnd;outItr++)
223 recoData->setNextVertex(target(*outItr, *(graph.
getGraph())));
236 if (recoData->matchOnRemovedVertices(result))
241 <<
": overlapping with a previous one";
247 if (newToken.second->empty())
251 LERROR <<
"CreateIdiomaticAlternative::operator() Got empty morphosyntactic data. Abort";
252 delete newToken.first;
253 delete newToken.second;
260 addedVertices.insert(idiomaticVertex);
262 annotationData->addMatching(
"AnalysisGraph", idiomaticVertex,
"annot", agv);
269 deque<LinguisticGraphVertex> idiomAlternative;
272 LDEBUG <<
"headVertex = " << headVertex;
278 bool foundHead=
false;
279 bool keeping =
false;
280 std::pair< LinguisticGraphVertex, LinguisticGraphVertex > idiomPartBounds;
281 std::set< std::pair< LinguisticGraphVertex, LinguisticGraphVertex > > edgesToRemove;
282 RecognizerMatch::const_iterator matchItr=result.begin();
283 for (; matchItr!=result.end(); matchItr++)
285 if (!matchItr->isKept())
289 RecognizerMatch::const_iterator prevItr = matchItr - 1;
290 idiomPartBounds.second = prevItr->getVertex();
293 LDEBUG <<
"adding " << idiomPartBounds.first <<
" -> " << idiomPartBounds.second <<
" in edgesToRemove";
295 edgesToRemove.insert(idiomPartBounds);
299 LDEBUG <<
"duplication of vertex " << matchItr->getVertex();;
307 idiomAlternative.push_back(dupVx);
309 annotationData->addMatching(
"AnalysisGraph", dupVx,
"annot", agv);
311 std::set< LinguisticGraphVertex > annotMatches =
312 annotationData->matches(
"AnalysisGraph",matchItr->getVertex(),
"annot");
313 for (std::set< LinguisticGraphVertex >::const_iterator annotIt(annotMatches.begin());
314 annotIt != annotMatches.end(); annotIt++)
316 std::set< std::string > excepted;
317 excepted.insert(
"AnalysisGraph");
318 annotationData->cloneAnnotations(*annotIt, agv, excepted);
320 addedVertices.insert(dupVx);
327 idiomPartBounds.first = matchItr->getVertex();
331 LDEBUG <<
"kept vertex " << matchItr->getVertex();
333 if (matchItr->getVertex()==headVertex)
337 LDEBUG <<
"add head vertex " << idiomaticVertex;
339 idiomAlternative.push_back(idiomaticVertex);
346 LWARN <<
"head token has not been found in non contiguous expression. "
347 <<
"Idiomatic token is placed first";
348 idiomAlternative.push_front(idiomaticVertex);
352 RecognizerMatch::const_iterator prevItr = matchItr - 1;
353 idiomPartBounds.second = prevItr->getVertex();
356 LDEBUG <<
"adding " << idiomPartBounds.first <<
" -> " << idiomPartBounds.second <<
" in edgesToRemove";
358 edgesToRemove.insert(idiomPartBounds);
363 LDEBUG <<
"idiomAlternative has " << idiomAlternative.size() <<
" vertex";
368 deque<LinguisticGraphVertex>::const_iterator idItr=idiomAlternative.begin();
371 while (idItr!=idiomAlternative.end())
377 LDEBUG <<
"added new edge in alternatives linking: " << newEdge.m_source <<
" -> " << newEdge.m_target;
390 LDEBUG <<
"expression is not contextual, only keep alternative";
392 std::set< std::pair< LinguisticGraphVertex, LinguisticGraphVertex > >::const_iterator edgesToRemoveIt, edgesToRemoveIt_end;
393 edgesToRemoveIt = edgesToRemove.begin(); edgesToRemoveIt_end = edgesToRemove.end();
394 for (; edgesToRemoveIt != edgesToRemoveIt_end; edgesToRemoveIt++)
397 LDEBUG <<
"Removing edge " << (*edgesToRemoveIt).first <<
" -> " << (*edgesToRemoveIt).second;
405 recoData->setNextVertex(idiomaticVertex);
409 RecognizerMatch::const_iterator matchItr=result.begin();
410 for (; matchItr!=result.end(); matchItr++)
412 recoData->clearUnreachableVertices( analysis, (*matchItr).getVertex());
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