Python 从连续字符串中提取单词

Python 从连续字符串中提取单词,python,algorithm,nltk,text-mining,Python,Algorithm,Nltk,Text Mining,我有以下意见: callme senditnow runningcar 如何提取单词,如call me、send it now、running car。python中是否有任何库可以使用一些字典来实现这一点。我不知道正确的方法,但有一些方法可以作弊 这是我在大学里解决的一个算法练习问题,你有一个没有空格的字符串(例如,TheAreTheReasons),你试图找回单词 诀窍是试图将问题转化为一个图(有向无环图): 您需要一个函数来检查单词列表中是否存在单词(我当时使用的是/usr/share/

我有以下意见:

callme
senditnow
runningcar

如何提取单词,如call me、send it now、running car。python中是否有任何库可以使用一些字典来实现这一点。

我不知道正确的方法,但有一些方法可以作弊

这是我在大学里解决的一个算法练习问题,你有一个没有空格的字符串(例如,
TheAreTheReasons
),你试图找回单词

诀窍是试图将问题转化为一个图(有向无环图): 您需要一个函数来检查单词列表中是否存在单词(我当时使用的是
/usr/share/dict/words
解析为
grep
),然后用这种方式尝试所有单词的组合。存储单词和开始/结束索引

These (0,4)
The (0,2)
Sea (3,5)
[...]
然后,您只需通过在一个单词的结尾和另一个单词的开头之间建立链接,将它们转换为一个图表:

*--+The----Sea-------(no more words there)
   |
   +-These---Are+----The+-------Reason (not end)
                |       +----Reasons [String end]   <== Solution
                |
                +----There---A---Sons [String end]  <== False Positive
*-+大海-----(这里没有更多的文字)
|
+-这些---是+----原因(不是结束)

|+----原因[String end]Peter Norvig在其书中的章节中解决了这个确切的问题(Segaran和Hammerbacher,2009)

这一章有问题

你要做的是找到一个分段,这样每个单词的概率乘积就可以得到最高的分数。在这样做时,您可以避免生成非单词(概率应该接近零),并且在可能的情况下选择正确的切分

这是一种比使用graph方法更安全的方法,因为它将拒绝可能但不可能的元素

(您如何划分“speedofart”或“expertsexchange”?)

简而言之,方法如下:

  • 定义一个概率模型
  • 列举可能的候选人
  • 选择最可能的分词
  • 您只需定义一次模型,然后对要分段的每个字符串运行步骤2和3。步骤2和3以复杂度O(n**2)运行,其中n是要分段的字符串的长度


    在我给您的链接中,所有内容都进行了非常详细的解释,另外,您还可以使用Python代码来实现所有内容

    你把这件事搞错了。创建此文件的“编写者”应在文本中添加分隔符。用字典之类的方法解决这个问题将是一场噩梦。我重新标记了算法,因为正则表达式在这里肯定不是一个解决方案,因为正则表达式不懂英语来分隔文本。你当然需要一些NLP算法+字典来做到这一点。@HelloWorld可能是这样,但这对于不标记单词边界的语言来说是一个日常问题,他们设法解决了这个问题,至少达到了合理的满意度。@tripleee:如果我们谈论自动机理论,我同意,但是对于一门自然语言,我想不出真实世界的问题。你有一个例子吗?一个解决方案可以是插入一个以改进文本处理。在离家较近的地方,在英语URL中查找单词边界是我见过有人试图解决的一个问题。您的图表不完整;它没有明显的假阳性“…有一个儿子”。谢谢你提醒我:我讨厌在实施解决方案时出现的假阳性。我只想补充一点:如果你还计算了每个片段彼此相邻的概率,你可以使分割模型更加强大,计算每对单词的二元概率。为此,您需要一个二元概率模型,该模型使用类似于单元模型估计的技术构建。这样你就很可能避免像Jiby答案中的“There a sons”假阳性那样的序列选择。