Scala:为每个单词的基于同义词的句子创建所有可能的排列

时间:2019-01-23 15:16:17

标签: arrays scala combinations

我有一个句子(字符串)和一个从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 :(得分:0)

the question mentioned in the comments的一个答案包含一个有用的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))

也就是说,将每个单词替换为其同义词列表,然后交叉连接结果。