从较长的字符串创建简短的人类可读字符串

时间:2010-11-05 10:52:40

标签: c# algorithm linguistics

我要求收缩一个字符串,例如......

  

你会考虑成为一名机器人吗?您将获得免费的年度换油。“

...更短但仍然 人类可识别的 (需要从选择列表中找到 - 我当前的解决方案让用户输入任意标题仅供选择的目的)

我想只提取构成问题的字符串部分(如果可能),然后以某种方式将其缩小为类似

  

WouldConsiderBecomingRobot

是否有任何语法算法可以帮助我解决这个问题?我想可能有些东西可以选择动词和名词

因为这只是作为一个关键,它不一定是完美的;我并不是要试图淡化英语的复杂性。

5 个答案:

答案 0 :(得分:4)

可能过于简单化,但我可能会试着从“填充词”列表开始:

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".

每个单词的Pascal大小写会产生你想要的字符串 - 我会把它作为读者的练习。

答案 1 :(得分:1)

创建一个热门的社交媒体网站。当用户想要加入或发表评论时,提示他们解决验证码。验证码将包括将缩短版本的长字符串与其完整版本相匹配。您的缩短算法将基于神经网络或遗传算法,该算法是从capcha结果中训练出来的。

您还可以在网站上销售广告。

答案 2 :(得分: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

答案 3 :(得分:0)

我认为没有任何算法可以识别字符串中的每个单词是名词,形容词还是其他什么。唯一的解决方案是使用自定义词典:只创建一个无法识别为动词或名词的单词列表(我,你,他们,他们,她,她,等等)。 / p>

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

这只是一种解决方法,我说,这并不完美。

希望这有帮助!

答案 4 :(得分:0)

欢迎来到natural language processing的精彩世界。如果您想识别名词和动词,则需要part of speech tagger