SpecificEntityAnnotation:: SpecificEntityAnnotation(const RecognizerMatch& entity, FsaStringsPool& sp) : m_head(0), m_type(entity.getType()), m_features(entity.features()), m_string(sp[entity.getString()]), m_normalizedString(sp[entity.getNormalizedString(sp)]), m_normalizedForm(0), m_position(entity.positionBegin()), m_length(entity.length()) { Automaton::EntityFeatures::const_iterator f=entity.features().find(DEFAULT_ATTRIBUTE); if (f!=entity.features().end()) { m_normalizedForm=sp[boost::any_cast<const LimaString&>((*f).getValue())]; } if (entity.getHead() == 0) { m_head = entity[0].m_elem.first; } else { m_head = entity.getHead(); } m_vertices.reserve(entity.size()); Automaton::RecognizerMatch::const_iterator it, it_end; it = entity.begin(); it_end = entity.end(); for (; it != it_end; it++) { if ( (*it).m_elem.second ) { m_vertices.push_back((*it).m_elem.first); } } }
void CreateIdiomaticAlternative::removeEdges( LinguisticGraph& graph, const RecognizerMatch& match, AnalysisContent& analysis) const { #ifdef DEBUG_LP MORPHOLOGINIT; LDEBUG << "IdiomaticAlternatives: removing edges"; #endif /* if (first == last) { LDEBUG << " first and last are equal => ignoring"; return; }*/ RecognizerData* recoData=static_cast<RecognizerData*>(analysis.getData("RecognizerData")); std::set< LinguisticGraphVertex > matchVertices; Automaton::RecognizerMatch::const_iterator matchIt, matchIt_end; // noeuds eventuellement pendants a verifier std::set< LinguisticGraphVertex > verticesToCheck; matchIt = match.begin(); matchIt_end = match.end(); for (; matchIt != matchIt_end; matchIt++) { matchVertices.insert((*matchIt).m_elem.first); } matchIt = match.begin(); matchIt_end = match.end(); // parcours des noeuds du match for (; matchIt != matchIt_end; matchIt++) { LinguisticGraphOutEdgeIt outIt, outIt_end; boost::tie (outIt, outIt_end) = boost::out_edges((*matchIt).m_elem.first, graph); // pour chaque arc sortant du noeud for (; outIt != outIt_end; outIt++) { // l'arc n'est pas membre du match if (matchVertices.find(target(*outIt, graph)) != matchVertices.end()) { // on le stocke comme a supprimer recoData->setEdgeToBeRemoved(analysis, *outIt); // il va falloir verifier si le noeud cible de l'arc ne se retrouve pas pendant quand on aura supprime l'arc verticesToCheck.insert(target(*outIt, graph)); } } LinguisticGraphInEdgeIt inIt, inIt_end; boost::tie (inIt, inIt_end) = boost::in_edges((*matchIt).m_elem.first, graph); // pour chaque arc entrant du noeud for (; inIt != inIt_end; inIt++) { // l'arc n'est pas membre du match if (matchVertices.find(source(*inIt, graph)) != matchVertices.end()) { // on le stocke comme a supprimer recoData->setEdgeToBeRemoved(analysis, *inIt); // il va falloir verifier si le noeud source de l'arc ne se retrouve pas pendant quand on aura supprime l'arc verticesToCheck.insert(source(*inIt, graph)); } } } // suppression des arcs stockes comme a supprimer recoData->removeEdges( analysis ); //verification des noeuds extremites des arcs supprimes std::set< LinguisticGraphVertex >::const_iterator verticesToCheckIt, verticesToCheckIt_end; verticesToCheckIt = verticesToCheck.begin(); verticesToCheckIt_end = verticesToCheck.end(); for (;verticesToCheckIt != verticesToCheckIt_end; verticesToCheckIt++) { recoData->clearUnreachableVertices(analysis, *verticesToCheckIt); } }