问题
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