在无空间字符串中的单词之间添加空格

时间:2010-10-21 03:02:28

标签: objective-c string nsstring

我在OS X上,在Objective-c中我试图转换

例如,

“Bobateagreenapple”

成 “鲍勃吃了一个青苹果”

有没有办法有效地做到这一点?涉及拼写检查的东西会起作用吗?

编辑:只是一些额外的信息: 我正在尝试构建一些需要一些格式错误的文本(例如,从旧的pdf粘贴的文本副本,最终没有空格,尤其是来自JSTOR等互联网档案)。由于错误格式化的文本可能会很长...好吧,我只是想在我实际尝试实际编写系统之前弄清楚这是否可行,以找出需要2个小时来修复一段文本

3 个答案:

答案 0 :(得分:2)

我将以非特定于操作系统的方式描述一种可能性,即搜索构成字母集合的所有可能单词。

基本上你砍掉你的字母集的第一个字母,然后把它添加到你正在形成的当前单词中。如果它生成一个单词(例如字典查找),则将其添加到当前句子中。如果你设法用尽所有收藏中的所有字母,并在所有字母中形成单词,那么你就会有一个完整的句子。但是,你不必在这里停下来。相反,你继续跑步,最终你会产生所有可能的句子。

伪代码看起来像这样:

FindWords(vector<Sentence> sentences, Sentence s, Word w, Letters l)
{
    if (l.empty() and w.empty())
        add s to sentences;
        return;
    if (l.empty())
        return;
    add first letter from l to w;
    if w in dictionary
    {
        add w to s;
        FindWords(sentences, s, empty word, l)
        remove w from s
    }
    FindWords(sentences, s, w, l)
    put last letter from w back onto l
}

当然,您可以执行一些优化以使其快速进行。例如,检查单词是否是词典中任何单词的词干。但是,这是给你所有可能句子的基本方法。

答案 1 :(得分:1)

解决这个问题要比在框架中找到的任何问题困难得多。请注意,即使在您的示例中,还有其他“解决方案”:“鲍勃一个茶青苹果”,一个。

一种非常幼稚(而且功能不是很强大)的方法可能是使用拼写检查器来尝试在字符串中一次隔离一个“真实单词”;当然,在这个例子中,这只会起作用,因为“Bob”恰好是一个英文单词。

这并不是说没有办法实现你想要的东西,但你说出这个问题的方式向我表明它可能比你期望的要复杂得多。也许有人可以给你一个可接受的解决方案,但我敢打赌,他们需要更多地了解你究竟想做什么。

编辑:为了响应您的编辑,可能需要花费更少的精力在PDF上运行某种OCR工具并更正其输出,而不是纠正此系统可能给您的内容,更不用说编程了

答案 2 :(得分:0)

我实现了一个解决方案,代码可用于代码项目:

http://www.codeproject.com/Tips/704003/How-to-add-spaces-between-spaceless-strings

我的想法是优先考虑使用大部分字符(最好是所有字符)的结果然后支持具有最长单词的字符,因为2,3或4个字符的长字通常偶然会出现在左边的字符中。大多数情况下,这提供了正确的解决方案。

要查找所有可能的排列,我使用了递归。即使使用大字典(用5万字测试),代码也非常快。