private void extractBilingualSynonyms( @NotNull Element translationTable, @NotNull BilingualQueryResultBuilder resultBuilder, @NotNull Language sourceLanguage) { Elements synonymNodes = translationTable.select("tr.translationInlineSynonymsRow"); if (synonymNodes.size() == 0) { LOGGER.debug("No synonym entries found"); return; } String synonymEntryTitle = translationTable.select(".translationInlineSynonymsTitle span.highlight").first().text(); Map<String, SynonymGroupBuilder> synonymGroupMap = new HashMap<>(); for (Element synonymNode : synonymNodes) { // Extract only information from the "from"-node (i.e. source language) Element fromNode = synonymNode.getElementsByClass("from").first(); DictionaryObject newSynonym = processSingleNode(fromNode, sourceLanguage, synonymEntryTitle); String groupName = newSynonym.getDescription(); if (groupName != null) { SynonymGroupBuilder groupBuilder = synonymGroupMap.computeIfAbsent( groupName, (s) -> ImmutableSynonymGroup.builder() .setBaseMeaning( ImmutableDictionaryObject.createSimpleObject(sourceLanguage, s))); groupBuilder.addSynonym(newSynonym); } else { LOGGER.warn("Synonym group is null"); } } SynonymEntryBuilder synonymEntryBuilder = ImmutableSynonymEntry.builder() .setBaseObject( ImmutableDictionaryObject.createSimpleObject(sourceLanguage, synonymEntryTitle)); for (SynonymGroupBuilder synonymGroupBuilder : synonymGroupMap.values()) { synonymEntryBuilder.addSynonymGroup(synonymGroupBuilder.build()); } resultBuilder.addSynonymEntry(synonymEntryBuilder.build()); }