如何将不带空格的文本拆分为单词列表

2024-03-10

Input: "tableapplechairtablecupboard..."很多话

将此类文本拆分为单词列表并获得的有效算法是什么:

Output: ["table", "apple", "chair", "table", ["cupboard", ["cup", "board"]], ...]

首先想到的是遍历所有可能的单词(从第一个字母开始)并找到可能的最长单词,从position=word_position+len(word)

P.S.
我们有一个所有可能单词的列表。
“柜”字可以是“杯”和“板”,选择最长的。
语言:python,但主要是算法本身。


当应用于现实世界的数据时,简单的算法不会给出好的结果。这是一个 20 行算法,它利用相对词频来为真实单词文本提供准确的结果。

(如果您想要不使用词频的原始问题的答案,则需要细化“最长单词”的确切含义:是有一个 20 个字母的单词和 10 个 3 字母的单词更好,还是最好有五个 10 个字母的单词?一旦确定了精确的定义,您只需更改定义行wordcost以反映其预期含义。)

The idea

最好的方法是继续model输出的分布。一个好的第一个近似是假设所有单词都是独立分布的。那么你只需要知道所有单词的相对频率即可。可以合理地假设它们遵循齐普夫定律,即具有等级的词n单词列表中的概率大约为 1/(n log N) where N是字典中的单词数。

修复模型后,您可以使用动态规划来推断空间的位置。最可能的句子是使每个单词的概率乘积最大化的句子,并且很容易通过动态规划来计算它。我们不直接使用概率,而是使用定义为概率倒数对数的成本来避免溢出。

The code

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))

结果

我在用我整理的这本快速而肮脏的 125k 单词词典 http://tinypaste.com/c1666a6b来自维基百科的一小部分。

Before:拇指绿色苹果每周主动作业隐喻。
After:拇指青苹果每周主动作业隐喻。

Before:存在大量从 html 解析而来的人们评论的文本信息,但有 其中的有限字符例如拇指青苹果活跃作业每周隐喻 显然,字符串中有拇指、青苹果等,因此有一个大字典可供查询 这个词是否合理,那么最快的提取方式是什么?

After:有大量从 html 解析出来的人们评论的文本信息,但其中没有分隔字符,例如拇指青苹果主动作业每周隐喻显然字符串中有拇指青苹果等我还有一个大字典来查询是否这个词是合理的,那么最快的提取方法是什么,非常感谢。

Before:那是一个漆黑的暴风雨之夜,大雨倾盆,除了偶尔有一阵猛烈的狂风席卷伦敦的街道,我们的场景沿着屋顶嘎嘎作响,猛烈地搅动着与黑暗作斗争的灯火。

After:那是一个漆黑的暴风雨之夜,雨倾盆而下,偶尔会被席卷街道的狂风所阻止,因为我们的场景是在伦敦,沿着屋顶嘎嘎作响,猛烈地搅动着微弱的火焰。那些与黑暗作斗争的灯。

正如您所看到的,它基本上是完美无缺的。最重要的部分是确保你的单词列表被训练成与你实际遇到的相似的语料库,否则结果将非常糟糕。


优化

该实现消耗线性量的时间和内存,因此相当高效。如果需要进一步加速,可以从单词列表构建后缀树以减少候选集的大小。

如果需要处理非常大的连续字符串,则合理地分割字符串以避免过多的内存使用。例如,您可以以 10000 个字符的块形式处理文本,并在两侧留出 1000 个字符的边距,以避免边界效应。这将使内存使用量保持在最低限度,并且几乎肯定不会对质量产生影响。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将不带空格的文本拆分为单词列表 的相关文章

