Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在无空格字符串中的单词之间添加空格_Objective C_String_Nsstring - Fatal编程技术网

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

Objective c 在无空格字符串中的单词之间添加空格,objective-c,string,nsstring,Objective C,String,Nsstring,我在OSX上,在objective-c中我试图转换 比如说,, “波巴蒂娜” 进入 “鲍勃吃了一个青苹果” 有没有办法有效地做到这一点?涉及拼写检查的东西会起作用吗 编辑:只是一些额外的信息: 我正试图构建一个包含一些格式错误的文本的东西(例如,从旧PDF粘贴的文本副本,最后没有空格,特别是从像JSTOR这样的互联网档案中)。由于格式错误的文本可能会很长。。。嗯,我只是想弄清楚这是否可行,然后才真正尝试编写系统,结果发现修复一段文本需要两个小时。解决这个问题比在框架中找到的任何东西都要困难得多。

我在OSX上,在objective-c中我试图转换

比如说,, “波巴蒂娜”

进入 “鲍勃吃了一个青苹果”

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

编辑:只是一些额外的信息:
我正试图构建一个包含一些格式错误的文本的东西(例如,从旧PDF粘贴的文本副本,最后没有空格,特别是从像JSTOR这样的互联网档案中)。由于格式错误的文本可能会很长。。。嗯,我只是想弄清楚这是否可行,然后才真正尝试编写系统,结果发现修复一段文本需要两个小时。

解决这个问题比在框架中找到的任何东西都要困难得多。请注意,即使在您的示例中,也有其他“解决方案”:“Bob a tea green apple”,例如

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

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


编辑:为了响应您的编辑,在PDF上运行某种OCR工具并更正其输出可能比仅更正此系统可能提供给您的内容所需的工作量要少,更不用说对其进行编程了,我将以非操作系统特定的方式对此进行描述,是对组成字母集合的所有可能的单词进行搜索

基本上,你会切掉你信件集合中的第一个字母,并将其添加到你正在形成的当前单词中。如果它生成一个单词(如查字典),则将其添加到当前句子中。如果你设法用光了你收集的所有字母,并用它们组成单词,那么你就有了一个完整的句子。但是,你不必停在这里。相反,你继续跑,最终你会写出所有可能的句子

伪代码如下所示:

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
}
FindWords(向量句、句子s、单词w、字母l)
{
if(l.empty()和w.empty())
在句子中添加s;
返回;
if(l.empty())
返回;
添加从l到w的第一个字母;
如果字典里有w
{
将w添加到s;
FindWord(句子、s、空单词、l)
从s中删除w
}
FindWords(句子,s,w,l)
把w的最后一个字母放回l
}

当然,有很多优化可以让它运行得更快。例如,检查单词是否是词典中任何单词的词干。但是,这是提供所有可能句子的基本方法。

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

我的想法是,对使用了大部分字符(最好是所有字符)的结果进行优先级排序,然后选择单词最长的结果,因为2、3或4个字符长的单词通常会偶然出现在漏掉的字符中。大多数情况下,这提供了正确的解决方案


为了找到所有可能的排列,我使用了递归。即使使用大型字典(使用50000个单词进行测试),代码也相当快

+1个非常有趣的问题。我很有兴趣看到这个问题的解决方案,尽管我想不出一个。唯一可以考虑的方法就是把所有的字母通读一遍,然后把这个单词作为一个完整的单词放到字典里比较,然后把它切掉。。。尽管这种方法很快就会失败。这也可以被解释为(无可否认是荒谬的)“鲍勃是一个茶绿苹果”。@Ferruccio:你已经确切地证明了为什么这会充满麻烦。。。这就是这个问题中的示例文本。可能会有一些真实的例子是有意义的,但仍然是错误的。@Ferruccio:+1因为在我写我的例子之前偷了它>:(文本中有标点符号吗?显然这会让它容易得多,因为你可以分别处理每个句子(片段)。它也可能是“波巴茶…”,这是一种颇受欢迎的饮料,确实有苹果口味,因此,即使是对短语出现频率和上下文的复杂分析也可能会被丢弃。我们社区不欢迎只提供链接的答案。请在此处添加相关代码