26#include <QtCore/QDebug>
27#include <QtCore/QFileInfo>
28#include <QtCore/QString>
29#include <QtCore/QStringList>
51 void initPropertyCode(
52 const std::string& resourcesPath,
72 std::list< LinguisticCode > m_sentenceBreakMicros;
80 std::set< LinguisticCode > m_emptyMacroCategories;
85 std::set< LinguisticCode > m_emptyMicroCategories;
90 std::set< LinguisticCode > m_conjugatedVerbs;
95 std::set< LinguisticCode > m_nounPhraseHeadMicroCategories;
100 std::set< LinguisticCode > m_definiteMicroCategories;
105 std::set< LinguisticCode > m_propositionIntroductors;
107 std::multimap<ChainsType, uint64_t> m_homoSyntagmaticChainsAndRelationsTypes;
109 std::map< std::pair<LinguisticCode, LinguisticCode>,
LinguisticCode > m_compoundTenseDefiniton;
111 static const std::string s_emptycateg;
113 std::map< LinguisticCode, ConceptType > m_macro2ConceptMapping;
115 std::map< std::string, SyntacticRelationId > m_syntacticRelations;
117 std::map<QString, QString> m_limaToLanguageCodeMapping;
124LanguageDataPrivate::LanguageDataPrivate(
LanguageData* ld) :
129LanguageDataPrivate::~LanguageDataPrivate()
138 {
return m_d->m_propCodeManager; }
141 {
return m_d->m_emptyMacroCategories.find(
id)!=m_d->m_emptyMacroCategories.end(); }
144 {
return m_d->m_emptyMicroCategories.find(
id)!=m_d->m_emptyMicroCategories.end(); }
147 {
return m_d->m_conjugatedVerbs.find(
id)!=m_d->m_conjugatedVerbs.end(); }
150 {
return m_d->m_propositionIntroductors.find(
id)!=m_d->m_propositionIntroductors.end(); }
153 {
return m_d->m_nounPhraseHeadMicroCategories; }
156 {
return m_d->m_nounPhraseHeadMicroCategories; }
159 {
return m_d->m_definiteMicroCategories; }
162 {
return m_d->m_conjugatedVerbs; }
180 const std::string& resourcesPath,
184 LINFO <<
"LanguageData::initialize lang:" << lang <<
"; resourcesPath:" << resourcesPath;
186 m_d->m_language = lang;
187 m_d->initPropertyCode(resourcesPath,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);
202void LanguageDataPrivate::initPropertyCode(
203 const std::string& resourcesPathsStd,
207 LINFO <<
"LanguageDataPrivate::initPropertyCode initializes the property coding system with resources path" << resourcesPathsStd;
210 QStringList resourcesPaths= QString::fromUtf8(resourcesPathsStd.c_str()).split(
LIMA_PATH_SEPARATOR);
211 bool propertyCodeFileFound =
false;
213 Q_FOREACH(QString resourcesPath, resourcesPaths)
215 QString propertyFile(resourcesPath +
"/" + propertyCodeFile);
217 LDEBUG <<
"LanguageDataPrivate::initPropertyCode trying property file" << propertyFile;
219 QFileInfo propertyFileInfo(propertyFile);
220 if (propertyFileInfo.exists())
223 LDEBUG <<
"LanguageDataPrivate::initPropertyCode reading property file" << propertyFileInfo.filePath();
225 m_propCodeManager.
readFromXmlFile(propertyFileInfo.filePath().toUtf8().constData());
226 propertyCodeFileFound =
true;
231 if (!propertyCodeFileFound)
233 LERROR <<
"No property code file"<<propertyCodeFile<<
"found in paths:" << resourcesPaths;
237 catch (std::exception& e)
239 LERROR <<
"Error while reading PropertyFile file: " << e.what();
243 LDEBUG <<
"LanguageDataPrivate::initPropertyCode DONE";
277 LINFO <<
"initializes the lists of empty micro categories";
278 m_emptyMicroCategories.clear();
279 std::deque< std::string >& emptyMicroCategoriesList =
282 for (std::deque< std::string >::iterator it = emptyMicroCategoriesList.begin(); it != emptyMicroCategoriesList.end(); it++)
286 LDEBUG <<
"add " << mic <<
" to empty micros";
288 m_emptyMicroCategories.insert(mic);
296 LINFO <<
"initializes the lists conjugated verbs";
297 m_conjugatedVerbs.clear();
298 std::deque< std::string >& conjugatedVerbsList =
301 for (std::deque< std::string >::iterator it = conjugatedVerbsList.begin(); it != conjugatedVerbsList.end(); it++)
305 LDEBUG <<
"add " << mic <<
" to conjugated verbs";
307 m_conjugatedVerbs.insert(mic);
315 LINFO <<
"initializes the list of proposition introductors";
316 m_propositionIntroductors.clear();
317 std::deque< std::string >& propositionIntroductorsList =
320 for (std::deque< std::string >::iterator it = propositionIntroductorsList.begin(); it != propositionIntroductorsList.end(); it++)
324 LDEBUG <<
"add " << mic <<
" to proposition introductors";
326 m_propositionIntroductors.insert(mic);
335 LINFO <<
"initializes the lists of empty macro categories:";
336 m_emptyMacroCategories.clear();
337 auto& emptyMacroCategoriesList =
341 for (
auto it = emptyMacroCategoriesList.cbegin();
342 it != emptyMacroCategoriesList.cend(); it++)
348void LanguageDataPrivate::initHomoSyntagmaticChainsAndRelationsTypes(
352 LINFO <<
"initializes the associations between chains types and homosyntagmatic relations types.";
356 std::deque< std::string > relationsList =
360 "NominalHomoSyntagmaticRelations");
362 std::deque< std::string >::const_iterator it, it_end;
363 it = relationsList.begin(); it_end = relationsList.end();
364 for (; it != it_end; it++)
366 map<string,uint64_t>::const_iterator r=m_syntacticRelations.find(*it);
367 if (r!=m_syntacticRelations.end())
369 m_homoSyntagmaticChainsAndRelationsTypes.
370 insert(std::make_pair(
NOMINAL, (*r).second));
376 LERROR <<
"LinguisticData/SyntacticAnalysis/NominalHomoSyntagmaticRelations parameter not found.";
381 std::deque< std::string > relationsList =
385 "VerbalHomoSyntagmaticRelations");
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++)
392 map<string,uint64_t>::const_iterator r=m_syntacticRelations.find(*it);
393 if (r!=m_syntacticRelations.end())
395 m_homoSyntagmaticChainsAndRelationsTypes.
396 insert(std::make_pair(
VERBAL, (*r).second));
402 LWARN <<
"LinguisticData/SyntacticAnalysis/VerbalHomoSyntagmaticRelations parameter not found.";
408void LanguageDataPrivate::initCompoundTensesDefinitions(
412 LINFO <<
"initializes the compound tenses definitions";
416 std::string compoundTensesDefinitionsFile;
422 "CompoundTensesDefFile");
426 LDEBUG <<
"LinguisticProcessors/SyntacticAnalysis/CompoundTensesDefFile parameter not found for language "
430 if (compoundTensesDefinitionsFile.find_first_of(
"/")!=0)
432 QStringList resourcesPaths =
434 Q_FOREACH(QString resPath, resourcesPaths)
436 if (QFileInfo::exists(resPath +
"/" + compoundTensesDefinitionsFile.c_str()))
438 compoundTensesDefinitionsFile =
440 + compoundTensesDefinitionsFile.c_str()).toUtf8().constData();
446 std::ifstream ifl(compoundTensesDefinitionsFile.c_str(), std::ifstream::binary);
447 size_t linesCounter = 0;
451 LWARN <<
"Compound tenses definition file not found: "
452 << compoundTensesDefinitionsFile;
460 timeCode.toUtf8().constData());
465 while (ifl.good() && !ifl.eof())
467 if ( (line !=
"") && (line[0] !=
'#') )
470 LDEBUG <<
"read line : " << line;
475 size_t next = line.find_first_of(
";", index);
476 if (next == std::string::npos)
478 LERROR <<
"Cannot find first delimiter in line: " << line;
484 next=line.find_first_of(
";",index);
485 if (next == std::string::npos)
487 LERROR <<
"Cannot find second delimiter in line: " << line;
494 m_compoundTenseDefiniton.insert(std::make_pair( std::make_pair(mode, auxTense), compoundTense));
504 uint64_t relationType)
const
506 if (m_d->m_homoSyntagmaticChainsAndRelationsTypes.find(chainType) ==
507 m_d->m_homoSyntagmaticChainsAndRelationsTypes.end())
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++)
516 if ( (*(itPair.first)).second == relationType )
525 LINFO <<
"init noun phrase head micro categories";
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++)
534 m_nounPhraseHeadMicroCategories.insert(mic);
539 LERROR <<
"No list 'NounPhraseHeadCategs' in 'SyntacticAnalysis' group for language " << (int)m_language;
544 LERROR <<
"No group 'SyntacticAnalysis' in common language configuration file for language " << (int)m_language;
552 LINFO <<
"init definite micro categories";
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++)
561 m_definiteMicroCategories.insert(mic);
566 LERROR <<
"No list 'DefiniteCategs' in 'SyntacticAnalysis' group for language " << (int)m_language;
571 LERROR <<
"No group 'SyntacticAnalysis' in common language configuration file for language " << (int)m_language;
579 LINFO <<
"init syntacticRelations";
581 m_syntacticRelations.clear();
590 for (deque<string>::const_iterator it=relations.begin(),
591 it_end=relations.end(); it!=it_end; it++) {
593 if(m_syntacticRelations[*it] == 0)
595 m_syntacticRelations[*it]=m_syntacticRelations.size();
601 LERROR <<
"No map 'relationList' in common language configuration file for language "
607 LERROR <<
"No group 'SyntacticRelations' in common language configuration file for language "
616 LINFO <<
"init LimaToLanguageCodeMapping";
618 m_limaToLanguageCodeMapping.clear();
624 std::map<std::string,std::string>& smapping = group.
getMapAtKey(
"limaToLanguageCodeMapping");
627 for (
auto it = smapping.cbegin(); it != smapping.cend(); it++)
629 m_limaToLanguageCodeMapping[QString::fromUtf8((*it).first.c_str())] =
630 QString::fromUtf8((*it).second.c_str());
635 LDEBUG <<
"No map 'LinguisticData/Categories/limaToLanguageCodeMapping' in common language configuration file for language "
640 LERROR <<
"No group 'LinguisticData/Categories' in common language configuration file for language "
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())
655 LWARN <<
"ask for unknown compound tense definition: '" << mode <<
"/" << auxTense <<
"'";
659 return (*defIt).second;
670 LWARN <<
"ask for unknown compound tense definition: '" << mode <<
"/" << auxTense <<
"'";
679 static std::string nullString(
"");
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) {
687 LDEBUG <<
"found " <<
id <<
" <=> " << (*it).first;
697 map<string,SyntacticRelationId>::const_iterator it=m_d->m_syntacticRelations.find(name);
698 if (it!=m_d->m_syntacticRelations.end()) {
701 LDEBUG <<
"LanguageData::getSyntacticRelationId found" << name <<
" <=> " << (*it).second;
706 LERROR <<
"LanguageData::getSyntacticRelationId NOT found" << name <<
"!" ;
712 return m_d->m_limaToLanguageCodeMapping;
717 auto it = m_d->m_limaToLanguageCodeMapping.find(code);
718 if (it == m_d->m_limaToLanguageCodeMapping.cend())
#define LIMA_PATH_SEPARATOR
Defines a Factory to create Object of type Base.
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 'list' was not found
return a message when a 'map' 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.
static const MediaticData & single()
const singleton accessor
#define LANGUAGEDATA_CLASSID
void chomp(std::basic_string< C > &str)
std::string readLine(std::istream &inputFile)
launch exception related to the configuration file parsing