20#include <boost/tuple/tuple.hpp>
29namespace LinguisticProcessing {
44m_wordSet(wordSet.begin(),wordSet.end()),
51m_wordSet(t.m_wordSet),
72 std::set<LimaString>::const_iterator it = m_wordSet.begin();
73 if( it != m_wordSet.end() ) {
78 for( it++ ; it != m_wordSet.end(); it++ ) {
114 std::set<LimaString>::const_iterator it = m_wordSet.lower_bound(form);
115 if( it == m_wordSet.end() ) {
118 QString element = *it;
120 if( element == form )
125 if( element.startsWith(form) )
127 if( element.at(form.length()) ==
' ')
149 deque<LinguisticGraphVertex>& vertices,
158 std::vector<std::vector<LimaString> > additionalMultiTermList;
159 buildNextTermsList( firstSimpleTerm, additionalMultiTermList );
161 std::stack<std::deque<LinguisticGraphVertex>,std::vector<deque<LinguisticGraphVertex> > > triggerMatches;
162 checkMultiTerms(graph, vertex, limit, searchGraph, analysis, additionalMultiTermList, triggerMatches );
163 if( triggerMatches.empty() ) {
165 LDEBUG <<
"GazeteerTransition::matchPath from" <<vertex<<
": no match";
170 vertices = triggerMatches.top();
173 std::copy(vertices.begin(),vertices.end(),std::ostream_iterator<int>(oss,
"-"));
174 LDEBUG <<
"GazeteerTransition::matchPath from" <<vertex<<
": found match with vertices" << oss.str();
186bool GazeteerTransition::
187buildNextTermsList(
const LimaString& firstSimpleTerm, std::vector<std::vector<LimaString> >& multiTermList )
const
195 std::set<LimaString>::const_iterator it = m_wordSet.lower_bound(firstSimpleTerm);
196 if( it == m_wordSet.end() ) {
202 for( ; it != m_wordSet.end() ; it++ )
209 if( !element.startsWith(firstSimpleTerm) ) {
215 std::vector<LimaString> multiTerm;
217 if( element == firstSimpleTerm ) {
221 multiTerm.push_back(firstSimpleTerm);
222 multiTermList.push_back(multiTerm);
228 int index = element.indexOf(
' ', pos);
232 if( index != firstSimpleTerm.length() ) {
242 multiTerm.push_back(firstSimpleTerm);
247 index = element.indexOf(
' ', pos);
255 multiTerm.push_back(element.mid(pos));
263 multiTerm.push_back(element.mid(pos,index-pos));
269 multiTermList.push_back(multiTerm);
271 return( multiTermList.size() > 0 );
274bool GazeteerTransition::
279 Lima::AnalysisContent& analysis,
const vector< vector< Lima::LimaString > >& additionalMultiTermList,
280 stack< deque< LinguisticGraphVertex >, vector< deque< LinguisticGraphVertex > > >& matches
291 std::vector<std::vector<LimaString> >::const_iterator multiTermsIt = additionalMultiTermList.begin();
293 for( ; multiTermsIt != additionalMultiTermList.end() ; multiTermsIt++ ) {
295 std::vector<LimaString>::const_iterator termsIt = (*multiTermsIt).begin();
296 std::vector<LimaString>::const_iterator termsIt_end = (*multiTermsIt).end();
304 std::deque<LinguisticGraphVertex> triggerMatch;
305 triggerMatch.push_back(position);
308 std::unique_ptr<SearchGraph> tempSearchGraph(searchGraph->
createNew());
309 tempSearchGraph->findNextVertices(lGraph, position);
315 if(termsIt == termsIt_end ) {
320 matches.push(triggerMatch);
325 while ( tempSearchGraph->getNextVertex(lGraph, nextVertex )) {
328 if (nextVertex == lastVertex || nextVertex == firstVertex)
338 if( form == *termsIt ) {
344 triggerMatch.push_back(nextVertex);
346 tempSearchGraph->findNextVertices(lGraph, nextVertex);
348 if(termsIt == termsIt_end ) {
355 if( matches.empty() || (triggerMatch.size() > matches.top().size()) ) {
359 matches.push(triggerMatch);
370 if( matches.empty() )
LinguisticGraph::vertex_descriptor LinguisticGraphVertex
boost::adjacency_list< boost::vecS, boost::vecS, boost::bidirectionalS, LinguisticVertexProperties > LinguisticGraph
Property to identify the chains in the graph.
Holds all data that pass through the ProcessUnits Analysis data are shared pointers,...
GazeteerTransition & operator=(const GazeteerTransition &)
std::string printValue() const override
virtual ~GazeteerTransition()
bool matchPath(const LinguisticAnalysisStructure::AnalysisGraph &graph, const LinguisticGraphVertex &vertex, const LinguisticGraphVertex &limit, const SearchGraph *searchGraph, AnalysisContent &analysis, const LinguisticAnalysisStructure::Token *token, std::deque< LinguisticGraphVertex > &vertices, const LinguisticAnalysisStructure::MorphoSyntacticData *) const
TypeTransition type() const override
bool compare(const LinguisticAnalysisStructure::AnalysisGraph &graph, const LinguisticGraphVertex &vertex, AnalysisContent &analysis, const LinguisticAnalysisStructure::Token *token, const LinguisticAnalysisStructure::MorphoSyntacticData *data) const override
comparison of the transition with a token : can use the graph and vertex info, associated with genera...
bool operator==(const TransitionUnit &) const override
virtual SearchGraph * createNew() const =0
bool compareProperties(const TransitionUnit &t) const
virtual TypeTransition type() const =0
void copyProperties(const TransitionUnit &t)
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.
Holds morphosyntactic informations.
holds surface data of a token
const LimaString & stringForm() const
std::string limastring2utf8stdstring(const Lima::LimaString &phrase, uint32_t size0)
Convert a wide string to a string , in dest up to size bytes.