如何将没有空格的文本拆分为单词列表

11 浏览
0 Comments

如何将没有空格的文本拆分为单词列表

输入: \"tableapplechairtablecupboard...\" 许多单词 \n如何高效地将这样的文本拆分为单词列表并获得: \n输出: [\"table\", \"apple\", \"chair\", \"table\", [\"cupboard\", [\"cup\", \"board\"]], ...]\n首先想到的是遍历所有可能的单词(以第一个字母开头),找到可能的最长单词,从position=word_position+len(word)继续\n附注:
\n我们有所有可能的单词列表。
\n单词\"cupboard\"可以被拆分为\"cup\"和\"board\",选择最长的。
\n语言:Python,但主要是算法本身。

0
0 Comments

如何将没有空格的文本拆分成单词列表?

问题的原因是:我们需要将没有空格的文本拆分成单词列表,但是没有明确的分隔符。这使得我们无法直接使用常规方法来拆分文本。

解决方法是使用递归搜索。我们可以编写一个函数来递归地查找可能的单词组合。这个函数将接受一个字符串作为输入,并返回一个按照长度排序的可能的单词组合。

在解决方法中,我们首先需要创建一个包含所有可能单词的集合。这可以通过打开一个包含所有单词的字典文件,并将每个单词添加到集合中来实现。

然后,我们将使用递归函数来查找可能的单词组合。这个函数将接受三个参数:输入字符串、前缀和单词集合。如果输入字符串为空,则返回一个空列表。如果前缀为空且输入字符串是一个单词,则将该单词添加到结果列表中。

接下来,我们将前缀和剩余字符串拆分为两部分,并尝试两种情况:前缀是一个单词和前缀不是一个单词。如果前缀是一个单词,则将该单词添加到结果列表中,并继续递归查找剩余字符串。如果前缀不是一个单词,则继续递归查找剩余字符串,并将前缀作为下一个递归的参数。

最后,我们返回按照单词长度排序的结果列表中的第一个结果。如果结果列表为空,则抛出一个错误。

通过使用上述解决方法,我们可以将没有空格的文本拆分成单词列表。这个解决方法已经通过给定的示例进行了测试,并成功地返回了预期的结果。此外,我们还可以考虑使用字典树(trie)数据结构来进一步优化这个解决方法。

在没有明确分隔符的情况下,我们可以使用递归搜索来将没有空格的文本拆分成单词列表。通过使用一个包含所有可能单词的集合,我们可以递归地查找可能的单词组合,并返回按照长度排序的结果列表。这个解决方法已经通过给定的示例进行了测试,并成功地返回了预期的结果。

0
0 Comments

文章标题:如何将没有空格的文本分割成单词列表

在Stack Overflow的最佳答案的基础上,我创建了一个pip包以便于使用。

import wordninja
wordninja.split('derekanderson')
['derek', 'anderson']

要安装,请运行`pip install wordninja`。

唯一的区别是微小的。返回的是一个列表而不是字符串,它在Python 3中可用,它包含了单词列表,即使存在非字母字符(如下划线、破折号等),也能正确地进行分割。

再次感谢Generic Human!

首先,感谢解决方案。它的表现很好。然而,它会去掉特殊字符,比如“-”等。有时它不能正确地进行分割,比如对于一个很长的字符串,比如"WeatheringPropertiesbyMaterial Trade Name Graph 2-1. Color Change, E, after Arizona, Florida, Cycolac/Geloy Resin Systems Compared to PVC.[15] 25 20 15 ∆E 10 5 0 PVC, White PVC, Brown C/G, BrownC/G. Capstock is the material used as the surface layer applied to the exterior surface of a profile extrusion. Geloy resin capstock over a Cycolac substrate provides outstanding weatherability.[25]"

你能在GitHub上提一个问题吗?

我能忽略本地名称吗?有没有办法提供一个要忽略的单词列表?

代码很好,但是它似乎忽略了重音符号,`lm.split('knihyokoních')`得到的结果是`['knihy', 'ok', 'on', 'ch']`,丢失了“í”。另外一件事是,如果我将一些单词放在列表的前面,它们在分割这个短语时似乎被忽略了。很奇怪。

正则表达式分割器的目的是什么?我建议将它更改为`_SPLIT_RE = re.compile("[^'\w'']+")`以支持重音符号,例如`'knihyokoních'`,或者也可以将其作为某个自定义参数。因为当前版本也会通过重音符号进行分割,并且丢失了它们。

