209 LINFO <<
"start SvmToolPosTager";
216 auto anagraph = std::dynamic_pointer_cast<AnalysisGraph>(analysis.
getData(
"AnalysisGraph"));
217 auto srcgraph = anagraph->getGraph();
218 auto endVx = anagraph->lastVertex();
228 analysis.
setData(
"PosGraph",posgraph);
231 auto annotationData = std::dynamic_pointer_cast<AnnotationData>(analysis.
getData(
"AnnotationData"));
232 if (annotationData==0)
234 annotationData = std::make_shared<AnnotationData>();
238 if (std::dynamic_pointer_cast<AnalysisGraph>(analysis.
getData(
"AnalysisGraph")) != 0)
241 analysis.
getData(
"AnalysisGraph").get())->populateAnnotationGraph(
242 annotationData.get(),
245 analysis.
setData(
"AnnotationData",annotationData);
250 if (num_vertices(*srcgraph)<=2)
258 remove_edge(posgraph->firstVertex(),posgraph->lastVertex(),*resultgraph);
260 const auto& propertyCodeManager =
static_cast<const LanguageData&
>(
261 MediaticData::single().mediaData(m_d->m_language)).getPropertyCodeManager();
263 const auto& propertyManagers = propertyCodeManager.getPropertyManagers();
266 std::ostringstream oss(
"");
268 std::vector< LinguisticGraphVertex > anaVertices;
269 while (currentVx != endVx)
271 if (currentVx != 0 && tokens[currentVx] != 0)
273 auto tok = tokens[currentVx];
274 QString token = tok->stringForm();
277 if (token.contains(
'\n'))
280 LWARN <<
"Error in SVMTagger. Invalid token with newline(s):" << token;
281 LWARN <<
"Avoiding the problem but the tokenizer should be checked.";
283 if (token == QString::fromUtf8(
"\n")) token = QString::fromUtf8((
char*)u8
"\u200B");
284 token = token.trimmed();
285 token.replace(
" ",
"_");
286 token.replace(
"\n", QString::fromUtf8((
char*)u8
"\u200B"));
287 std::ostringstream lineoss(
"");
288 lineoss << token.toStdString() <<
" (";
289 auto morphoData = get(
vertex_data,*srcgraph,currentVx);
290 for (
auto morphDataIt = morphoData->begin();
291 morphDataIt != morphoData->end(); morphDataIt++)
293 if (morphDataIt != morphoData->begin())
298 QTextStream tagStream(&fullTag);
299 auto tag = microManager.getPropertySymbolicValue(
300 (*morphDataIt).properties);
301 tagStream << QString::fromUtf8(tag.c_str());
302 if (m_d->m_allFeatures ||!m_d->m_features.isEmpty())
304 QStringList features;
305 for (
auto propItr = propertyManagers.cbegin();
306 propItr != propertyManagers.cend(); propItr++)
308 if (!propItr->second.getPropertyAccessor().empty((*morphDataIt).properties))
310 auto property = QString::fromUtf8(propItr->first.c_str());
311 auto value = QString::fromUtf8(
312 propItr->second.getPropertySymbolicValue(
313 (*morphDataIt).properties).c_str());
314 if (property !=
"MACRO" && property !=
"MICRO"
315 && (m_d->m_allFeatures || m_d->m_features.contains(property)))
317 features << QString(
"%1=%2").arg(property).arg(value);
322 if (!features.isEmpty())
325 for (
auto it = features.cbegin(); it != features.cend(); it++)
327 if (it != features.cbegin())
335 lineoss << fullTag.toUtf8().constData();;
338 lineoss << std::endl;
339 oss << lineoss.str();
340 anaVertices.push_back(currentVx);
343 boost::tie(it, it_end) = boost::out_edges(currentVx, *srcgraph);
346 currentVx = boost::target(*it, *srcgraph);
354 LDEBUG <<
"Tagging '" << oss.str() <<
"'";
356 std::istringstream iss(oss.str());
358 std::stringstream resOss;
364 m_d->m_tagger->taggerInit(iss, resOss);
365 m_d->m_tagger->taggerRun();
368 resOss.seekp(0, std::ios::beg);
369 std::string resultLine;
370 std::vector<LinguisticGraphVertex>::size_type anaVerticesIndex = 0;
372 while (anaVerticesIndex < anaVertices.size()
373 && std::getline(resOss,resultLine))
376 LDEBUG <<
"Result line: '" << resultLine <<
"'";
382 auto elements = QString::fromStdString(resultLine).split(
" ");
383 elements[0] = elements[0].trimmed();
384 if (elements.size() < 2)
387 LERROR <<
"Error in SVMTagger result line: did not get 2 elements in '"
388 << resultLine <<
"'";
389 LERROR <<
"Was tagging '" << oss.str() <<
"'";
392 auto anaVertex = anaVertices[anaVerticesIndex];
393 auto currentAnaToken = tokens[anaVertex];
394 QString token = currentAnaToken->stringForm();
397 if (token.contains(
'\n'))
400 LWARN <<
"Error in SVMTagger. Invalid token with newline(s):" << token;
401 LWARN <<
"Avoiding the problem but the tokenizer should be checked.";
403 if (token == QString::fromUtf8(
"\n")) token = QString::fromUtf8((
char*)u8
"\u200B");
404 token = token.trimmed();
405 token.replace(
" ",
"_");
406 token.replace(
"\n", QString::fromUtf8((
char*)u8
"\u200B"));
407 if (token != elements[0])
410 LERROR <<
"Error in SVMTagger result alignement with analysis graph: got '"
411 << elements[0] <<
"' with tag '"<< elements[1] <<
"' from SVMTagger and '"
412 << token <<
"' from graph";
416 auto newVx = boost::add_vertex(*resultgraph);
417 auto agv = annotationData->createAnnotationVertex();
418 annotationData->addMatching(
"PosGraph", newVx,
"annot", agv);
419 annotationData->addMatching(
"AnalysisGraph", anaVertex,
"PosGraph", newVx);
420 annotationData->annotate(agv, QString::fromUtf8(
"PosGraph"), newVx);
423 auto morphoData = get(
vertex_data,*srcgraph,anaVertex);
430 microManager.getPropertyValue(elements[1].toStdString()));
431 std::back_insert_iterator<MorphoSyntacticData> backInsertItr(*posData);
432 remove_copy_if(morphoData->begin(),
436 if (posData->empty() || morphoData->empty())
439 LWARN <<
"No matching category found for tagger result "
440 << elements[0] <<
" " << elements[1];
441 if (!morphoData->empty())
443 LWARN <<
"Taking any one";
444 posData->push_back(morphoData->front());
451 boost::add_edge(previousPosVertex, newVx, *resultgraph);
453 previousPosVertex = newVx;
456 boost::add_edge(previousPosVertex, posgraph->lastVertex(), *resultgraph);
459 LINFO <<
"SvmToolPosTagger postagging done.";
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
void setData(const QString &id, std::shared_ptr< AnalysisData > data)
set an analysisData with the given id.