LIMA
Libre Multilingual Analyzer — C++ API
Loading...
Searching...
No Matches
Modex.cpp
Go to the documentation of this file.
1// Copyright 2002-2013 CEA LIST
2// SPDX-FileCopyrightText: 2022 CEA LIST <gael.de-chalendar@cea.fr>
3//
4// SPDX-License-Identifier: MIT
5
6/************************************************************************
7 *
8 * @file Modex.cpp
9 * @author Romaric Besancon (romaric.besancon@cea.fr)
10 * @date Wed Jan 31 2007
11 * copyright Copyright (C) 2007 by CEA LIST
12 *
13 ***********************************************************************/
14
15#include "Modex.h"
19// #include "linguisticProcessing/common/linguisticData/linguisticData.h"
23
25using namespace Lima::Common::MediaticData;
26using namespace Lima::LinguisticProcessing;
27using namespace std;
28
29namespace Lima {
30namespace LinguisticProcessing {
31
32//***********************************************************************
33// constructors and destructors
35m_language(0),
36m_pipeline(0)
37{
38}
39
42
43//***********************************************************************
45 Manager* manager)
46
47{
48 MODEXLOGINIT;
49 m_language=manager->getInitializationParameters().language;
50
51 // initialize all resources needed by modex from config file
52 try {
53 // try to get a single automaton
54 string filename=unitConfiguration.getParamsValueAtKey("modexConfig");
55 string configFile=Common::Misc::findFileInPaths(LinguisticData::single().getConfigPath().c_str(),filename.c_str()).toUtf8().constData();
56
57 initModex(configFile,m_language);
58 }
59 catch (NoSuchParam& ) {
60 LERROR << "No param 'modexConfig' in Modex definition group";
62 }
63}
64
65void Modex::
66initModex(const std::string& configFile,
67 MediaId lang)
68{
70 MODEXLOGINIT;
71 LINFO << "InformationExtraction resources initialization";
72
73 XMLConfigurationFileParser configParser(configFile);
74
75 // first, add resources and processors to common resources and processors
76
77 try {
79 ModuleConfigurationStructure& modexResourcesModule=configParser.getModuleConfiguration("Resources");
80 // get resources for this language
81 map<string,string>& resourcesByLanguage=modexResourcesModule.
82 getMapAtKeyOfGroupNamed("resourcesByLanguage","resourceList");
83
84 map<string,string>::iterator it=resourcesByLanguage.find(LinguisticData::single().getMediaId(m_language));
85 if (it == resourcesByLanguage.end()) {
86 LERROR << "no resources for language '"
87 << LinguisticData::single().getMediaId(m_language)
88 << "' in Resources for Modex";
90 }
91
92 std::string resourcesModule=(*it).second;
93 ModuleConfigurationStructure& modexResources=configParser.getModuleConfiguration(resourcesModule);
94 addConfiguration(modexResources,resources);
95 }
96 catch (NoSuchGroup& e) {
97 LERROR << "missing param 'resourceList' in Resources for Modex in " << configFile;
99 }
100 catch (NoSuchParam& ) {
101 LERROR << "missing param 'resourcesByLanguage' in Resources for Modex in " << configFile;
102 throw InvalidConfiguration();
103 }
104 catch (NoSuchModule &) {
105 LDEBUG << "no module 'Resources' for Modex in " << configFile;
106 // not mandatory
107 }
108
109 try {
111 ModuleConfigurationStructure& modexProcessors=configParser.getModuleConfiguration("Processors");
112 addConfiguration(modexProcessors,processors);
113 }
114 catch (NoSuchModule &) {
115 LERROR << "no module 'Processors' for Modex in " << configFile;
116 throw InvalidConfiguration();
117 }
118
119 // init modex
120 initModexConfig(configParser);
121
122 LINFO << "Modex initialization finished";
123 TimeUtils::logElapsedTime("ModexInit");
124}
125
126void Modex::
127addConfiguration(ModuleConfigurationStructure& modexConfig,
128 ModuleConfigurationStructure& commonConfig)
129{
130 // copy groups from modex resources to resources
131 for (ModuleConfigurationStructure::const_iterator it=modexConfig.begin(),
132 it_end=modexConfig.end(); it!=it_end; it++) {
133 // check if exists (safe add)
134 if (commonConfig.find((*it).first)!=commonConfig.end()) {
135 MODEXLOGINIT;
136 LERROR << "cannot add modex configuration '"<<(*it).first<<"' : already exists";
137 }
138 else {
139 commonConfig.insert(make_pair((*it).first,(*it).second));
140 }
141 }
142}
143
144void Modex::
145initEntities(const std::string& filename)
146{
147 XMLConfigurationFileParser configuration(Common::Misc::findFileInPaths(LinguisticData::single().getConfigPath().c_str(),filename.c_str()).toUtf8().constData());
148 initEntities(configuration);
149}
150
151void Modex::
152initEntities(XMLConfigurationFileParser& configParser)
153{
154 MODEXLOGINIT;
155 LINFO << "intialize entities";
156
157 ModuleConfigurationStructure& moduleConf=configParser.getModuleConfiguration("entities");
158
159 // look at all groups : ModuleConfigurationStructure is a map
160 try {
161 for (ModuleConfigurationStructure::iterator it=moduleConf.begin(),
162 it_end=moduleConf.end(); it!=it_end; it++) {
164 LinguisticData::changeable().addEntityGroup(groupName);
165
166 GroupConfigurationStructure& groupConf=(*it).second;
167
168 deque<string>& entityList=groupConf.getListsValueAtKey("entityList");
169 for (deque<string>::const_iterator ent=entityList.begin(),
170 ent_end=entityList.end(); ent!=ent_end; ent++) {
171
173 LinguisticData::changeable().addEntity(groupName,entityName);
174 }
175 }
176 }
177 catch(NoSuchModule &) {
178 MODEXLOGINIT;
179 LERROR << "missing module 'entities' in modex configuration file";
180 throw InvalidConfiguration();
181 }
182 catch(NoSuchList& ) {
183 MODEXLOGINIT;
184 LERROR << "missing list 'entityList' in modex configuration file";
185 throw InvalidConfiguration();
186 }
187}
188
189void Modex::
190initModexConfig(XMLConfigurationFileParser& configParser)
191{
192
193 MODEXLOGINIT;
194 LINFO << "intialize Modex";
195
196 try {
197
198 const deque<string>& modexList=
199 configParser.getModuleConfiguration("modex").getGroupNamed("modexDefinitions").getListsValueAtKey("modexList");
200
201 for (deque<string>::const_iterator it=modexList.begin(),
202 it_end=modexList.end(); it!=it_end; it++) {
203 const std::string& modexName=(*it);
204
205 // get module for this modex
206 ModuleConfigurationStructure& modexConf=configParser.getModuleConfiguration(modexName);
207
208 // get group for general modex definition
209 GroupConfigurationStructure& modexDef=modexConf.getGroupNamed("modexDefinition");
210
211 // initialize all needed entities
212 const deque<string>& includeEntities=modexDef.getListsValueAtKey("includeEntities");
213 for (deque<string>::const_iterator entityFile=includeEntities.begin(),
214 entityFile_end=includeEntities.end();
215 entityFile!=entityFile_end; entityFile++) {
216 if (*entityFile == "this") {
217 initEntities(configParser);
218 }
219 else {
220 // open file
221 initEntities(*entityFile);
222 }
223 }
224
225 // initialize entities in modex definition
226// const deque<string>& entities=modexDef.getListsValueAtKey("entities");
227 // TODO... (is this necessary ?)
228
229 // initialize pipeline
230 const string& pipelineName=modexDef.getParamsValueAtKey("pipeline");
231 m_pipeline=MediaProcessors::changeable().initPipeline(m_language,pipelineName);
232 }
233 }
234 catch (NoSuchModule &) {
235 LERROR << "missing module 'modex' in modex configuration file";
236 throw InvalidConfiguration();
237 }
238 catch (NoSuchGroup& e) {
239 LERROR << "missing group 'modexDefinitions' in modex configuration file";
240 throw InvalidConfiguration();
241 }
242 catch (NoSuchList& ) {
243 LERROR << "missing list 'modexList' in modex configuration file";
244 throw InvalidConfiguration();
245 }
246}
247
248
251{
252 return m_pipeline->process(analysis);
253}
254
255
256
257
258} // end namespace
259} // end namespace
#define LDEBUG
Definition LimaCommon.h:157
#define LINFO
Definition LimaCommon.h:158
#define LERROR
Definition LimaCommon.h:161
Holds all data that pass through the ProcessUnits Analysis data are shared pointers,...
std::deque< std::string > & getListsValueAtKey(const std::string &key)
GroupConfigurationStructure & getGroupNamed(const std::string &name)
return a message when a 'group' was not found
return a message when a 'module' is not found
return a message when a 'param' was not found
Parser class for the lima's xml configuration files.
ModuleConfigurationStructure & getModuleConfiguration(const std::string &moduleName)
Use this exception to signal an error in one of the configuration files.
Definition LimaCommon.h:345
Common::XMLConfigurationFiles::ModuleConfigurationStructure & getModuleConfiguration(MediaId lang)
LimaStatusCode process(AnalysisContent &analysis) const
Definition Modex.cpp:250
void init(Common::XMLConfigurationFiles::GroupConfigurationStructure &unitConfiguration, Manager *manager)
Definition Modex.cpp:44
static LinguisticResources & changeable()
singleton accessor
Definition Singleton.h:71
static void logElapsedTime(const std::string &mess, const std::string &taskCategory=std::string(""))
log the number of microseconds since last UpdateCurrentTime
static void updateCurrentTime(const std::string &taskCategory=std::string(""))
store current time for new elapsed time computation
QString findFileInPaths(const QString &paths, const QString &fileName, const QChar &separator)
Find the given file in the given paths.
LimaString utf8stdstring2limastring(const std::string &src)
NAUTITIA.
LimaStatusCode
Definition LimaCommon.h:236
QString LimaString
Definition LimaString.h:33
STL namespace.