122 auto anagraph = std::dynamic_pointer_cast<AnalysisGraph>(analysis.
getData(
"AnalysisGraph"));
123 if (anagraph ==
nullptr)
126 LERROR <<
"Can't Process RnnTokensAnalyzer: missing data 'AnalysisGraph'";
129 auto srcgraph = anagraph->getGraph();
130 auto endVx = anagraph->lastVertex();
139 analysis.
setData(
"PosGraph", posgraph);
140 const auto& propertyCodeManager =
dynamic_cast<const LanguageData&
>(
141 MediaticData::single().mediaData(m_d->
m_language)).getPropertyCodeManager();
142 const auto& microManager = propertyCodeManager.getPropertyManager(
"MICRO");
144 auto annotationData = std::dynamic_pointer_cast< AnnotationData >(analysis.
getData(
"AnnotationData"));
145 if (annotationData ==
nullptr)
147 annotationData = std::make_shared<AnnotationData>();
151 if (std::dynamic_pointer_cast<AnalysisGraph>(analysis.
getData(
"AnalysisGraph")) !=
nullptr)
153 std::dynamic_pointer_cast<AnalysisGraph>(analysis.
getData(
"AnalysisGraph"))->populateAnnotationGraph(
154 annotationData.get(),
"AnalysisGraph");
156 analysis.
setData(
"AnnotationData", annotationData);
158 if (num_vertices(*srcgraph)<=2)
164 auto currentVx = anagraph->firstVertex();
165 auto resultgraph = posgraph->getGraph();
166 remove_edge(posgraph->firstVertex(), posgraph->lastVertex(), *resultgraph);
174 std::set<LinguisticGraphVertex> sentenceFinalVertices;
176 auto sd = std::dynamic_pointer_cast<SegmentationData>(
177 analysis.
getData(
"SentenceBoundaries"));
180 for (
const auto& segment : sd->getSegments())
182 const auto endV = segment.getLastVertex();
183 if (vTokens[endV] !=
nullptr)
186 sentenceFinalVertices.insert(endV);
193 for (boost::tie(ie, ie_end) = boost::in_edges(endV, *srcgraph);
196 const auto s = boost::source(*ie, *srcgraph);
197 if (vTokens[s] !=
nullptr)
199 sentenceFinalVertices.insert(s);
207 std::vector<segmentation::token_pos> buffer;
208 std::vector< LinguisticGraphVertex > anaVertices;
209 std::vector<std::string> v;
211 while(currentVx != endVx)
213 if (currentVx != 0 && vTokens[currentVx] !=
nullptr)
215 const auto& src = vTokens[currentVx];
216 v.push_back(src->stringForm().toStdString());
217 buffer.emplace_back();
218 anaVertices.push_back(currentVx);
221 boost::tie(it, it_end) = boost::out_edges(currentVx, *srcgraph);
224 currentVx = boost::target(*it, *srcgraph);
234 for(
unsigned long k = 0; k < anaVertices.size(); k++)
236 currentVx = anaVertices[k];
237 if (currentVx != 0 && vTokens[currentVx] !=
nullptr)
239 const auto& src = vTokens[currentVx];
240 auto& token = buffer[k];
241 token.m_offset = src->position();
248 token.m_len = v[k].size();
249 token.m_pch = v[k].c_str();
254 token.m_flags = (sentenceFinalVertices.count(currentVx) > 0)
255 ? token_flags_t::sentence_brk
256 : token_flags_t::none;
260 std::vector<LinguisticGraphVertex>::size_type anaVerticesIndex = 0;
261 auto previousPosVertex = posgraph->firstVertex();
266 while (anaVerticesIndex < anaVertices.size())
268 auto anaVertex = anaVertices[anaVerticesIndex];
269 auto newVx = boost::add_vertex(*resultgraph);
270 auto agv = annotationData->createAnnotationVertex();
271 annotationData->addMatching(
"PosGraph", newVx,
"annot", agv);
272 annotationData->addMatching(
"AnalysisGraph", anaVertex,
"PosGraph", newVx);
273 annotationData->annotate(agv, QString::fromUtf8(
"PosGraph"), newVx);
282 auto propertyManager = microManager;
285 propertyManager = propertyCodeManager.getPropertyManager(
"MICRO");
287 else if(name==
"ExtPos" || name==
"Style")
291 else if(name==
"xpos")
293 propertyManager = propertyCodeManager.getPropertyManager(
"MACRO");
297 propertyManager = propertyCodeManager.getPropertyManager(name);
299 auto value = propertyManager.getPropertyValue(m_d->
m_tags[anaVerticesIndex][name]);
303 propertyManager.getPropertyAccessor().writeValue(value, lElement.
properties);
306 auto sp = &MediaticData::changeable().stringsPool(m_d->
m_language);
308 posData->push_back(lElement);
313 boost::add_edge(previousPosVertex, newVx, *resultgraph);
315 previousPosVertex = newVx;
318 boost::add_edge(previousPosVertex, posgraph->lastVertex(), *resultgraph);
329 LOG_MESSAGE_WITH_PROLOG(
LDEBUG,
"RnnTokensAnalyzerPrivate::init tagger model: " << tagger_model_prefix <<
" lemmatizer model: " << lemmatizer_model_prefix);
331 QString lang_str = MediaticData::single().media(
m_language).c_str();
332 QString resources_path = MediaticData::single().getResourcesPath().c_str();
333 QString tagger_model_name = tagger_model_prefix;
334 QString lemmatizer_model_name = lemmatizer_model_prefix;
336 MediaticData::single().getOptionValue(
"udlang", udlang);
341 "RnnTokensAnalyzerPrivate::init: Can't parse language id " << udlang.c_str(),
345 tagger_model_name.replace(QString(
"$udlang"), QString(udlang.c_str()));
346 lemmatizer_model_name.replace(QString(
"$udlang"), QString(udlang.c_str()));
349 QString::fromUtf8(
"/RnnTagger/%1/%2.pt")
350 .arg(lang_str, tagger_model_name));
352 QString::fromUtf8(
"/RnnLemmatizer/%1/%2.pt")
353 .arg(lang_str, lemmatizer_model_name));
355 QString::fromUtf8(
"/RnnLemmatizer/%1/%2.dic")
356 .arg(lang_str, lemmatizer_model_name));
357 if (tagger_model_file_name.isEmpty())
361 if (lemmatizer_model_file_name.isEmpty())
364 lemmatizer_model_file_name =
"";
367 m_load_fn = [
this, tagger_model_file_name, lemmatizer_model_file_name, lemmatizer_dictionary_file_name]()
374 m_tokensAnalyzer = std::make_shared< TokenSequenceAnalyzer<> >(tagger_model_file_name.toStdString(),
375 lemmatizer_model_file_name.toStdString(),
376 lemmatizer_dictionary_file_name.toStdString(),