36 const uint64_t nbMaxPartialCompounds=1000,
44 class BoWTokenPart :
public std::pair< boost::shared_ptr< AbstractBoWElement >,bool> {
47 BoWTokenPart(boost::shared_ptr< AbstractBoWElement > token,
bool isCreated):
52 const boost::shared_ptr< AbstractBoWElement >& getBoWToken()
const {
return first; }
53 boost::shared_ptr< AbstractBoWElement >& getBoWToken() {
return first; }
54 bool& isCreated() {
return second; }
55 bool isCreated()
const {
return second; }
58 typedef std::deque<BoWTokenPart> BoWTokenQueue;
62 BoWText::const_iterator m_iterator;
63 BoWText::const_iterator m_iteratorEnd;
64 BoWTokenQueue m_partQueue;
65 uint64_t m_maxSizeQueue;
76 bool addInPartQueue(boost::shared_ptr< BoWToken > token,
77 const bool isCreated);
79 void storePartsInQueue(boost::shared_ptr< BoWToken > token);
83 typedef std::vector<boost::shared_ptr< BoWToken > > PartTokens;
88 bool addPartElementsInQueue(boost::shared_ptr< Lima::Common::BagOfWords::BoWToken > token, vector< Lima::Common::BagOfWords::BoWTokenIteratorPrivate::PartTokens >& partTokens);
103 bool addCombinedPartsInQueue(
const std::vector<PartTokens>& subPartTokens,
105 PartTokens& createdTokens,
106 PartTokens& currentPartialToken,
116 boost::shared_ptr< BoWComplexToken > createComplexToken(
const PartTokens& parts);
119BoWTokenIteratorPrivate::BoWTokenIteratorPrivate(
const BoWText& bowText,
120 const uint64_t nbMaxPartialCompounds,
122m_iterator(bowText.begin()),
123m_iteratorEnd(bowText.end()),
125m_maxSizeQueue(nbMaxPartialCompounds),
126m_iterateThroughNamedEntitiesParts(iterateThroughNamedEntitiesParts)
130BoWTokenIteratorPrivate::BoWTokenIteratorPrivate(
const BoWTokenIteratorPrivate& btip)
132 m_iterator = btip.m_iterator;
133 m_iteratorEnd = btip.m_iteratorEnd;
134 m_partQueue = btip.m_partQueue;
135 m_maxSizeQueue = btip.m_maxSizeQueue;
136 m_iterateThroughNamedEntitiesParts = btip.m_iterateThroughNamedEntitiesParts;
139BoWTokenIteratorPrivate::~BoWTokenIteratorPrivate()
148 const uint64_t nbMaxPartialCompounds,
165 return (m_d->m_iterator == m_d->m_iteratorEnd);
175 if (m_d->m_partQueue.empty()) {
176 if (m_d->m_iterator==m_d->m_iteratorEnd) {
177 return boost::shared_ptr< AbstractBoWElement >();
180 switch ((*m_d->m_iterator)->getType()) {
183 return *m_d->m_iterator;
189 m_d->storePartsInQueue(boost::dynamic_pointer_cast< BoWToken >(*m_d->m_iterator));
190 return m_d->m_partQueue.front().getBoWToken();
198 return m_d->m_partQueue.front().getBoWToken();
200 return boost::shared_ptr< AbstractBoWElement >();
208 if (m_d->m_partQueue.empty()) {
209 if (m_d->m_iterator!=m_d->m_iteratorEnd) {
214 m_d->m_partQueue.pop_front();
215 if (m_d->m_partQueue.empty()) {
232bool BoWTokenIteratorPrivate::addInPartQueue(
const boost::shared_ptr< BoWToken > token,
233 const bool isCreated)
235 if (m_partQueue.size() >= m_maxSizeQueue) {
237 LWARN <<
"size of queue exceeded";
241 m_partQueue.push_back(BoWTokenPart());
242 m_partQueue.back().getBoWToken()=token;
243 m_partQueue.back().isCreated()=isCreated;
245 LDEBUG <<
"add in part queue " << *token
246 <<
"; isCreated=" << isCreated
247 <<
"size of queue=" << m_partQueue.size()
252void BoWTokenIteratorPrivate::storePartsInQueue(boost::shared_ptr< BoWToken > token) {
253 vector<vector<boost::shared_ptr< BoWToken > > > partTokens;
254 if (!addPartElementsInQueue(token,partTokens)) {
256 LWARN <<
"Token contain too many subparts (some are ignored): "
257 << token->getLemma();
261bool BoWTokenIteratorPrivate::addPartElementsInQueue(boost::shared_ptr< BoWToken > token,
262 vector<PartTokens>& partTokens) {
265 LDEBUG <<
"getPartElements on " << *token;
268 if (! addInPartQueue(token,
false)) {
276 partTokens.push_back(pt);
277 partTokens.back().push_back(token);
281 switch (token->getType()) {
284 partTokens.push_back(PartTokens());
285 partTokens.back().push_back(token);
290 boost::shared_ptr< BoWComplexToken > complexToken=boost::dynamic_pointer_cast<BoWComplexToken>(token);
292 if (complexToken->size() == 1) {
296 partTokens.push_back(PartTokens());
297 partTokens.back().push_back(token);
302 partTokens.push_back(PartTokens());
305 LDEBUG <<
"storing token " << *token;
306 partTokens.back().push_back(token);
307 const BoWComplexToken::Part& headPart=complexToken->getParts()[complexToken->getHead()];
308 LDEBUG <<
"storing head token " << *(headPart.getBoWToken());
309 partTokens.back().push_back(headPart.getBoWToken());
312 vector<PartTokens> subPartTokens;
314 deque<BoWComplexToken::Part>::const_iterator
315 part=complexToken->getParts().begin(),
316 part_end=complexToken->getParts().end();
318 for (; part!=part_end; part++) {
319 if (!addPartElementsInQueue((*part).getBoWToken(),subPartTokens)) {
324 if (subPartTokens.size()>1) {
326 PartTokens currentPartialToken;
328 if (!addCombinedPartsInQueue(subPartTokens,complexToken->getHead(),
329 combined,currentPartialToken,0,first)) {
333 partTokens.back().insert(partTokens.back().end(),combined.begin(),combined.end());
343bool BoWTokenIteratorPrivate::addCombinedPartsInQueue(
const vector< Lima::Common::BagOfWords::BoWTokenIteratorPrivate::PartTokens >& subPartTokens,
const uint64_t head, Lima::Common::BagOfWords::BoWTokenIteratorPrivate::PartTokens& createdTokens, Lima::Common::BagOfWords::BoWTokenIteratorPrivate::PartTokens& currentPartialToken,
const uint64_t i,
bool& first)
345 if (i>=subPartTokens.size()) {
354 if (currentPartialToken.size() == 1) {
360 boost::shared_ptr< BoWComplexToken > partialComplexToken=
361 createComplexToken(currentPartialToken);
363 if (partialComplexToken!=0) {
364 if (! addInPartQueue(partialComplexToken,
true)) {
368 createdTokens.push_back(partialComplexToken);
374 for (
auto it=subPartTokens[i].begin(),it_end=subPartTokens[i].end();
376 currentPartialToken.push_back(*it);
377 if (!addCombinedPartsInQueue(subPartTokens,head,
378 createdTokens,currentPartialToken,
382 currentPartialToken.pop_back();
388 if (!addCombinedPartsInQueue(subPartTokens,head,
389 createdTokens,currentPartialToken,
399boost::shared_ptr< BoWComplexToken > BoWTokenIteratorPrivate::createComplexToken(
const PartTokens& parts) {
404 boost::shared_ptr< BoWTerm > partialComplexToken(
new BoWTerm);
409 for (
auto it=parts.begin(), it_end=parts.end(); it!=it_end; it++) {
410 partialComplexToken->addPart(boost::dynamic_pointer_cast<BoWToken>(*it));
414 poslenlist=partialComplexToken->getPositionLengthList();
416 std::sort(poslenlist.begin(),poslenlist.end());
417 if (! poslenlist.empty()) {
418 partialComplexToken->setPosition(poslenlist.front().first);
419 partialComplexToken->setLength(poslenlist.back().first+
420 poslenlist.back().second-
421 poslenlist.front().first);
424 return partialComplexToken;
This class is the abstract base class of all elements that can be stored in a BoWText.
This class represents a list of elements, that are pointers on polymmorphic tokens that can be simple...
BoWTokenIterator(const BoWText &bowText, const uint64_t nbMaxPartialCompounds=1000, BoWTokenIteratorNamedEntitiesPartsPolicy iterateThroughNamedEntitiesParts=ITERATE_THROUGH_NAMEDENTITIES_PARTS)
constructor
BoWTokenIterator & operator++()
boost::shared_ptr< Lima::Common::BagOfWords::AbstractBoWElement > getElement()
@ BOW_TERM
the AbstractBoWElement is a multi-term
@ BOW_NAMEDENTITY
the AbstractBoWElement is a named entity
@ BOW_TOKEN
the AbstractBoWElement is a simple token
@ BOW_PREDICATE
the AbstractBoWElement is a predicate (n-ary relation, template or semantic frame
BoWTokenIteratorNamedEntitiesPartsPolicy
@ DO_NOT_ITERATE_THROUGH_NAMEDENTITIES_PARTS
@ ITERATE_THROUGH_NAMEDENTITIES_PARTS
std::vector< std::pair< Position, Length > > PositionLengthList