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());
  }