in nlpcraft/src/main/scala/org/apache/nlpcraft/nlp/parsers/NCSemanticEntityParser.scala [268:297]
def isSuperSet(toks: Seq[NCToken]): Boolean = idxs.size > toks.size && toks.map(_.getIndex).toSet.subsetOf(idxs)
var hs = mutable.ArrayBuffer.empty[Holder]
for (piece <- getPieces(toks) if !hs.exists(_.isSuperSet(piece.baseTokens));
variant <- Seq(piece.baseTokens) ++ piece.variants)
def add(elemType: String, value: Option[String]): Unit = hs += Holder(elemType, variant, value)
val idxs = variant.map(_.getIndex)
if cache.add(idxs) then
// Tries to search by stems.
synsHolder.textSynonyms.get(variant.map(stems).mkString(" ")) match
case Some(elems) => elems.foreach(elem => add(elem.elementType, elem.value))
case None =>
// Combines stems(origin) and stems(lemma)
var found = false
if stems4Lemms.nonEmpty then
for (comb <- combine(variant.map(stems), variant.map(stems4Lemms)) if !found)
synsHolder.textSynonyms.get(comb.mkString(" ")) match
case Some(elems) =>
found = true
elems.foreach(elem => add(elem.elementType, elem.value))
case None => // No-op.
// With regex.
for ((elemType, syns) <- synsHolder.mixedSynonyms.getOrElse(variant.size, List.empty))
found = false
for (s <- syns if !found)
found = s.chunks.zip(variant).
sortBy { (chunk, _) => if chunk.isText then 0 else 1 }.