随机推荐

  • 如何将自定义 CSS 与我的 Sharepoint WebPart 结合使用?

    ello 我正在为 Sharepoint 开发我的第一个 WebPart 现在我想知道在哪里 如何包含 存储我的 CSS 我应该将 css 文件放在哪里 我应该如何将它们包含在我的网络部件中 这是我的方法 protected overrid
  • 如何查找两个日期之间的持续时间

    我想找到两个日期列之间的持续时间 为此 我使用 DATEDIFF 函数分别查找年份和月份 但希望两个结果都在单列中 下面给出了两列 start dt end dt 06 Oct 2009 15 Jul 2011 需要的结果 Duration
  • 如何防止 WPF 使用 Windows 字体大小选项进行缩放?

    我不希望我的 WPF GUI 根据 Windows 字体大小选项 DPI 进行缩放 这不仅仅是在 UserControl 上指定固定字体大小的问题 因为缩放会影响 UserControl 中的图像和边框 我可以在 UserControl 上
  • 比较 Codeigniter 和 MySQL 中的两个日期

    如何在 Codeigniter 查询函数中获取两个日期之间的值 这是我的模型和示例代码 function get promo today date Y m d query this gt db gt query SELECT FROM tb
  • 如何提高 Perl 中 lock_keys 的使用?

    我在用着Hash Util s lock keys每当尝试访问哈希中不存在的键时就会死掉 有时我的哈希值很深 哈希值 哈希值的哈希值 有没有 一次性锁定它们的快速方法 是否可以控制 失败时的默认消息 即 添加未找到密钥的哈希转储 lock
  • 使用额外数据从 NFC 标签启动 Android 应用程序

    我只需将手机放在 NFC 标签上即可启动我的应用程序 但我想将这个想法更进一步 想象一个带有两个 NFC 标签的简单时间跟踪应用程序 第一个将启动 并下载 应用程序并注册启动时间 另一个也将启动 并下载 应用程序 但注册一个停止时间 我想解
  • 将符号链接添加到脚本到 rc.d 文件夹中以在系统启动期间启动进程[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我使用的是 Fedora 15 我正在尝试添加 MYSql 守护进程以在系统启动期间启动 我明白我必须将其添加到rc5 d因为它是默认目标并且是gra
  • 直接作为 SQL 查询查询 Sqlalchemy-utils EncrytedType

    我有一个 用户 表 其中电子邮件为加密类型 class AllUser db Model id db Column db Integer autoincrement True primary key True index True emai
  • 在rabbitmq autoconfig connectionfactory bean上设置heartbeat属性

    我应该如何在rabbitmq spring中的CachingConnectionFactory bean上设置heartbeat属性 这是在云铸造环境中 因此 应用程序将通过清单文件使用服务绑定 并且我没有代理主机名 在我的SimpleMe
  • X-UA 兼容的 http 标头实际上适用于 IE9 吗?

    我正在开发一个可以作为 Intranet 站点托管的 Web 产品 我正在尝试找到一种编程方法来防止 IE9 滑入 IE9 兼容性视图浏览器模式 即使 在兼容性视图中显示 Intranet 站点 可能已打开 我正在使用这个 html 页面进
  • 有没有办法将 kptr_restrict 设置为 0?

    我目前在运行 linux perf 时遇到问题 主要是因为 proc sys kernel kptr restrict当前设置为 1 但是 如果我尝试 proc sys kernel kptr restrict通过回显 0 来如下 echo
  • 处理尝试破解网站的最佳方法

    一点背景 我为一个非营利组织运营该网站 在发现死链接后 我在网站上运行了链接检查器 并发现了更多链接 因此 我实现了一个自定义 404 页面来记录所有失败的链接 这使我能够修复损坏的链接 并提醒链接到我们的其他人他们的链接已损坏 它很快就得
  • R 矩阵/data.frame索引选择真的很慢

    我正在选择 data frame 的子集g raw 像这样 g raw lt read table gfile sep header F row names 1 snps intersect row names na omit csnp r
  • 与 Julia 实时绘图

    我正在尝试绘制一个与 Julia 一起实时演化的函数 为此 当我尝试完全应用给定的示例时 我发现 GR 包可以在 Julia 中使用here https pgi jcns fz juelich de pub doc anim html im
  • 如果我需要自定义 getter/setter,我可以省略字段创建吗?

    我可以写出如此漂亮简单的代码 public int Delta get private set 现在我只想添加一个电话OnPropertyChanged Delta 这是我知道如何做到这一点的唯一方法 public int Delta ge
  • 并排绘制 gList

    我有 2 个 gList 对象 网格 当我这样做时 它们可以很好地绘制 grid draw plot1 grid draw plot2 但我希望这些在 pdf 中并排显示 就像是 pdf test pdf par mfrow c 1 2 p
  • 如何更改列表视图的文本大小

    我正在使用 List Activity 从 SQLITE 检索数据 但我无法设置列表视图的字体大小 请帮我 public class CartList extends ListActivity private ArrayList
  • PDF Box 由于其中包含 JBIG2 图像而生成空白图像

    首先让我向您介绍一下我的项目 我有一个 pdf 文件 需要将其转换为图像 一页一张图像 PDFBoxAPI 并将所有这些图像写入新的 pdf 中PDFBoxAPI 本身 基本上 将 pdf 转换为 pdf 我们称之为 PDF 转码 对于某些
  • Qt QImage 到 QPixmap 转换丢失 UI 的颜色信息

    我正在尝试更新主 Qt UI 中 QLabel 上的 QPixmap 调用以下插槽来使用 newImage 变量 QImage 执行此操作 因为它来自不同的线程 QImage 使用 ConvertFromImage 转换为 someImag
  • 如何将不带空格的文本拆分为单词列表

    Input tableapplechairtablecupboard 很多话 将此类文本拆分为单词列表并获得的有效算法是什么 Output table apple chair table cupboard cup board 首先想到的是遍