Как создать пары комбинаций (биграмм) из пары входных строк? - PullRequest
0 голосов
/ 16 марта 2020

У меня есть 2 входные строки, и я хочу сгенерировать все комбинации пар строк, в которых каждая строка из другая входная строка .

Пример: входные строки:

"женские платья" и "женское платье"

Для комбинаций я хочу ограничить строки n = 2 (биграммы).

Ожидаемый результат:

женские - женские, женские - платья, платья - женские, платья - платья, женские платья - женские, женские платья - платья, женские платья - женские платья, женские платья - женские и женские платья - платья

1 Ответ

0 голосов
/ 19 марта 2020

Решается путем перекрестного произведения всех возможных подстрок (до длины 2) обеих входных строк.

Пример: если наши входные строки "1 2" и "3 4"

Тогда ,

Все подстроки входной строки 1 до длины 2 = sub1 = {"1", "2", "1 2"}

Все подстроки входной строки 2 до длины 2 = sub2 = {"3", "4", "3 4"}

Решение = перекрестное произведение sub1 и sub2 = {("1", "3"), ("1", "4"), ("1", "3 4"), ("2", "3"), («2», «4»), («2», «3 4»), («1 2», «3»), («1 2», «4»), («1 2», « 3 4 ")}

Используемые методы:

 //create subsets of length 1 AND 2 (bigrams)
  private def createSubSets(str: String): List[String] = {
    val arr = str.split(" ").filter(StringUtils.isNotBlank(_)).toSet[String]
    var subsets = arr.subsets(1).map(_.mkString).toList
    if(arr.size > 1) subsets ++= arr.subsets(2).map(_.mkString(" ")).toList
    subsets
  }

  private def generateSynonymCandidatesFromPair(str1: String, str2: String): List[(String, String)] ={
    createSubSets(str1).flatMap(s1 => createSubSets(str2).map(s2 => (s1, s2)))
  }
...