我有输入:
callme
senditnow
runningcar
如何提取单词,比如打电话给我,现在发送,运行汽车。在python中有任何库可以使用一些字典来完成。
答案 0 :(得分:5)
我不知道正确的方法,但有办法作弊!
这是我在大学解决的一个算法运动问题,你有一个没有空格的字符串(例如thesearethereasons
),而你正试图找回这些单词。
诀窍是试图将问题转化为图形(有向无环图):
你需要一个函数来检查dictionnary中是否存在单词(我当时使用/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
现在你有一个单词图,只需跟随它(DFS)到最后。以字符串结束的任何路径都表示单词=)
你可以想象,几个单词组合可以做到这一点,让你回到一系列似乎合理的句子&#34;。那不是一个完美的解决方案
答案 1 :(得分:3)
Peter Norvig在他的书Beautiful Data(Segaran和Hammerbacher,2009)一章中解决了这个问题。
Here是有问题的章节。
您要做的是找到一个细分,使每个单词的概率乘积得分最高。这样做时,您可以避免产生非单词(概率应该接近于零),并且您可能在很多可能的情况下选择正确的分段。
这比使用图表方法更安全,因为它会拒绝可能但不可能的元素。
(你如何细分&#34; speedofart&#34;或&#34; expertsexchange&#34;?)
简而言之,方法如下:
您可以定义一次模型,并为要分段的每个字符串运行第2步和第3步。步骤2和3以复杂度O(n ** 2)运行,其中n是要分段的字符串的长度。
在我给你的链接中详细解释了所有内容,并且你获得了Python代码来实现所有内容!