Scala: создайте все возможные перестановки синонимов каждого слова на основе предложений - PullRequest
0 голосов
/ 23 января 2019

У меня есть предложение (строка) и функция, которая генерирует все синонимы данного слова из WordNet.Я хотел бы составить список всех возможных вариантов моего предложения на основе его синонимов.

Кроме того, я хотел бы сохранить порядок исходного предложения, означая, что перестановки должны содержать только синонимы первого слова в качестве их первого слова и перестановки второго слова в качестве их второго слова и т. Д.

Например, если мой ввод:

"5 centimeters"

Мой вывод должен быть таким:

5 cm
5 centimetres
5 centi-meters
5 centi-metres
five cm
five centimetres
five centi-meters
five centi-metres

Как лучше всего это сделать в Scala?Спасибо!

1 Ответ

0 голосов
/ 23 января 2019

Один ответ на вопрос, упомянутый в комментариях , содержит полезную функцию crossJoin, которая объединяет произвольное количество списков. Это моя слегка отредактированная версия:

def crossJoin[T](list: Traversable[Traversable[T]]): Traversable[Traversable[T]] =
  list match {
    case Nil => Nil
    case x :: Nil => x map (Traversable(_))
    case x :: xs =>
      val xsJoin = crossJoin(xs)
      for {
        i <- x
        j <- xsJoin
      } yield {
        Traversable(i) ++ j
      }
  }

Вам также нужен какой-то способ получения списка синонимов для слова:

def synonyms(String): List[String]

Тогда ваше решение просто

val words: List[String] = "5 centimeters".split("\\s+").toList

crossJoin(words.map(synonyms))

То есть замените каждое слово списком его синонимов, а затем перекрестно соедините результат.

...