LIMA
Libre Multilingual Analyzer — C++ API
Loading...
Searching...
No Matches
WordUnit.cpp
Go to the documentation of this file.
1// Copyright 2002-2019 CEA LIST
2// SPDX-FileCopyrightText: 2022 CEA LIST <gael.de-chalendar@cea.fr>
3//
4// SPDX-License-Identifier: MIT
5
6#include "WordUnit.h"
7#include "KnnSearcher.h"
8
9#include <fstream>
10#include <string>
11#include <vector>
12#include <set>
13#include <sys/types.h>
14#include <sys/stat.h>
15#include <fcntl.h>
16#include <boost/algorithm/string.hpp>
17
18#include <errno.h>
21
22
23
24
25using namespace std;
26
27namespace Lima
28{
29namespace LinguisticProcessing
30{
31namespace WordSenseDisambiguation
32{
33
35 {
36 }
37
41
43 const Lemma2Index& lemma2Index,
44 const Index2Lemma& index2Lemma,
45 string lemma,
46 Mode mode,
47 string sensesPath)
48 : m_lemma(lemma), m_mode(mode)
49 {
50 LOGINIT("WordSenseDisambiguator");
51 if (lemma2Index.find(lemma) != lemma2Index.end())
52 {
53 m_lemmaId = lemma2Index.find(lemma)->second;
54 } else {
55 LWARN << "no lemmaId for "<< lemma << " in lemma2Index ";
56 }
57 m_nbSenses = loadSenses(searcher, lemma2Index, index2Lemma, sensesPath);
58 }
59
60
62 const Lemma2Index& lemma2Index,
63 const Index2Lemma& index2Lemma,
64 string sensesPath)
65 {
66 LOGINIT("WordSenseDisambiguator");
67 int nbSenses = 0;
68#ifndef WIN32
69 set<uint64_t> senseMembersIds;
70 int formerNbSenses = -1;
71 int nbTotalElems = 0;
72 string sensesFile;
73 ifstream ifs;
74 int ifd;
75 string s = "";
76 switch (m_mode) {
77 case B_MOST_FREQUENT:
80 sensesFile = sensesPath+"/"+m_lemma[0]+"/"+m_lemma+".senses";
81 cerr << "Loading senses from " << sensesFile << endl;
82 ifs.open(sensesFile.c_str(), std::ifstream::binary);
83 if ( !ifs.good() ) {
84 LERROR << "File " << sensesFile << " not read" ;
85 if ( ifs.eof() ) {
86 LERROR << "(eof)" ;
87 } else if ( ifs.fail() ) {
88 LWARN << "(fail)" ;
89 LWARN << " Probably file "<< sensesFile <<" does not exist" ;
90 return 0;
91 } else if ( ifs.bad() ) {
92 LERROR << "(bad)" ;
93 } else {
94 LERROR << "(reason unknown)" ;
95 }
96 LERROR << ". ";
97 return nbSenses;
98 }
99 while (getline(ifs, s)) {
100 vector<string> strs;
101 boost::split(strs, s, boost::is_any_of(";"));
102 vector<string> members;
103 boost::split(members, strs.at(1), boost::is_any_of("*"));
104 for (vector<string>::iterator it = members.begin(); it != members.end(); it++)
105 {
106 if (lemma2Index.find(*it)!=lemma2Index.end())
107 {
108 senseMembersIds.insert(lemma2Index.find(*it)->second);
109 }
110 }
111 m_senses.insert(WordSenseUnit(nbSenses, m_lemmaId, m_mode, s, senseMembersIds, 20-nbSenses));
112 nbSenses++;
113 }
114 for (set<WordSenseUnit>::iterator itDebug = m_senses.begin();
115 itDebug != m_senses.end();
116 itDebug++)
117 {
118 LDEBUG << "inserted : " << itDebug->senseId();
119 }
120 ifs.close();
121 break;
122 case S_WSI_MRD:
123 //sensesFile = sensesPath+"/"+lemma[0]+"/"+lemma+".bin";
124 sensesFile = sensesPath+"/"+m_lemma+".bin";
125 LINFO << "Opening file : " << sensesFile;
126 ifd = open(sensesFile.c_str(), O_RDONLY);
127 if (ifd ==-1) {
128 LERROR << "an error occured while opening file " << sensesFile;
129 switch (errno) {
130 case ENOENT :
131 LERROR << "noentry ";
132 break;
133 case EMFILE :
134 LERROR << "too many files open ";
135 break;
136 case EACCES :
137 LERROR << "eaccess ";
138 break;
139 default :
140 LERROR << "unrecognized error : impossible to open : "<< sensesFile;
141 exit(EXIT_FAILURE);
142 break;
143 }
144 return nbSenses;
145 }
146 if (read(ifd, &nbTotalElems, sizeof(nbTotalElems)) == -1) {
147 LERROR << "Call to function read(...) failed";
148 exit(EXIT_FAILURE);
149 }
150 LDEBUG << "NbTotalElements : "<< nbTotalElems ;
151 for (int i = 0; i < nbTotalElems; i++) {
152 if (formerNbSenses!=nbSenses && i !=0) {
153 LDEBUG << "one more sense for " << m_lemma << " : " << s ;
154 m_senses.insert(WordSenseUnit(formerNbSenses, m_lemmaId, m_mode, s, senseMembersIds));
155 s="";
156 senseMembersIds.clear();
157 }
158 formerNbSenses=nbSenses;
159 uint id = 0;
160 if (read(ifd, &id, sizeof(id)) == -1) {
161 LERROR << "Call to function read(...) failed";
162 exit(EXIT_FAILURE);
163 }
164 if (read(ifd, &nbSenses, sizeof(nbSenses)) == -1) {
165 LERROR << "Call to function read(...) failed";
166 exit(EXIT_FAILURE);
167 }
168
169/* LDEBUG << "formerNbSense : " << formerNbSenses;
170 LDEBUG << "NbSense : " << nbSenses; */
171 if (searcher!=NULL) {
172 senseMembersIds.insert(searcher->sys2Owner(id));
173 //TOFIX : id are internal knn_searchids ?? seems ok
174 //LDEBUG << "Ids : "<< id ;
175 //LDEBUG << "lemmaId : " << searcher->sys2Owner(id);
176 if (index2Lemma.find(searcher->sys2Owner(id)) != index2Lemma.end())
177 {
178 s+= index2Lemma.find(searcher->sys2Owner(id))->second + "|" ;
179 }
180 }
181 }
182 m_senses.insert(WordSenseUnit(formerNbSenses, m_lemmaId, m_mode, s, senseMembersIds));
183 break;
184 default :
185 break;
186 }
187 LDEBUG << "NbSenses for " << m_lemma << " : "<< nbSenses ;
188
189
190 /*
191 LDEBUG << "test size : " << m_senses.size();
192 for(set<WordSenseUnit>::iterator itSenses = m_senses.begin();
193 itSenses!= m_senses.end();
194 itSenses++ ) {
195
196 LDEBUG << "Checking 3 Sense id "<< m_lemma << " : " << itSenses->senseId();
197 }
198 */
199
200
201
202
203#endif
204
205
206 return nbSenses;
207 }
208
209 std::ostream& operator << (std::ostream& os, const WordUnit& wu)
210 {
211 os << wu.lemmaId() <<":"<< wu.lemma() << "(" << wu.mode() << "):" << wu.nbSenses() ;
212 return os;
213 }
214
215 QDebug& operator << (QDebug& os, const WordUnit& wu)
216 {
217 os << wu.lemmaId() <<":"<< wu.lemma() << "(" << wu.mode() << "):" << wu.nbSenses() ;
218 return os;
219 }
220
221
222
223} // namespace WordSenseDisambiguation
224} // namespace LinguisticProcessing
225} // namespace Lima
#define LWARN
Definition LimaCommon.h:160
#define LOGINIT(X)
Definition LimaCommon.h:187
#define LDEBUG
Definition LimaCommon.h:157
#define LINFO
Definition LimaCommon.h:158
#define LERROR
Definition LimaCommon.h:161
int loadSenses(KnnSearcher *searcher, const Lemma2Index &lemma2Index, const Index2Lemma &index2Lemma, std::string sensesPath)
Definition WordUnit.cpp:61
std::map< std::string, uint64_t > Lemma2Index
Definition WordUnit.h:26
std::map< uint64_t, std::string > Index2Lemma
Definition WordUnit.h:25
std::ostream & operator<<(std::ostream &os, const WordSenseAnnotation &wsa)
NAUTITIA.
STL namespace.