2010-11-05 22 views
4

短人类可读的字符串我有一个要求,承揽字符串,如...创建一个从更长的字符串

你会考虑成为一个机器人?你会提供一个免费的年度换油“

...的东西要短得多,但仍然力所能及识别(这将需要从选择列表中找到 - 我目前的解决方案有用户输入任意标题

我想提取构成一个问题(如果可能的话),然后以某种方式将其降低到像

WOU字符串的只有部分选择的唯一目的) ldConsiderBecomingRobot

是否有任何语法算法可以帮助我呢?我想有些东西可以挑选出动词和名词

因为这只是作为一个关键,它不一定是完美的;我不是在寻求简化英语语言中不可预测的复杂性。

+0

这是一个很大的问题,暴露了使用启发式算法和重型AI的许多问题。很好的问题。 – Fattie 2010-11-06 13:51:28

回答

1

我最终创建了下面的扩展方法,它工作得非常出色。感谢乔吹他出色和有效的建议:

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个字符:

  • 这没有任何prereqs - 写一篇文章...:PrereqsWriteEssay
  • 您选择了一辆车:YouveSelectedCar
0

我不认为有任何算法可以识别字符串的每个单词是否是名词,形容词或其他。唯一的解决方案是使用自定义字典:只需创建一个不能被识别为动词或名词的单词列表(我,你,他们,他们,他,她的,等等)。

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

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

希望这会有所帮助!

+0

当然,'我,你,他们,他们'都是(专业)名词。 – 2010-11-05 11:08:36

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

帕斯卡尔套每个单词将导致你想要的字符串 - 我会留下,作为读者的练习。

+0

@Joe Blow--感谢赞美 - 我以前从未想过这样的事情。但是我已经编了很多年了。 – Jamiec 2010-11-08 09:06:49

+0

只需添加到“填充”单词列表(将它们称为连词将更为合适),这里是一个包含常见列表的网站:-http://www.esldesk.com/vocabulary/conjunctions – 2010-11-08 10:00:07

1

创建一个流行的社交媒体网站。当用户想要加入或发表评论时,请提示他们解决验证码问题。验证码将包含将您的缩短版本的长字符串与完整版本进行匹配。您的缩短算法将基于神经网络或遗传算法,并通过capcha结果进行训练。

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