Найти другое слово между двумя строками - PullRequest
5 голосов
/ 02 марта 2012

У меня есть большой список фраз, таких как

"Nola jumped off the cliff"
"Loroy jumped off the cliff"
"Nola jumped off the couch"
"Leroy lept off the couch"

. Мне нужно найти каждую точку во фразе, которая является другим словом, и добавить это слово в узел, который представляет собой список слов, которыеможет использоваться в этой позиции во фразе.Таким образом, мы получим в итоге.

"Node1(1) Node2(1) off the Node3(1)"
"Node1(2) Node2(1) off the Node3(1)"
...etc

Где узел 1 представляет список имен (Nola, Leroy), узел2 представляет список действий (jumped, lept), а узел3 заканчивается представлением спискаместоположений (скала, кушетка)

Идея состоит в том, чтобы взять список фраз и автоматически создать узлы и заполнить его словами, которые можно использовать в этом узле во фразе.

Итак, 1-й, как бы я сгенерировал список узлов фраз?Я не смог выяснить, как сравнить два предложения и посмотреть, совпадают ли они в точности минус одно слово.

2-й, как только я настрою узлы, что будет лучшим способом сравнить всекомбинации узлов, чтобы придумывать новые совпадения?(надеюсь, что это имело смысл)

Ответы [ 3 ]

5 голосов
/ 02 марта 2012

Хороший, мне нравится.Поскольку вы пометили свой вопрос с помощью C #, я написал ответ также на C #.

Быстрый способ получить разные слова между двумя фразами:

string phrase1 = "Nola jumped off the cliff";
string phrase2 = "Juri jumped off the coach";

//Split phrases into word arrays
var phrase1Words = phrase1.Split(' ');
var phrase2Words = phrase2.Split(' ');

//Find the intersection of the two arrays (find the matching words)
var wordsInPhrase1and2 = phrase1Words.Intersect(phrase2Words);

//The number of words that differ 
int wordDelta = phrase1Words.Count() - wordsInPhrase1and2.Count();

//Find the differing words
var wordsOnlyInPhrase1 = phrase1Words.Except(wordsInPhrase1and2);
var wordsOnlyInPhrase2 = phrase2Words.Except(wordsInPhrase1and2);

Вместосопоставляя сами элементы путем циклического повторения и проверки каждого элемента, вы можете сэкономить время и использовать встроенные функции LINQ Intersect, Except и т. д. *

Для создания фраз случайным образом см.ответ NominSim.

1 голос
/ 02 марта 2012

Еще одно решение на основе Linq, которое генерирует все возможные комбинации:

var phrases = new List<string> {
           "Nola jumped off the cliff",
           "Loroy jumped off the cliff",
           "Nola jumped off the couch",
           "Leroy lept off the couch"
                           };

var sets = (from p in phrases
            from indexedWord in p.Split(' ').Select((word,idx) => new {idx,word})
            group indexedWord by indexedWord.idx into g
            select g.Select(e => e.word).Distinct()).ToArray();


var allCombos = from w1 in sets[0]
                from w2 in sets[1]
                from w3 in sets[2]
                from w4 in sets[3]
                from w5 in sets[4]
                select String.Format("{0} {1} {2} {3} {4}.", w1, w2, w3, w4, w5);

Не подходит для наиболее читабельного кода, но было весело писать. =)

0 голосов
/ 02 марта 2012

Сначала для создания списка должно сработать что-то вроде этого:

        HashSet<String>[] NodeList = new HashSet<String>[phraseLength];
        for (int i = 0; i < phraseLength; i++)
        {
            NodeList[i] = new HashSet<string>();
        }

        foreach (String phrase in PhraseList)
        {
            string[] phraseStrings = phrase.Split(' ');
            for (int i = 0; i < phraseLength; i++)
            {
                if(!NodeList[i].Contains(phraseStrings[i]))
                {
                    NodeList[i].Add(phraseStrings[i]);
                }
            }
        }

Затем, когда вы создаете свои предложения, вы можете просто пройти по NodeList и выбрать строку из каждого узла, если вы хотите сделать это случайным образомможет быть что-то вроде этого:

        String sentence = "";
        foreach (HashSet<String> Node in NodeList)
        {
            Random rand = new Random();
            sentence += Node.ToArray()[rand.Next(0, Node.Count)];
        }

Следует учесть, что HashSet, вероятно, не лучшая идея, если вам нужен случайный доступ к нему.

...