4

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

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

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

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

会考虑成为机器人

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

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

4

5 回答 5

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

于 2010-11-05T11:09:47.190 回答
1

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

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

于 2010-11-05T22:13:34.213 回答
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
于 2010-12-15T15:51:30.600 回答
0

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

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

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

希望这可以帮助 !

于 2010-11-05T11:06:43.577 回答
0

欢迎来到自然语言处理的精彩世界。如果你想识别名词和动词,你需要一个词性标注器

于 2010-11-05T22:05:49.050 回答