非常感谢你的解决方案。我有一个情况,输入字符串中插入了一些随机字母。例如,在"btmicrosoffilesecurebthomelogindropboxupdatetofficedropbox"中,"microsof"末尾的"t"丢失了,而在"update"之后的"t"是多余的。你能想到一种方法来跳过随机单词,并从字符串中获取最有可能的单词吗?请帮帮忙。

文章分析:

这篇文章主要是关于如何将没有空格的文本分割成单词列表的问题。作者使用了一个名为wordninja的pip包来实现这个目的。作者首先感谢了一个在Stack Overflow上的解决方案,并指出了该解决方案的一些不足之处。然后,作者提到了自己创建的pip包和该包的一些特点,比如返回的是一个列表而不是字符串,支持Python 3,包含了单词列表,即使存在非字母字符也能正确分割。接下来,读者在评论中提出了一些问题和建议,比如解决方案忽略了特殊字符、忽略了重音符号、如何忽略随机单词等。然后,作者再次感谢了解决方案,并回答了读者的问题和建议。整篇文章围绕着如何解决将没有空格的文本分割成单词列表的问题展开,作者通过引用代码和评论内容来支持自己的观点和解决方案。

0
0 Comments

问题的出现原因是需要将没有空格的文本分割成单词列表,以便进一步处理。解决方法是使用动态规划算法,通过建立模型和计算单词的概率来推断空格的位置。

文章内容可以整理如下:

在处理真实世界的数据时,简单的算法往往无法得到好的结果。下面是一个20行的算法,利用相对单词频率来准确地分割真实文本。

首先,需要建立输出的分布模型。一个很好的第一次近似是假设所有的单词是独立分布的。然后,只需要知道所有单词的相对频率。可以合理地假设它们遵循Zipf定律,即单词在单词列表中的排名为n的单词的概率大约为1/(nlogN),其中N是字典中的单词数。

确定了模型后,可以使用动态规划推断出空格的位置。最可能的句子是使每个单词的概率的乘积最大化的句子,使用动态规划可以很容易地计算出来。为了避免溢出,我们使用一个定义为概率的倒数的对数的成本。

下面是具体的代码实现,其中包括了一个用于推断空格位置的函数infer_spaces。

from math import log
# Build a cost dictionary, assuming Zipf's law and cost = -math.log(probability).
words = open("words-by-frequency.txt").read().split()
wordcost = dict((k, log((i+1)*log(len(words)))) for i,k in enumerate(words))
maxword = max(len(x) for x in words)
def infer_spaces(s):
    """Uses dynamic programming to infer the location of spaces in a string
    without spaces."""
    # Find the best match for the i first characters, assuming cost has
    # been built for the i-1 first characters.
    # Returns a pair (match_cost, match_length).
    def best_match(i):
        candidates = enumerate(reversed(cost[max(0, i-maxword):i]))
        return min((c + wordcost.get(s[i-k-1:i], 9e999), k+1) for k,c in candidates)
    # Build the cost array.
    cost = [0]
    for i in range(1,len(s)+1):
        c,k = best_match(i)
        cost.append(c)
    # Backtrack to recover the minimal-cost string.
    out = []
    i = len(s)
    while i>0:
        c,k = best_match(i)
        assert c == cost[i]
        out.append(s[i-k:i])
        i -= k
    return " ".join(reversed(out))
s = 'thumbgreenappleactiveassignmentweeklymetaphor'
print(infer_spaces(s))

运行上述代码,可以得到以下结果:

thumb green apple active assignment weekly metaphor

可以看到,结果几乎是完美的。关键是确保训练的单词列表与实际遇到的文本相似,否则结果会很糟糕。

优化方面,该算法的实现消耗线性的时间和内存,所以效率很高。如果需要进一步加速,可以使用单词列表构建后缀树来减少候选集的大小。如果需要处理非常大的连续字符串,可以考虑将字符串分割成块,以避免过多的内存使用。

对于算法的使用条件,主要取决于训练语料库。如果去除空格会导致很多的歧义,比如"his how me"和"hi show me",那么需要仔细调整语料库,以适应实际需求,并且在使用自由文本中减少噪音时需要小心,因为可能会产生更多的歧义。

总之,该算法是一种利用动态规划和概率模型推断空格位置的方法,可以有效地将没有空格的文本分割成单词列表。

0