Создать короткую, понятную человеку строку из более длинной строки - PullRequest
4 голосов
/ 05 ноября 2010

У меня есть требование заключить строку, например ...

Вы бы хотели стать роботом? Вам будет предоставлена ​​бесплатная ежегодная замена масла. "

... к чему-то гораздо более короткому, но все же идентифицируемому человеку (его нужно будет найти в списке выбора - в моем текущем решении пользователи вводят произвольный заголовок для единственная цель выбора)

Я хотел бы извлечь только часть строки, которая формирует вопрос (если возможно), а затем каким-то образом уменьшить его до значения, подобного

WouldConsiderBecomingRobot

Существуют ли какие-либо грамматические алгоритмы, которые могут помочь мне в этом? Я думаю, что может быть что-то, что позволяет выбрать только глаголов и существительных .

Так как это просто для того, чтобы действовать как ключ, оно не должно быть совершенным; Я не стремлюсь упрощать неотъемлемую сложность английского языка.

Ответы [ 5 ]

4 голосов
/ 05 ноября 2010

Возможно, слишком упрощенно, но я мог бы испытать искушение начать со списка "слов-заправщиков":

var fillers = new[]{"you","I","am","the","a","are"};

Затем извлеките все перед вопросительным знаком (используя регулярные выражения, разбивку строк, все, что вам захочется), и вы получите «Вы хотели бы стать роботом».

Затем просмотрите строку, извлекая каждое слово, которое считается заполнителем.

var sentence = "Would you consider becoming a robot";
var newSentence = String.Join("",sentence.Split(" ").Where(w => !fillers.Contains(w)).ToArray());
// newSentence is "Wouldconsiderbecomingrobot".

Обсуждая каждое слово в Паскале, вы получите желаемую строку - я оставлю это в качестве упражнения для читателя.

1 голос
/ 15 декабря 2010

В итоге я создал следующий метод расширения, который работает на удивление хорошо. Спасибо Джо Блоу за его превосходные и эффективные предложения:

    public static string Contract(this string e, int maxLength)
    {
        if(e == null) return e;

        int questionMarkIndex = e.IndexOf('?');
        if (questionMarkIndex == -1)
            questionMarkIndex = e.Length - 1;

        int lastPeriodIndex = e.LastIndexOf('.', questionMarkIndex, 0);

        string question = e.Substring(lastPeriodIndex != -1 ? lastPeriodIndex : 0, questionMarkIndex + 1).Trim();

        var punctuation =
            new [] {",", ".", "!", ";", ":", "/", "...", "...,", "-,", "(", ")", "{", "}", "[", "]","'","\""};

        question = punctuation.Aggregate(question, (current, t) => current.Replace(t, ""));

        IDictionary<string, bool> words = question.Split(' ').ToDictionary(x => x, x => false);

        string mash = string.Empty;
        while (words.Any(x => !x.Value) && mash.Length < maxLength)
        {
            int maxWordLength = words.Where(x => !x.Value).Max(x => x.Key.Length);
            var pair = words.Where(x => !x.Value).Last(x => x.Key.Length == maxWordLength);
            words.Remove(pair);
            words.Add(new KeyValuePair<string, bool>(pair.Key, true));
            mash = string.Join("", words.Where(x => x.Value)
                                       .Select(x => x.Key.Capitalize())
                                       .ToArray()
                );
        }

        return mash;
    }

Это сокращает до 15 символов:

  • Для этого нет предварительных требований - напишите эссе ...: PrereqsWriteEssay
  • Вы выбрали автомобиль: YouveSelectedCar
1 голос
/ 06 ноября 2010

Создайте популярный сайт в социальных сетях. Когда пользователи хотят присоединиться или оставить комментарии, предложите им решить код с картинки. Капча будет состоять из сопоставления ваших сокращенных версий длинных строк с их полными версиями. Ваш алгоритм укорочения будет основан на нейронной сети или генетическом алгоритме, который обучается по результатам капчи.

Вы также можете продавать рекламу на сайте.

0 голосов
/ 06 ноября 2010

Добро пожаловать в удивительный мир обработки естественного языка . Если вы хотите идентифицировать существительные и глаголы, вам понадобится часть речевого тегера .

0 голосов
/ 05 ноября 2010

Я не думаю, что существует какой-либо алгоритм, который может определить, является ли каждое слово строки существительным, прилагательным или чем-то еще.Единственное решение состоит в том, чтобы использовать пользовательский словарь: просто создать список слов, которые нельзя идентифицировать как глаголы или существительные (я, вы, они, они, его, ее, а, и т. Д.).

Тогда вам просто нужно оставить все слова перед знаком вопроса, которых нет в списке.

Это просто обходной путь, и я сказал, что он не идеален.

Надеюсь, это поможет!

...