从较长的字符串创建短且易于理解的字符串

4
我有一个需求,需要缩减字符串长度,但仍然需要让人能够辨认出来(它需要在选择列表中找到——我的当前解决方案要求用户输入一个任意的标题,只用于选择)。
如果可能的话,我想提取字符串中形成问题的部分,并将其缩短为类似于“WouldConsiderBecomingRobot”的形式。
是否有语法算法可以帮助我完成这项工作? 我在想,也许有一些算法可以让我挑选出动词和名词。
由于这只是用作键,因此不必完美; 我并不想轻视英语语言的内在复杂性。

这是一个非常好的问题,揭示了使用启发式方法与重度人工智能之间许多问题。非常好的问题。 - Fattie
5个回答

4

也许过于简单化了,但我倾向于从“填充词”列表开始:

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

然后提取问号之前的所有内容(使用正则表达式、字符串拼接或其他你喜欢的方法),得到的结果是"Would you consider becoming a robot"。

然后遍历整个字符串,提取被认为是填充词的每个单词。

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

每个单词都使用帕斯卡命名法将会得到您想要的字符串 - 我会把这留给读者作为练习。

@Joe Blow - 感谢你的赞美 - 我以前从未想过这样的事情。但我已经编程多年了。 - Jamiec
只是为了增加“填充”词汇列表(更恰当的称呼应该是连词),这里有一个列出常见连词的网站:-http://www.esldesk.com/vocabulary/conjunctions - David Neale

1
我最终创建了以下扩展方法,它的效果出奇的好。感谢Joe Blow提供的出色和有效的建议:
    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
创建一个流行的社交媒体网站。当用户想要加入或发表评论时,提示他们解决验证码。验证码将由匹配长字符串的缩短版本和它们的完整版本组成。您的缩短算法将基于神经网络或遗传算法,这些算法是从验证码结果中训练出来的。
您还可以在网站上销售广告。

0

我认为没有任何算法可以确定字符串中的每个单词是名词、形容词或其他。唯一的解决方案是使用自定义字典:只需创建一个单词列表,其中包含无法识别为动词或名词的单词(例如I、you、they、them、his、hers、of、a、the等)。

然后,您只需保留问号前面不在列表中的所有单词。

这只是一个变通方法,正如您所说,它并不完美。

希望这有所帮助!


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接