什么算法可以将文本分解为其组成单词?

时间:2012-07-08 05:02:02

标签: c# wpf algorithm pdf text-parsing

我惊喜地发现使用iTextSharp从pdf文件中提取文本是多么容易。通过关注this article,我能够使用这个简单的代码将pdf文件转换为文本:

string pdfFilename = dlg.FileName;
// Show just the file name, without the path
string pdfFileNameOnly = System.IO.Path.GetFileName(pdfFilename);
lblFunnyMammalsFile.Content = pdfFileNameOnly;
string textFilename = String.Format(@"C:\Scrooge\McDuckbilledPlatypus\{0}.txt", pdfFileNameOnly);

PDFParser pdfParser = new PDFParser();
if (!pdfParser.ExtractText(pdfFilename, textFilename))
{
    MessageBox.Show("there was a boo-boo");
}

问题是生成的文本文件包含这样的文本(即它没有空格):

IwaspleasantlysurprisedtofindhoweasyitistouseiTextSharptoextractthetextfromatextfile.

是否存在一个“那里”的算法,它将采用这样的文本并最好地猜测单词中断的位置(AKA“空格”)应该去哪里?

1 个答案:

答案 0 :(得分:5)

虽然我同意Gavin的观点,在这种情况下解决这个问题很简单,但问题本身就是一个有趣的问题。

这需要启发式算法来解决。我将稍微解释为什么我这么认为。但首先,我将解释我的算法。

将所有字典单词存储在Trie中。现在拿一句话,抬头看看特里来说一句话。特里跟踪单词的结尾。找到单词后,在句子中为其添加空格。这适用于你的判决。但请考虑以下两个例子:

  • 他给了我这本书
  • 他告诉我一个比喻

对于第一个例子,上述算法工作正常,但对于第二个例子,算法输出:

他告诉我 par

为了避免这种情况,我们需要考虑最长的匹配,但如果我们这样做,那么第一个例子的输出就变成了:

他给了他的书

因此我们陷入困境,因此在算法中添加启发式算法,以便能够用语法判断他给了他的书是没有意义的。