LIMA
Libre Multilingual Analyzer — C++ API
Loading...
Searching...
No Matches
TextDumper.cpp
Go to the documentation of this file.
1// Copyright 2002-2020 CEA LIST
2// SPDX-FileCopyrightText: 2022 CEA LIST <gael.de-chalendar@cea.fr>
3//
4// SPDX-License-Identifier: MIT
5
6/***************************************************************************
7 * Copyright (C) 2004-2020 by CEA LIST *
8 * *
9 ***************************************************************************/
10#include "TextDumper.h"
11// #include "linguisticProcessing/core/LinguisticProcessors/DumperStream.h"
26
27#include <boost/algorithm/string/replace.hpp>
28
29#include <fstream>
30#include <queue>
31
32using namespace std;
33//using namespace boost;
34using namespace boost::tuples;
36using namespace Lima::Common;
37using namespace Lima::Common::MediaticData;
38using namespace Lima::Common::PropertyCode;
40
41namespace Lima
42{
43
44namespace LinguisticProcessing
45{
46
47namespace AnalysisDumpers
48{
49
51
54m_language(0),
55m_property("MICRO"),
56m_propertyAccessor(0),
57m_propertyManager(0),
58m_graph("PosGraph"),
59m_sep(" | "),
60m_sepPOS("#"),
61m_followGraph(false)
62{}
63
64
67
69 Manager* manager)
70
71{
72 AbstractTextualAnalysisDumper::init(unitConfiguration,manager);
73
74 m_language=manager->getInitializationParameters().media;
75 try
76 {
77 m_graph=unitConfiguration.getParamsValueAtKey("graph");
78 }
79 catch (NoSuchParam& ) {} // keep default value
80
81 if (m_graph=="AnalysisGraph") {
82 // change default for followGraph
83 m_followGraph=true;
84 }
85 //Ajout
86 try {
87 m_verbTenseFlag=unitConfiguration.getParamsValueAtKey("verbTenseFlag");
88 }
89 catch (NoSuchParam& ) {
90 m_verbTenseFlag=string("False");
91 } // keep default value
92 //---
93
94 try {
95 m_sep=unitConfiguration.getParamsValueAtKey("sep");
96 }
97 catch (NoSuchParam& ) {} // keep default value
98
99 try {
100 m_sepPOS=unitConfiguration.getParamsValueAtKey("sepPOS");
101 }
102 catch (NoSuchParam& ) {} // keep default value
103
104 try {
105 m_property=unitConfiguration.getParamsValueAtKey("property");
106 }
107 catch (NoSuchParam& ) {} // keep default value
108
109 try {
110 std::string str=unitConfiguration.getParamsValueAtKey("followGraph");
111 if (str=="1" || str=="true" || str=="yes") {
112 m_followGraph=true;
113 }
114 else {
115 m_followGraph=false;
116 }
117 }
118 catch (NoSuchParam& ) {} // keep default value
119
120 const auto& codeManager=static_cast<const LanguageData&>(Common::MediaticData::MediaticData::single().mediaData(m_language)).getPropertyCodeManager();
121 m_propertyAccessor=&codeManager.getPropertyAccessor(m_property);
122 m_propertyManager=&codeManager.getPropertyManager(m_property);
123
124 QString timeCode = static_cast<const LanguageData&>(
125 Common::MediaticData::MediaticData::single().mediaData(m_language)).getLimaToLanguageCodeMappingValue("TIME");
126 m_timeManager=&codeManager.getPropertyManager(timeCode.toUtf8().constData());
127 m_timeAccessor=&codeManager.getPropertyAccessor(timeCode.toUtf8().constData());
128}
129
131 AnalysisContent& analysis) const
132{
134 auto metadata = std::dynamic_pointer_cast<LinguisticMetaData>(analysis.getData("LinguisticMetaData"));
135 if (metadata == 0) {
136 LERROR << "no LinguisticMetaData ! abort";
137 return MISSING_DATA;
138 }
139
140 auto dstream = initialize(analysis);
141
142 map<Token*,vector<MorphoSyntacticData*>,lTokenPosition > categoriesMapping;
143
144 auto tokenList = std::dynamic_pointer_cast<AnalysisGraph>(analysis.getData(m_graph));
145 if (tokenList==0) {
146 LERROR << "graph " << m_graph << " has not been produced: check pipeline";
147 return MISSING_DATA;
148 }
149 LinguisticGraph* graph=tokenList->getGraph();
151
152 if (m_followGraph) {
153 // instead of looking to all vertices, follow the graph (in
154 // morphological graph, some vertices are not related to main graph:
155 // idiomatic expressions parts and named entity parts)
156
157 std::queue<LinguisticGraphVertex> toVisit;
158 std::set<LinguisticGraphVertex> visited;
159 toVisit.push(tokenList->firstVertex());
160
161 LinguisticGraphOutEdgeIt outItr,outItrEnd;
162 while (!toVisit.empty()) {
163 LinguisticGraphVertex v=toVisit.front();
164 toVisit.pop();
165 if (v == tokenList->lastVertex()) {
166 continue;
167 }
168
169 for (boost::tie(outItr,outItrEnd)=out_edges(v,*graph); outItr!=outItrEnd; outItr++)
170 {
171 LinguisticGraphVertex next=target(*outItr,*graph);
172 if (visited.find(next)==visited.end())
173 {
174 visited.insert(next);
175 toVisit.push(next);
176 }
177 }
178
179 Token* ft=get(vertex_token,*graph,v);
180 if( ft!=0) {
181 categoriesMapping[ft].push_back(get(vertex_data,*graph,v));
182 }
183 }
184 }
185 else { // output all vertices
186 LinguisticGraphVertexIt vxItr,vxItrEnd;
187 boost::tie(vxItr,vxItrEnd) = vertices(*graph);
188 for (;vxItr!=vxItrEnd;vxItr++)
189 {
190 Token* ft=get(vertex_token,*graph,*vxItr);
191 if( ft!=0)
192 {
193 categoriesMapping[ft].push_back(get(vertex_data,*graph,*vxItr));
194 }
195 }
196 }
197
198 for (map<Token*,vector<MorphoSyntacticData*>,lTokenPosition >::const_iterator ftItr=categoriesMapping.begin();
199 ftItr!=categoriesMapping.end();
200 ftItr++)
201 {
202 outputVertex(dstream->out(),ftItr->first,ftItr->second,sp,metadata->getStartOffset());
203 }
204
205 return SUCCESS_ID;
206}
207
208
209void TextDumper::outputVertex(std::ostream& out,
210 const Token* ft,
211 const vector<MorphoSyntacticData*>& data,
212 const FsaStringsPool& sp,
213 uint64_t offset) const
214{
215
216 ltNormProperty sorter(*m_propertyAccessor);
217
218// uint64_t nbmicros=ft->countMicros();
219 std::ostringstream os;
220 uint64_t position=ft->position() + offset;
221 os << position << m_sep;
222 out << os.str();
223 outputString(out,Common::Misc::limastring2utf8stdstring(ft->stringForm()));
224 for (vector<MorphoSyntacticData*>::const_iterator dataItr=data.begin(),
225 dataItr_end=data.end(); dataItr!=dataItr_end; dataItr++)
226 {
227 MorphoSyntacticData* data=*dataItr;
228 sort(data->begin(),data->end(),sorter);
229 StringsPoolIndex norm(0),curNorm(0);
230 LinguisticCode micro,curMicro,tense,curTense;
231 for (MorphoSyntacticData::const_iterator elemItr=data->begin();
232 elemItr!=data->end();
233 elemItr++)
234 {
235 curNorm=elemItr->normalizedForm;
236 curMicro=m_propertyAccessor->readValue(elemItr->properties);
237 curTense=m_timeAccessor->readValue(elemItr->properties); //ajout
238 if ((curNorm != norm) || (curMicro != micro)) {
239 norm=curNorm;
240 micro=curMicro;
241 tense=curTense; //ajout
242
243 std::ostringstream os2;
244 os2 << m_sep;
245 out << os2.str();
246 outputString(out,Common::Misc::limastring2utf8stdstring(sp[norm]));
247 std::ostringstream os3;
248 os3 << m_sepPOS << m_propertyManager->getPropertySymbolicValue(curMicro);
249 out << os3.str();
250 /*modifications pour afficher le temps des verbes*/
251 if(m_verbTenseFlag == "True"){
252 std::ostringstream os4;
253 bool wordIsVerb = false;
254 std::string::size_type subStrPos = m_propertyManager->getPropertySymbolicValue(curMicro).find("V");
255 if (subStrPos != std::string::npos){
256 wordIsVerb = true;
257 }
258 if (wordIsVerb == true){
259 if (m_timeManager->getPropertySymbolicValue(curTense) != "NONE"){
260 os4 << m_sep << m_timeManager->getPropertySymbolicValue(curTense);
261 }
262 else {
263 os4 << m_sep << m_propertyManager->getPropertySymbolicValue(curMicro);
264 }
265 }
266 else{os4 << m_sep << m_timeManager->getPropertySymbolicValue(curTense);}
267 out << os4.str();
268 }
269 /*fin des modifications*/
270 }
271 }
272 }
273 out << endl;
274}
275
276// output string: escape endline characters and separator characters
277void TextDumper::outputString(std::ostream& out,const std::string& str) const
278{
279 string newstr(str);
280 boost::replace_all(newstr,"\n","\n");
281 //boost::replace_all(newstr,m_sep,"\"+m_sep);
282 out << newstr;
283}
284
285
286} // end namespace
287} // end namespace
288} // end namespace
#define LERROR
Definition LimaCommon.h:161
A graph structure for linguistic analysis.
LinguisticGraph::vertex_iterator LinguisticGraphVertexIt
@ vertex_token
LinguisticGraph::vertex_descriptor LinguisticGraphVertex
@ vertex_data
LinguisticGraph::out_edge_iterator LinguisticGraphOutEdgeIt
boost::adjacency_list< boost::vecS, boost::vecS, boost::bidirectionalS, LinguisticVertexProperties > LinguisticGraph
Property to identify the chains in the graph.
#define DUMPERLOGINIT
Defines a Factory to create Object of type Base.
#define TEXTDUMPER_CLASSID
Definition TextDumper.h:32
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
Holds linguistic data for one language.
const FsaStringsPool & stringsPool(MediaId med) const
const MediaData & mediaData(MediaId media) const
LinguisticCode readValue(const LinguisticCode &code) const
read a property in a coded int.
const std::string & getPropertySymbolicValue(const LinguisticCode &value) const
The coded property value can hold several property data.
return a message when a 'param' was not found
Manage initialization of InitializableObjects using configuration module and parameters.
const InitializationParameters & getInitializationParameters() const
get Initialization Parameters
std::shared_ptr< DumperStream > initialize(AnalysisContent &analysis) const
virtual void init(Common::XMLConfigurationFiles::GroupConfigurationStructure &unitConfiguration, Manager *manager) override
initialize with parameters from configuration file.
void init(Common::XMLConfigurationFiles::GroupConfigurationStructure &unitConfiguration, Manager *manager) override
initialize with parameters from configuration file.
LimaStatusCode process(AnalysisContent &analysis) const override
Process on data in analysisContent.
static const MediaticData & single()
const singleton accessor
Definition Singleton.h:51
std::string limastring2utf8stdstring(const Lima::LimaString &phrase, uint32_t size0)
Convert a wide string to a string , in dest up to size bytes.
SimpleFactory< MediaProcessUnit, TextDumper > textDumperFactory(TEXTDUMPER_CLASSID)
NAUTITIA.
LimaStatusCode
Definition LimaCommon.h:236
@ SUCCESS_ID
Definition LimaCommon.h:237
@ MISSING_DATA
Definition LimaCommon.h:243
STL namespace.
PUGI__FN void sort(I begin, I end, const Pred &pred)
Definition pugixml.cpp:7549
launch exception related to the configuration file parsing