Scala: Create all possible permutations of a sentence based synonyms of each word

北城余情 提交于 2019-12-24 13:49:09

问题


I have a sentence (string) and a function that generates all synonyms of a given word from WordNet. I would like to produce a list of all possible variations of my sentence based on its synonyms.

Furthermore, I would like to maintain the order of the original sentence, meaning permutations should only contain synonyms of the first word as their first word, and permutations of the second word as their second word, etc.

For example, if my input is:

"5 centimeters"

My output should be along the lines of:

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

What is the best way to proceed with this in Scala? Thanks!


回答1:


One answer to the question mentioned in the comments contains a useful crossJoin function that joins an arbitrary number of lists. This is my slightly edited version of it:

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
      }
  }

You also need some way of getting a list of synonyms for a word:

def synonyms(String): List[String]

Then your solution is just

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

crossJoin(words.map(synonyms))

That is, replace each word with a list of its synonyms and then cross join the result.



来源:https://stackoverflow.com/questions/54330356/scala-create-all-possible-permutations-of-a-sentence-based-synonyms-of-each-wor

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!