LIMA
Libre Multilingual Analyzer — C++ API
Loading...
Searching...
No Matches
posTaggingGraphWriter.hpp
Go to the documentation of this file.
1// Copyright 2002-2022 CEA LIST
2// SPDX-FileCopyrightText: 2022 CEA LIST <gael.de-chalendar@cea.fr>
3//
4// SPDX-License-Identifier: MIT
5
6template <typename Graph, typename Vertex> class PosTaggingVertexWriter
7{
8public:
9 PosTaggingVertexWriter(const Graph* graph,
10 MediaId language,
11 const std::deque<std::string>& display):
12 m_graph(graph),
13 m_language(language),
14 m_display(display)
15 {
16 m_propertyCodeManager=&(static_cast<const Common::MediaticData::LanguageData&>(Common::MediaticData::MediaticData::single().mediaData(language)).getPropertyCodeManager());
17 }
18
19 void operator()(std::ostream& out, const Vertex& v) const
20 {
21
22 const Common::PropertyCode::PropertyManager& macroManager = m_propertyCodeManager->getPropertyManager("MACRO");
23 const Common::PropertyCode::PropertyManager& microManager = m_propertyCodeManager->getPropertyManager("MICRO");
24 const FsaStringsPool& stringspool= Common::MediaticData::MediaticData::single().stringsPool(m_language);
25/* if ( (in_degree(v, *m_graph) == 0) && (out_degree(v, *m_graph) == 0) )
26 {
27 return;
28 }*/
29 LinguisticAnalysisStructure::MorphoSyntacticData* data=get(vertex_data,*m_graph,v);
30
31 out << "[label=\"" << v << "\\l";
32 if (data == 0)
33 {
34 out << "no FullToken";
35 }
36 else
37 {
38 LinguisticAnalysisStructure::Token* token=get(vertex_token,*m_graph,v);
39 if (m_display.size()==0)
40 {
41 out << token->stringForm() << " [" << microManager.getPropertyAccessor().readValue(data->begin()->properties) << "] ";
42 }
43 else
44 {
45 for (std::deque<std::string>::const_iterator it=m_display.begin();
46 it!=m_display.end(); it++)
47 {
48 if (it!=m_display.begin())
49 {
50 out << "\\l";
51 }
52 if ( *it == "position" )
53 {
54 out << token->position();
55 }
56 else if (*it == "length" )
57 {
58 out << token->length();
59 }
60 else if (*it == "tstatus" && token->status())
61 {
62 out << Common::Misc::limastring2utf8stdstring(token->status()->defaultKey());
63 }
64 else if (*it == "text")
65 {
66 Lima::LimaString ls=token->stringForm();
67 int index=ls.find_first_of(Lima::LimaChar('"'));
68 if (index!=-1)
69 {
70 ls[index]=Lima::LimaChar('\'');
71 }
72 out << ls;
73 }
74 else if (*it == "inflectedform" )
75 {
76 std::set<StringsPoolIndex> forms=data->allInflectedForms();
77 for (std::set<StringsPoolIndex>::const_iterator formItr=forms.begin();
78 formItr!=forms.end();
79 formItr++)
80 {
81 if (formItr!=forms.begin())
82 {
83 out << "#";
84 }
85 Lima::LimaString ls=stringspool[*formItr];
86 int index=ls.find_first_of(Lima::LimaChar('"'));
87 if (index!=std::string::npos)
88 {
89 ls[index]=Lima::LimaChar('\'');
90 }
91 out << ls;
92 }
93 }
94 else if (*it == "lemme" )
95 {
96 std::set<StringsPoolIndex> forms=data->allLemma();
97 for (std::set<StringsPoolIndex>::const_iterator formItr=forms.begin();
98 formItr!=forms.end();
99 formItr++)
100 {
101 if (formItr!=forms.begin())
102 {
103 out << "#";
104 }
105 Lima::LimaString ls=stringspool[*formItr];
106 int index=ls.find_first_of(Lima::LimaChar('"'));
107 if (index!=std::string::npos)
108 {
109 ls[index]=Lima::LimaChar('\'');
110 }
111 out << ls;
112 }
113 }
114 else if (*it == "symbolicmicrocategory" )
115 {
116 std::set<LinguisticCode> micros;
117 data->allValues(microManager.getPropertyAccessor(),micros);
118 for (std::set<LinguisticCode>::const_iterator it=micros.begin();
119 it!=micros.end();
120 it++)
121 {
122 if (it!=micros.begin())
123 {
124 out << "#";
125 }
126 out << microManager.getPropertySymbolicValue(*it);
127 }
128 }
129 else if (*it == "numericmicrocategory" )
130 {
131 std::set<LinguisticCode> micros;
132 data->allValues(microManager.getPropertyAccessor(),micros);
133 for (std::set<LinguisticCode>::const_iterator it=micros.begin();
134 it!=micros.end();
135 it++)
136 {
137 if (it!=micros.begin())
138 {
139 out << "#";
140 }
141 out << *it;
142 }
143 }
144 else if (*it == "symbolicmacrocategory" )
145 {
146 std::set<LinguisticCode> macros;
147 data->allValues(macroManager.getPropertyAccessor(),macros);
148 for (std::set<LinguisticCode>::const_iterator it=macros.begin();
149 it!=macros.end();
150 it++)
151 {
152 if (it!=macros.begin()) out << "#";
153 out << macroManager.getPropertySymbolicValue(*it);
154 }
155 }
156 else if (*it == "numericmacrocategory" )
157 {
158 std::set<LinguisticCode> macros;
159 data->allValues(macroManager.getPropertyAccessor(),macros);
160 for (std::set<LinguisticCode>::const_iterator it=macros.begin();
161 it!=macros.end();
162 it++)
163 {
164 if (it!=macros.begin()) out << "#";
165 out << *it;
166 }
167 }
168 else if (*it == "genders" )
169 {
170 const Common::PropertyCode::PropertyManager& genderManager = m_propertyCodeManager->getPropertyManager("GENDER");
171 std::set< LinguisticCode > genders;
172 data->allValues(genderManager.getPropertyAccessor(),genders);
173 std::set< LinguisticCode >::const_iterator itgenders, itgenders_end;
174 itgenders = genders.begin(); itgenders_end = genders.end();
175 if ( (itgenders != itgenders_end) && (*itgenders != NONE_1) )
176 {
177 out << genderManager.getPropertySymbolicValue(*itgenders);
178 itgenders++;
179 }
180 for (; itgenders != itgenders_end; itgenders++)
181 {
182 if (*itgenders != NONE_1)
183 {
184 out << "," << genderManager.getPropertySymbolicValue(*itgenders);
185 }
186 }
187 }
188 else if (*it == "numbers" )
189 {
190 const Common::PropertyCode::PropertyManager& numberManager = m_propertyCodeManager->getPropertyManager("NUMBER");
191 std::set< LinguisticCode > numbers;
192 data->allValues(numberManager.getPropertyAccessor(),numbers);
193 std::set< LinguisticCode >::const_iterator itnumbers, itnumbers_end;
194 itnumbers = numbers.begin(); itnumbers_end = numbers.end();
195 if ( (itnumbers != itnumbers_end) && (*itnumbers != NONE_1) )
196 {
197 out << numberManager.getPropertySymbolicValue(*itnumbers);
198 itnumbers++;
199 }
200 for (; itnumbers != itnumbers_end; itnumbers++)
201 if (*itnumbers != NONE_1)
202 out << "," << numberManager.getPropertySymbolicValue(*itnumbers);
203 }
204 else if (*it == "syntax" )
205 {
206 const Common::PropertyCode::PropertyManager& syntaxManager = m_propertyCodeManager->getPropertyManager("SYNTAX");
207 std::set< LinguisticCode > syntax;
208 data->allValues(syntaxManager.getPropertyAccessor(),syntax);
209 std::set< LinguisticCode >::const_iterator itn, itn_end;
210 itn= syntax.begin(); itn_end = syntax.end();
211 if ( (itn!= itn_end) && (*itn != NONE_1) )
212 {
213 out << syntaxManager.getPropertySymbolicValue(*itn);
214 itn++;
215 }
216 for (; itn != itn_end; itn++)
217 {
218 if (*itn != NONE_1)
219 {
220 out << ",L_NONE";
221 }
222 }
223 }
224 }
225 out << "\\l";
226 }
227 }
228 out << "\",fontname=\"Monospace\",fontsize=\"9\"]";
229 }
230 private:
231 const Graph* m_graph;
232 const MediaId m_language;
233 const Common::PropertyCode::PropertyCodeManager* m_propertyCodeManager;
234 std::deque<std::string> m_display;
235};
236
237template <typename Graph, typename Edge> class PosTaggingEdgeWriter {
238 public:
240 MediaId language,
241 const Graph* graph,
244 m_graph(graph),
245 m_trigramMatrix(trigramMatrix),
246 m_bigramMatrix(bigramMatrix) {
247 m_propertyCodeManager=&(static_cast<const Common::MediaticData::LanguageData&>(Common::MediaticData::MediaticData::single().mediaData(language)).getPropertyCodeManager());
248 }
249
250 void operator()(std::ostream& out, const Edge& e) const
251 {
252 const Common::PropertyCode::PropertyManager& microManager = m_propertyCodeManager->getPropertyManager("MICRO");
253
254
255 bool hasNonValidTrigram=false;
256 bool hasNonValidBigram=false;
257
258 std::vector<std::vector<uint64_t> > gramNotFound;
259 std::vector<uint64_t> gram;
260
261 uint64_t cat1(0),cat2(0),cat3(0);
262 LinguisticAnalysisStructure::MorphoSyntacticData* d3=get(vertex_data,*m_graph,target(e,*m_graph));
263 if (d3!=0 && !d3->empty()) {
264 cat3=microManager.getPropertyAccessor().readValue(d3->begin()->properties);
265 }
266 LinguisticAnalysisStructure::MorphoSyntacticData* d2=get(vertex_data,*m_graph,source(e,*m_graph));
267 if (d2!=0 && !d2->empty()) {
268 cat2=microManager.getPropertyAccessor().readValue(d2->begin()->properties);
269 }
270 gram.push_back(cat2);
271 gram.push_back(cat3);
272
273 LinguisticGraphInEdgeIt inItr,inItrEnd;
274 for(boost::tie(inItr,inItrEnd)=in_edges(source(e,*m_graph),*m_graph);
275 inItr!=inItrEnd;
276 inItr++)
277 {
278 LinguisticAnalysisStructure::MorphoSyntacticData* d1=get(vertex_data,*m_graph,source(*inItr,*m_graph));
279 if (d1!=0 && !d1->empty()) {
280 cat1=microManager.getPropertyAccessor().readValue(d1->begin()->properties);
281 }
282 if (m_trigramMatrix != nullptr && !m_trigramMatrix->exists(cat1,cat2,cat3))
283 {
284 hasNonValidTrigram=true;
285 gramNotFound.push_back(gram);
286 gramNotFound.back().insert(gramNotFound.back().begin(),cat1);
287 }
288
289 }
290 if (hasNonValidTrigram)
291 {
292 // check if bigram is valid
293 if (m_bigramMatrix != nullptr && !m_bigramMatrix->exists(cat2,cat3))
294 {
295 gramNotFound.push_back(gram);
296 hasNonValidBigram=true;
297 }
298 }
299
300 out << "[label=\"";
301 for (std::vector<std::vector<uint64_t> >::iterator it=gramNotFound.begin();
302 it!=gramNotFound.end();
303 it++)
304 {
305 copy(it->begin(),it->end(),std::ostream_iterator<uint64_t>(out,","));
306 out << "\\l";
307 }
308 out << "\",style=";
309 if (hasNonValidBigram)
310 {
311 out << "dotted";
312 } else if (hasNonValidTrigram)
313 {
314 out << "dashed";
315 }
316 else
317 {
318 out << "solid";
319 }
320 out << ",fontname=\"Monospace\",fontsize=\"9\"]";
321 }
322
323
324 private:
325 const Graph* m_graph;
328 const Common::PropertyCode::PropertyCodeManager* m_propertyCodeManager;
329 };
LinguisticGraph::in_edge_iterator LinguisticGraphInEdgeIt
@ vertex_token
@ vertex_data
#define NONE_1
Definition StdBitset.h:339
bool exists(LinguisticCode cat1, LinguisticCode cat2) const
bool exists(LinguisticCode cat1, LinguisticCode cat2, LinguisticCode cat3) const
PosTaggingEdgeWriter(MediaId language, const Graph *graph, const Lima::LinguisticProcessing::PosTagger::TrigramMatrix *trigramMatrix, const Lima::LinguisticProcessing::PosTagger::BigramMatrix *bigramMatrix)
void operator()(std::ostream &out, const Edge &e) const
void operator()(std::ostream &out, const Vertex &v) const
PosTaggingVertexWriter(const Graph *graph, MediaId language, const std::deque< std::string > &display)
QChar LimaChar
Definition LimaString.h:30
QString LimaString
Definition LimaString.h:33