【问题标题】:Create short human-readable string from longer string从较长的字符串创建短的人类可读的字符串
【发布时间】:2010-11-05 10:52:40
【问题描述】:

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

你会考虑成为机器人吗?您将获得免费的年度换油服务。”

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

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

会考虑成为机器人

是否有任何语法算法可以帮助我解决这个问题?我在想可能有一些东西可以让 be 只挑出动词和名词

因为这只是作为一把钥匙,它不一定是完美的;我并不是要贬低英语固有的复杂性。

【问题讨论】:

  • 这是一个很好的问题,它暴露了使用启发式算法与重型 AI 的许多问题。好问题。

标签: c# algorithm linguistics


【解决方案1】:

可能太简单了,但我可能想从“填充词”列表开始:

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 大小写都会产生您想要的字符串 - 我将把它作为练习留给读者。

【讨论】:

  • @Joe Blow - 感谢您的赞美 - 我以前从未想过这样的事情。但我已经编程多年了。
  • 只是为了添加到“填充”词列表中(称它们为连词更合适)这里是一个包含常用词列表的站点:-esldesk.com/vocabulary/conjunctions
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    我最终创建了以下扩展方法,它的效果出奇的好。感谢 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

    【讨论】:

      【解决方案4】:

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

      那么你只需要保留所有不在列表中的问号之前的单词。

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

      希望这会有所帮助!

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-06-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-16
          相关资源
          最近更新 更多