LIMA
Libre Multilingual Analyzer — C++ API
Loading...
Searching...
No Matches
languageData.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 by CEA - LIST *
8 * *
9 ***************************************************************************/
10
11#include "languageData.h"
12
13// #include "linguisticData.h"
23
24#include <string>
25#include <fstream>
26#include <QtCore/QDebug>
27#include <QtCore/QFileInfo>
28#include <QtCore/QString>
29#include <QtCore/QStringList>
30
31using namespace std;
33using namespace Lima::Common::PropertyCode;
34
35
36namespace Lima
37{
38namespace Common
39{
40namespace MediaticData
41{
42
44{
45 friend class LanguageData;
46
48
49 virtual ~LanguageDataPrivate();
50
51 void initPropertyCode(
52 const std::string& resourcesPath,
54
55 //void initSentenceBreakMicros(XMLConfigurationFileParser& conf);
56 void initEmptyMicroCategories(XMLConfigurationFileParser& conf);
57 void initEmptyMacroCategories(XMLConfigurationFileParser& conf);
58 void initHomoSyntagmaticChainsAndRelationsTypes(XMLConfigurationFileParser& configParser);
59 void initCompoundTensesDefinitions(XMLConfigurationFileParser& configParser);
60 void initConjugatedVerbs(XMLConfigurationFileParser& conf);
61 void initPropositionIntroductors(XMLConfigurationFileParser& conf);
62 void initNounPhraseHeadMicroCategories(XMLConfigurationFileParser& conf);
63 void initDefiniteMicroCategories(XMLConfigurationFileParser& conf);
64 void initSyntacticRelations(XMLConfigurationFileParser& conf);
65 void initLimaToLanguageCodeMapping(XMLConfigurationFileParser& conf);
66
67 LanguageData* m_p;
68 MediaId m_language;
69
70 PropertyCode::PropertyCodeManager m_propCodeManager;
71
72 std::list< LinguisticCode > m_sentenceBreakMicros;
73
80 std::set< LinguisticCode > m_emptyMacroCategories;
81
85 std::set< LinguisticCode > m_emptyMicroCategories;
86
90 std::set< LinguisticCode > m_conjugatedVerbs;
91
95 std::set< LinguisticCode > m_nounPhraseHeadMicroCategories;
96
100 std::set< LinguisticCode > m_definiteMicroCategories;
101
105 std::set< LinguisticCode > m_propositionIntroductors;
106
107 std::multimap<ChainsType, uint64_t> m_homoSyntagmaticChainsAndRelationsTypes;
108
109 std::map< std::pair<LinguisticCode, LinguisticCode>, LinguisticCode > m_compoundTenseDefiniton;
110
111 static const std::string s_emptycateg;
112
113 std::map< LinguisticCode, ConceptType > m_macro2ConceptMapping;
114
115 std::map< std::string, SyntacticRelationId > m_syntacticRelations;
116
117 std::map<QString, QString> m_limaToLanguageCodeMapping;
118
119public:
120 QDebug single(MediaId m_language);
121}
122; // end class
123
124LanguageDataPrivate::LanguageDataPrivate(LanguageData* ld) :
125 m_p(ld)
126{
127}
128
129LanguageDataPrivate::~LanguageDataPrivate()
130{
131}
132
133
134const std::string LanguageDataPrivate::s_emptycateg = SYMBOLIC_NONE_1;
135
136
138 { return m_d->m_propCodeManager; }
139
141 { return m_d->m_emptyMacroCategories.find(id)!=m_d->m_emptyMacroCategories.end(); }
142
144 { return m_d->m_emptyMicroCategories.find(id)!=m_d->m_emptyMicroCategories.end(); }
145
147 { return m_d->m_conjugatedVerbs.find(id)!=m_d->m_conjugatedVerbs.end(); }
148
150 { return m_d->m_propositionIntroductors.find(id)!=m_d->m_propositionIntroductors.end(); }
151
153 { return m_d->m_nounPhraseHeadMicroCategories; }
154
155const std::set< LinguisticCode >& LanguageData::getNounPhraseHeadMicroCategories() const
156 { return m_d->m_nounPhraseHeadMicroCategories; }
157
158const std::set< LinguisticCode >& LanguageData::getDefiniteMicroCategories() const
159 { return m_d->m_definiteMicroCategories; }
160
161const std::set< LinguisticCode >& LanguageData::getConjugatedVerbs() const
162 { return m_d->m_conjugatedVerbs; }
163
167
169{
170}
171
173{
174 delete m_d;
175}
176
177
179 MediaId lang,
180 const std::string& resourcesPath,
182{
184 LINFO << "LanguageData::initialize lang:" << lang << "; resourcesPath:" << resourcesPath;
185 MediaData::initialize(lang, resourcesPath, conf);
186 m_d->m_language = lang;
187 m_d->initPropertyCode(resourcesPath,conf);
188 //m_d->initSentenceBreakMicros(conf);
189 m_d->initEmptyMacroCategories(conf);
190 m_d->initEmptyMicroCategories(conf);
191 m_d->initHomoSyntagmaticChainsAndRelationsTypes(conf);
192 m_d->initCompoundTensesDefinitions(conf);
193 m_d->initConjugatedVerbs(conf);
194 m_d->initPropositionIntroductors(conf);
195 m_d->initNounPhraseHeadMicroCategories(conf);
196 m_d->initDefiniteMicroCategories(conf);
197 m_d->initSyntacticRelations(conf);
198 m_d->initLimaToLanguageCodeMapping(conf);
199
200}
201
202void LanguageDataPrivate::initPropertyCode(
203 const std::string& resourcesPathsStd,
205{
207 LINFO << "LanguageDataPrivate::initPropertyCode initializes the property coding system with resources path" << resourcesPathsStd;
208 try
209 {
210 QStringList resourcesPaths= QString::fromUtf8(resourcesPathsStd.c_str()).split(LIMA_PATH_SEPARATOR);
211 bool propertyCodeFileFound = false;
212 QString propertyCodeFile = conf.getModuleGroupParamValue("LinguisticData","Categories","PropertyCodeFile").c_str();
213 Q_FOREACH(QString resourcesPath, resourcesPaths)
214 {
215 QString propertyFile(resourcesPath + "/" + propertyCodeFile);
216#ifdef DEBUG_LP
217 LDEBUG << "LanguageDataPrivate::initPropertyCode trying property file" << propertyFile;
218#endif
219 QFileInfo propertyFileInfo(propertyFile);
220 if (propertyFileInfo.exists())
221 {
222#ifdef DEBUG_LP
223 LDEBUG << "LanguageDataPrivate::initPropertyCode reading property file" << propertyFileInfo.filePath();
224#endif
225 m_propCodeManager.readFromXmlFile(propertyFileInfo.filePath().toUtf8().constData());
226 propertyCodeFileFound = true;
227 // Read at most one property code file for a language
228 break;
229 }
230 }
231 if (!propertyCodeFileFound)
232 {
233 LERROR << "No property code file"<<propertyCodeFile<<"found in paths:" << resourcesPaths;
234 throw InvalidConfiguration();
235 }
236 }
237 catch (std::exception& e)
238 {
239 LERROR << "Error while reading PropertyFile file: " << e.what();
240 throw InvalidConfiguration();
241 }
242#ifdef DEBUG_LP
243 LDEBUG << "LanguageDataPrivate::initPropertyCode DONE";
244#endif
245}
246
247/*
248void LanguageDataPrivate::initSentenceBreakMicros(XMLConfigurationFileParser& conf)
249{
250 LDATALOGINIT;
251 LINFO << "initialize sentence break micros";
252 const PropertyManager& microManager=m_propCodeManager.getPropertyManager("MICRO");
253 try
254 {
255 deque<string> sbm=conf.getModuleGroupListValues("LinguisticData","Categories","sentenceBreakMicros");
256 for (deque<string>::const_iterator it=sbm.begin();
257 it!=sbm.end();
258 it++)
259 {
260 LinguisticCode micro=microManager.getPropertyValue(*it);
261 LDEBUG << "insert " << *it << " with code " << micro;
262 m_sentenceBreakMicros.push_back(micro);
263 }
264 }
265 catch (NoSuchList& )
266 {
267 LERROR << "No sentence break micros defines for language " << MediaticData::single().media(m_language);
268 throw InvalidConfiguration();
269 }
270}
271*/
272
273void LanguageDataPrivate::initEmptyMicroCategories(XMLConfigurationFileParser& conf)
274{
276 // initializes the lists of empty micro categories
277 LINFO << "initializes the lists of empty micro categories";
278 m_emptyMicroCategories.clear();
279 std::deque< std::string >& emptyMicroCategoriesList =
280 conf.getModuleGroupListValues("LinguisticData","Categories","emptyMicro");
281 const PropertyManager& microManager=m_propCodeManager.getPropertyManager("MICRO");
282 for (std::deque< std::string >::iterator it = emptyMicroCategoriesList.begin(); it != emptyMicroCategoriesList.end(); it++)
283 {
284 LinguisticCode mic=microManager.getPropertyValue(*it);
285#ifdef DEBUG_LP
286 LDEBUG << "add " << mic << " to empty micros";
287#endif
288 m_emptyMicroCategories.insert(mic);
289 }
290}
291
292void LanguageDataPrivate::initConjugatedVerbs(XMLConfigurationFileParser& conf)
293{
295 // initializes the lists of empty micro categories
296 LINFO << "initializes the lists conjugated verbs";
297 m_conjugatedVerbs.clear();
298 std::deque< std::string >& conjugatedVerbsList =
299 conf.getModuleGroupListValues("LinguisticData","Categories","conjugatedVerbs");
300 const PropertyManager& microManager=m_propCodeManager.getPropertyManager("MICRO");
301 for (std::deque< std::string >::iterator it = conjugatedVerbsList.begin(); it != conjugatedVerbsList.end(); it++)
302 {
303 LinguisticCode mic=microManager.getPropertyValue(*it);
304#ifdef DEBUG_LP
305 LDEBUG << "add " << mic << " to conjugated verbs";
306#endif
307 m_conjugatedVerbs.insert(mic);
308 }
309}
310
311void LanguageDataPrivate::initPropositionIntroductors(XMLConfigurationFileParser& conf)
312{
314 // initializes the lists of empty micro categories
315 LINFO << "initializes the list of proposition introductors";
316 m_propositionIntroductors.clear();
317 std::deque< std::string >& propositionIntroductorsList =
318 conf.getModuleGroupListValues("LinguisticData","Categories","propositionIntroductors");
319 const PropertyManager& microManager=m_propCodeManager.getPropertyManager("MICRO");
320 for (std::deque< std::string >::iterator it = propositionIntroductorsList.begin(); it != propositionIntroductorsList.end(); it++)
321 {
322 LinguisticCode mic=microManager.getPropertyValue(*it);
323#ifdef DEBUG_LP
324 LDEBUG << "add " << mic << " to proposition introductors";
325#endif
326 m_propositionIntroductors.insert(mic);
327 }
328}
329
330void LanguageDataPrivate::initEmptyMacroCategories(XMLConfigurationFileParser& conf)
331{
333
334 // initializes the lists of empty macro categories
335 LINFO << "initializes the lists of empty macro categories:";
336 m_emptyMacroCategories.clear();
337 auto& emptyMacroCategoriesList =
338 conf.getModuleGroupListValues("LinguisticData","Categories","emptyMacro");
339 const PropertyManager& macroManager = m_propCodeManager.getPropertyManager(
340 "MACRO");
341 for (auto it = emptyMacroCategoriesList.cbegin();
342 it != emptyMacroCategoriesList.cend(); it++)
343 {
344 m_emptyMacroCategories.insert(macroManager.getPropertyValue(*it));
345 }
346}
347
348void LanguageDataPrivate::initHomoSyntagmaticChainsAndRelationsTypes(
349 XMLConfigurationFileParser& configParser)
350{
352 LINFO << "initializes the associations between chains types and homosyntagmatic relations types.";
353
354 try
355 {
356 std::deque< std::string > relationsList =
357 configParser.getModuleGroupListValues(
358 "LinguisticData",
359 "SyntacticAnalysis",
360 "NominalHomoSyntagmaticRelations");
361
362 std::deque< std::string >::const_iterator it, it_end;
363 it = relationsList.begin(); it_end = relationsList.end();
364 for (; it != it_end; it++)
365 {
366 map<string,uint64_t>::const_iterator r=m_syntacticRelations.find(*it);
367 if (r!=m_syntacticRelations.end())
368 {
369 m_homoSyntagmaticChainsAndRelationsTypes.
370 insert(std::make_pair(NOMINAL, (*r).second));
371 }
372 }
373 }
374 catch (const NoSuchList& )
375 {
376 LERROR << "LinguisticData/SyntacticAnalysis/NominalHomoSyntagmaticRelations parameter not found.";
377 throw InvalidConfiguration();
378 }
379 try
380 {
381 std::deque< std::string > relationsList =
382 configParser.getModuleGroupListValues(
383 "LinguisticData",
384 "SyntacticAnalysis",
385 "VerbalHomoSyntagmaticRelations");
386
387 std::deque< std::string >::const_iterator it, it_end;
388 it = relationsList.begin();
389 it_end = relationsList.end();
390 for (; it != it_end; it++)
391 {
392 map<string,uint64_t>::const_iterator r=m_syntacticRelations.find(*it);
393 if (r!=m_syntacticRelations.end())
394 {
395 m_homoSyntagmaticChainsAndRelationsTypes.
396 insert(std::make_pair(VERBAL, (*r).second));
397 }
398 }
399 }
400 catch (const NoSuchList& )
401 {
402 LWARN << "LinguisticData/SyntacticAnalysis/VerbalHomoSyntagmaticRelations parameter not found.";
403 throw InvalidConfiguration();
404 }
405}
406
407
408void LanguageDataPrivate::initCompoundTensesDefinitions(
409 XMLConfigurationFileParser& configParser)
410{
412 LINFO << "initializes the compound tenses definitions";
413
414 std::string resourcesPath=MediaticData::single().getResourcesPath();
415
416 std::string compoundTensesDefinitionsFile;
417 try
418 {
419 compoundTensesDefinitionsFile = configParser.getModuleGroupParamValue(
420 "LinguisticData",
421 "SyntacticAnalysis",
422 "CompoundTensesDefFile");
423 }
424 catch (const NoSuchParam& )
425 {
426 LDEBUG << "LinguisticProcessors/SyntacticAnalysis/CompoundTensesDefFile parameter not found for language "
427 << MediaticData::single().media(m_language) << ".";
428 return;
429 }
430 if (compoundTensesDefinitionsFile.find_first_of("/")!=0)
431 {
432 QStringList resourcesPaths =
433 QString::fromUtf8(resourcesPath.c_str()).split(LIMA_PATH_SEPARATOR);
434 Q_FOREACH(QString resPath, resourcesPaths)
435 {
436 if (QFileInfo::exists(resPath + "/" + compoundTensesDefinitionsFile.c_str()))
437 {
438 compoundTensesDefinitionsFile =
439 (resPath + "/"
440 + compoundTensesDefinitionsFile.c_str()).toUtf8().constData();
441 break;
442 }
443 }
444 }
445
446 std::ifstream ifl(compoundTensesDefinitionsFile.c_str(), std::ifstream::binary);
447 size_t linesCounter = 0;
448
449 if (!ifl)
450 {
451 LWARN << "Compound tenses definition file not found: "
452 << compoundTensesDefinitionsFile;
453 return;
454 }
455
456 const PropertyManager& microManager = m_propCodeManager.getPropertyManager(
457 "MICRO");
458 QString timeCode = m_p->getLimaToLanguageCodeMappingValue("TIME");
459 const PropertyManager& tenseManager = m_propCodeManager.getPropertyManager(
460 timeCode.toUtf8().constData());
461
462 std::string line = Lima::Common::Misc::readLine(ifl);
463 Misc::chomp(line);
464 linesCounter++;
465 while (ifl.good() && !ifl.eof())
466 {
467 if ( (line != "") && (line[0] != '#') )
468 {
469#ifdef DEBUG_LP
470 LDEBUG << "read line : " << line;
471#endif
472
473 size_t index = 0;
474
475 size_t next = line.find_first_of(";", index);
476 if (next == std::string::npos)
477 {
478 LERROR << "Cannot find first delimiter in line: " << line;
479 throw InvalidConfiguration();
480 }
481 LinguisticCode mode = microManager.getPropertyValue(line.substr(0, next));
482
483 index = next+1;
484 next=line.find_first_of(";",index);
485 if (next == std::string::npos)
486 {
487 LERROR << "Cannot find second delimiter in line: " << line;
488 throw InvalidConfiguration();
489 }
490 LinguisticCode auxTense = tenseManager.getPropertyValue(line.substr(index, next-index));
491
492 LinguisticCode compoundTense = tenseManager.getPropertyValue(line.substr(next+1));
493
494 m_compoundTenseDefiniton.insert(std::make_pair( std::make_pair(mode, auxTense), compoundTense));
495 }
497 Misc::chomp(line);
498 linesCounter++;
499 }
500}
501
503 ChainsType chainType,
504 uint64_t relationType) const
505{
506 if (m_d->m_homoSyntagmaticChainsAndRelationsTypes.find(chainType) ==
507 m_d->m_homoSyntagmaticChainsAndRelationsTypes.end())
508 return false;
509
510 std::pair<
511 std::multimap<ChainsType, uint64_t>::const_iterator,
512 std::multimap<ChainsType, uint64_t>::const_iterator >
513 itPair = m_d->m_homoSyntagmaticChainsAndRelationsTypes.equal_range(chainType);
514 for (; itPair.first != itPair.second; itPair.first++)
515 {
516 if ( (*(itPair.first)).second == relationType )
517 return true;
518 }
519 return false;
520}
521
522void LanguageDataPrivate::initNounPhraseHeadMicroCategories(XMLConfigurationFileParser& conf)
523{
525 LINFO << "init noun phrase head micro categories";
526 const PropertyManager& microManager=m_propCodeManager.getPropertyManager("MICRO");
527 try
528 {
529 // loads syntactic analysis resources
530 std::deque< std::string > nphmcl = conf.getModuleGroupListValues("LinguisticData", "SyntacticAnalysis", "NounPhraseHeadCategs");
531 for (std::deque< std::string >::iterator it = nphmcl.begin(); it != nphmcl.end(); it++)
532 {
533 LinguisticCode mic=microManager.getPropertyValue(*it);
534 m_nounPhraseHeadMicroCategories.insert(mic);
535 }
536 }
537 catch (NoSuchList& )
538 {
539 LERROR << "No list 'NounPhraseHeadCategs' in 'SyntacticAnalysis' group for language " << (int)m_language;
540 throw InvalidConfiguration();
541 }
542 catch (NoSuchGroup& )
543 {
544 LERROR << "No group 'SyntacticAnalysis' in common language configuration file for language " << (int)m_language;
545 throw InvalidConfiguration();
546 }
547}
548
549void LanguageDataPrivate::initDefiniteMicroCategories(XMLConfigurationFileParser& conf)
550{
552 LINFO << "init definite micro categories";
553 const PropertyManager& microManager=m_propCodeManager.getPropertyManager("MICRO");
554 try
555 {
556 // loads syntactic analysis resources
557 std::deque< std::string > dcl = conf.getModuleGroupListValues("LinguisticData", "SyntacticAnalysis", "DefiniteCategs");
558 for (std::deque< std::string >::iterator it = dcl.begin(); it != dcl.end(); it++)
559 {
560 LinguisticCode mic=microManager.getPropertyValue(*it);
561 m_definiteMicroCategories.insert(mic);
562 }
563 }
564 catch (NoSuchList& )
565 {
566 LERROR << "No list 'DefiniteCategs' in 'SyntacticAnalysis' group for language " << (int)m_language;
567 throw InvalidConfiguration();
568 }
569 catch (NoSuchGroup& )
570 {
571 LERROR << "No group 'SyntacticAnalysis' in common language configuration file for language " << (int)m_language;
572 throw InvalidConfiguration();
573 }
574}
575
576void LanguageDataPrivate::initSyntacticRelations(XMLConfigurationFileParser& conf)
577{
579 LINFO << "init syntacticRelations";
580
581 m_syntacticRelations.clear();
582
583 try
584 {
586 conf.getModuleGroupConfiguration("LinguisticData","SyntacticRelations");
587 deque<string>& relations=group.getListsValueAtKey("relationList");
588
589 // init syntactic relations
590 for (deque<string>::const_iterator it=relations.begin(),
591 it_end=relations.end(); it!=it_end; it++) {
592 // Take care not to store same relation twice
593 if(m_syntacticRelations[*it] == 0)
594 {
595 m_syntacticRelations[*it]=m_syntacticRelations.size();
596 }
597 }
598 }
599 catch (NoSuchList& )
600 {
601 LERROR << "No map 'relationList' in common language configuration file for language "
602 << (int)m_language;
603 throw InvalidConfiguration();
604 }
605 catch (NoSuchGroup& )
606 {
607 LERROR << "No group 'SyntacticRelations' in common language configuration file for language "
608 << (int)m_language;
609 throw InvalidConfiguration();
610 }
611}
612
613void LanguageDataPrivate::initLimaToLanguageCodeMapping(XMLConfigurationFileParser& conf)
614{
616 LINFO << "init LimaToLanguageCodeMapping";
617
618 m_limaToLanguageCodeMapping.clear();
619
620 try
621 {
622 GroupConfigurationStructure& group = conf.getModuleGroupConfiguration("LinguisticData",
623 "Categories");
624 std::map<std::string,std::string>& smapping = group.getMapAtKey("limaToLanguageCodeMapping");
625
626 // init syntactic relations
627 for (auto it = smapping.cbegin(); it != smapping.cend(); it++)
628 {
629 m_limaToLanguageCodeMapping[QString::fromUtf8((*it).first.c_str())] =
630 QString::fromUtf8((*it).second.c_str());
631 }
632 }
633 catch (NoSuchMap& )
634 {
635 LDEBUG << "No map 'LinguisticData/Categories/limaToLanguageCodeMapping' in common language configuration file for language "
636 << (int)m_language;
637 }
638 catch (NoSuchGroup& )
639 {
640 LERROR << "No group 'LinguisticData/Categories' in common language configuration file for language "
641 << (int)m_language;
642 throw InvalidConfiguration();
643 }
644}
645
646
648{
649 std::pair<LinguisticCode, LinguisticCode> def = std::make_pair(mode, auxTense);
650 std::map< std::pair<LinguisticCode, LinguisticCode>, LinguisticCode >::const_iterator defIt;
651 defIt = m_d->m_compoundTenseDefiniton.find(def);
652 if (defIt == m_d->m_compoundTenseDefiniton.end())
653 {
655 LWARN << "ask for unknown compound tense definition: '" << mode << "/" << auxTense << "'";
656 return ID_NONE_1;
657 }
658
659 return (*defIt).second;
660}
661
662LinguisticCode LanguageData::compoundTense(std::string& mode, std::string& auxTense) const
663{
664 const PropertyManager& microManager=m_d->m_propCodeManager.getPropertyManager("MICRO");
665 const PropertyManager& tenseManager=m_d->m_propCodeManager.getPropertyManager("TIME");
666 LinguisticCode res = compoundTense(microManager.getPropertyValue(mode), tenseManager.getPropertyValue(auxTense));
667 if (res == ID_NONE_1)
668 {
670 LWARN << "ask for unknown compound tense definition: '" << mode << "/" << auxTense << "'";
671 return ID_NONE_1;
672 }
673
674 return res;
675}
676
678{
679 static std::string nullString("");
680 // linear search
681 for (map<string,SyntacticRelationId>::const_iterator
682 it=m_d->m_syntacticRelations.begin(),
683 it_end=m_d->m_syntacticRelations.end(); it!=it_end; it++) {
684 if ((*it).second==id) {
685#ifdef DEBUG_LP
687 LDEBUG << "found " << id << " <=> " << (*it).first;
688#endif
689 return (*it).first;
690 }
691 }
692 return nullString;
693}
694
696{
697 map<string,SyntacticRelationId>::const_iterator it=m_d->m_syntacticRelations.find(name);
698 if (it!=m_d->m_syntacticRelations.end()) {
699#ifdef DEBUG_LP
701 LDEBUG << "LanguageData::getSyntacticRelationId found" << name << " <=> " << (*it).second;
702#endif
703 return (*it).second;
704 }
706 LERROR << "LanguageData::getSyntacticRelationId NOT found" << name << "!" ;
707 return 0;
708}
709
710const std::map<QString, QString>& LanguageData::getLimaToLanguageCodeMapping() const
711{
712 return m_d->m_limaToLanguageCodeMapping;
713}
714
715QString LanguageData::getLimaToLanguageCodeMappingValue(const QString& code) const
716{
717 auto it = m_d->m_limaToLanguageCodeMapping.find(code);
718 if (it == m_d->m_limaToLanguageCodeMapping.cend())
719 {
720 return code;
721 }
722 else
723 {
724 return (*it).second;
725 }
726}
727
729
730} // LinguisticData
731} // Common
732} // Lima
#define LIMA_PATH_SEPARATOR
Definition FileUtils.h:25
#define LWARN
Definition LimaCommon.h:160
#define LDATALOGINIT
Definition LimaCommon.h:208
#define LDEBUG
Definition LimaCommon.h:157
#define LINFO
Definition LimaCommon.h:158
#define LERROR
Definition LimaCommon.h:161
Defines a Factory to create Object of type Base.
Holds linguistic data for one language.
bool isAnEmptyMicroCategory(LinguisticCode id) const
QString getLimaToLanguageCodeMappingValue(const QString &code) const
Access to an element of the code mapping.
SyntacticRelationId getSyntacticRelationId(const std::string &name) const
const PropertyCode::PropertyCodeManager & getPropertyCodeManager() const
const std::set< LinguisticCode > & getConjugatedVerbs() const
bool isAnEmptyMacroCategory(LinguisticCode id) const
bool isAConjugatedVerb(LinguisticCode id) const
std::set< LinguisticCode > & getNounPhraseHeadMicroCategories()
const std::map< QString, QString > & getLimaToLanguageCodeMapping() const
The return map contains a mapping between current LIMA internal codes and language codes.
const std::string & getSyntacticRelationName(SyntacticRelationId id) const
bool isTypeARelationForChain(ChainsType, uint64_t) const
bool isAPropositionIntroductor(LinguisticCode id) const
virtual void initialize(MediaId lang, const std::string &resourcesPath, XMLConfigurationFiles::XMLConfigurationFileParser &conf) override
initialize languageData with the given module.
const std::set< LinguisticCode > & getDefiniteMicroCategories() const
LinguisticCode compoundTense(LinguisticCode mode, LinguisticCode auxTense) const
Holds mediatic data for one media.
Definition mediaData.h:50
virtual void initialize(MediaId med, const std::string &resourcesPath, XMLConfigurationFiles::XMLConfigurationFileParser &conf)
initialize languageData with the given module.
Definition mediaData.cpp:57
holds data about codes and names for grammatical categories, etc.
const std::string & getResourcesPath() const
const std::string & media(MediaId media) const
Provide tools to parse a property file, and deal with the property coding system.
const PropertyManager & getPropertyManager(const std::string &propertyName) const
Get the PropertyManager associated to a property.
void readFromXmlFile(const std::string &filename)
This functions should be called once, just after creation.
Provide tools to manage a specific property.
LinguisticCode getPropertyValue(const std::string &symbolicValue) const
Get the coded property value from the symbolic value.
std::deque< std::string > & getListsValueAtKey(const std::string &key)
std::map< std::string, std::string > & getMapAtKey(const std::string &key)
return a message when a 'group' was not found
return a message when a 'param' was not found
Parser class for the lima's xml configuration files.
GroupConfigurationStructure & getModuleGroupConfiguration(const std::string &moduleName, const std::string &groupName)
std::deque< std::string > & getModuleGroupListValues(const std::string &moduleName, const std::string &groupName, const std::string &key)
std::string & getModuleGroupParamValue(const std::string &moduleName, const std::string &groupName, const std::string &key)
Use this exception to signal an error in one of the configuration files.
Definition LimaCommon.h:345
static const MediaticData & single()
const singleton accessor
Definition Singleton.h:51
#define SYMBOLIC_NONE_1
#define ID_NONE_1
#define LANGUAGEDATA_CLASSID
SimpleFactory< MediaData, LanguageData > languageDataFactory(LANGUAGEDATA_CLASSID)
ChainsType
syntactic chains type
void chomp(std::basic_string< C > &str)
std::string readLine(std::istream &inputFile)
NAUTITIA.
STL namespace.
launch exception related to the configuration file parsing