如何将python/cython unicode字符串转换为长整数数组,以进行levenshtein编辑距离[重复]

2023-12-24

可能的重复:
如何纠正 Damerau-Levenshtein 实施中的错误? https://stackoverflow.com/questions/3431933/how-to-correct-bugs-in-this-damerau-levenshtein-implementation

我有以下内容Cython http://docs.cython.org/index.html代码(改编自bpbio http://code.google.com/p/bpbio/source/browse/trunk/seqfind/seqfind.pyx项目)达默劳-编辑距离计算:

#---------------------------------------------------------------------------
cdef extern from "stdlib.h":
  ctypedef unsigned int size_t
  size_t strlen(char *s)
  void *malloc(size_t size)
  void *calloc(size_t n, size_t size)
  void free(void *ptr)
  int strcmp(char *a, char *b)
  char * strcpy(char *a, char *b)

#---------------------------------------------------------------------------
cdef extern from "Python.h":
  object PyTuple_GET_ITEM(object, int)
  void Py_INCREF(object)

#---------------------------------------------------------------------------
cdef inline size_t imin(int a, int b, int c):
  if a < b:
    if c < a:
      return c
    return a
  if c < b:
    return c
  return b

#---------------------------------------------------------------------------
cpdef int editdistance( char *a, char *b ):
  """Given two byte strings ``a`` and ``b``, return their absolute Damerau-
  Levenshtein distance. Each deletion, insertion, substitution, and
  transposition is counted as one difference, so the edit distance between
  ``abc`` and ``ab``, ``abcx``, ``abx``, ``acb``, respectively, is ``1``."""

  #.........................................................................
  if strcmp( a, b ) == 0: return 0
  #.........................................................................
  cdef int    alen    = strlen( a )
  cdef int    blen    = strlen( b )
  cdef int    R
  cdef char   *ctmp
  cdef size_t i
  cdef size_t j
  cdef size_t achr
  cdef size_t bchr
  #.........................................................................
  if alen > blen:
    ctmp = a;
    a = b;
    b = ctmp;
    alen, blen = blen, alen
  #.........................................................................
  cdef char   *m1     = <char *>calloc(   blen + 2,    sizeof( char ) )
  cdef char   *m2     = <char *>calloc(   blen + 2,    sizeof( char ) )
  cdef char   *m3     = <char *>malloc( ( blen + 2 ) * sizeof( char ) )
  #.........................................................................
  for i from 0 <= i <= blen:
    m2[ i ] = i
  #.........................................................................
  for i from 1 <= i <= alen:
    m1[ 0 ] =    i + 1
    achr    = a[ i - 1 ]
    for j from 1 <= j <= blen:
      bchr = b[ j- 1 ]
      if achr == bchr:
        m1[ j ] = m2[ j - 1 ]
      else:
        m1[ j ] = 1 + imin( m1[ j - 1 ], m2[ j - 1 ], m2[ j ] )
      if i != 1 and j != 1 and achr == b[ j - 2 ] and bchr == a[ i - 2 ]:
        m1[ j ] = m3[ j - 1 ]
    #.......................................................................
    m1, m2 = m2, m1
    strcpy( m3, m2 )
  #.........................................................................
  R = <int>m2[ blen ]
  #.........................................................................
  # cleanup:
  free( m3 )
  free( m1 )
  free( m2 )
  #.........................................................................
  return R

该代码运行良好且快速(在我的 PC 上每秒进行 300,000...400,000 次比较)。

挑战在于使该代码也能与 unicode 字符串一起使用。我正在运行 Python 3.1 并从数据库中检索文本,然后将其与查询文本相匹配。

将这些字符串编码为bytes在将它们传递给 Cython 函数进行比较之前不是一个好主意,因为性能会受到相当大的影响(经过测试),并且对于包含 7 位 US ASCII 之外的字符的任何文本,结果可能是错误的。

(非常简洁)Cython 手册确实提到了 unicode 字符串,但对当前的问题几乎没有帮助。

在我看来,unicode 字符串可以被认为是一个整数数组,每个整数代表一个代码点,上面的代码基本上是在数组上运行的char已经是了,所以我猜我应该(1)扩展它来处理 C 整数数组;(2)添加代码以将 python unicode 字符串转换为 C 数组;(3)利润!。

( Note: 这种方法有两个潜在的问题:一个是处理 unicode 代理字符,但我想我知道如何处理这些字符。另一个问题是 unicode 代码点并没有真正 1:1 映射到“字符”的概念。我很清楚这一点,但我认为这超出了这个问题的范围。请假设一个 unicode 代码点是一个比较单位。)

所以我寻求建议如何

  • 编写一个快速 Cython 函数,该函数接受 python unicode 字符串并返回 Cython 的 C 数组unsigned ints(4字节);

  • 修改显示的代码来处理这些数组并执行正确的内存分配/释放(这对我来说是相当陌生的东西)。

Edit: 约翰·梅钦 https://stackoverflow.com/users/84270/john-machin指出了奇怪的类型转换char *m1等可能是为了速度和/或内存优化而完成的;这些变量仍然被视为数字数组。我意识到该代码没有采取任何措施来防止长字符串可能发生的溢出;当一个数组元素超过 127 或 255(取决于所使用的 C 编译器)时,可能会出现错误结果。对于来自生物信息学项目的代码有点令人惊讶。

也就是说,我只对少于一百个字符左右的基本相同的字符串的精确结果感兴趣。出于我的目的,低于 60% 相同性的结果可以安全地报告为“完全不同”(通过返回较长文本的长度),所以我想最好保留char *m1强制转换到位,但添加一些代码来检查溢出和早期中止,以防出现严重的差异。


Use ord()将字符转换为其整数代码点。它适用于来自任一unicode or str字符串类型:

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

如何将python/cython unicode字符串转换为长整数数组,以进行levenshtein编辑距离[重复] 的相关文章

  • Flask 和 uWSGI - 无法加载应用程序 0 (mountpoint='')(找不到可调用或导入错误)

    当我尝试使用 uWSGI 启动 Flask 时 出现以下错误 我是这样开始的 gt cd gt root localhost uwsgi socket 127 0 0 1 6000 file path to folder run py ca
  • 如何在 Sublime Text 2 的 OSX 终端中显示构建结果

    我刚刚从 TextMate 切换到 Sublime Text 2 我非常喜欢它 让我困扰的一件事是默认的构建结果显示在 ST2 的底部 我的程序产生一些很长的结果 显示它的理想方式 如在 TM2 中 是并排查看它们 如何在 Mac 操作系统
  • 如何使用包含代码的“asyncio.sleep()”进行单元测试?

    我在编写 asyncio sleep 包含的单元测试时遇到问题 我要等待实际的睡眠时间吗 I used freezegun到嘲笑时间 当我尝试使用普通可调用对象运行测试时 这个库非常有用 但我找不到运行包含 asyncio sleep 的测
  • SQL Alchemy 中的 NULL 安全不等式比较?

    目前 我知道如何表达 NULL 安全的唯一方法 SQL Alchemy 中的比较 其中与 NULL 条目的比较计算结果为 True 而不是 NULL 是 or field None field value 有没有办法在 SQL Alchem
  • 从 scikit-learn 导入 make_blobs [重复]

    这个问题在这里已经有答案了 我收到下一个警告 D Programming Python ML venv lib site packages sklearn utils deprecation py 77 DeprecationWarning
  • 运行多个 scrapy 蜘蛛的正确方法

    我只是尝试使用在同一进程中运行多个蜘蛛新的 scrapy 文档 http doc scrapy org en 1 0 topics practices html但我得到 AttributeError CrawlerProcess objec
  • 在 NumPy 中获取 ndarray 的索引和值

    我有一个 ndarrayA任意维数N 我想创建一个数组B元组 数组或列表 其中第一个N每个元组中的元素是索引 最后一个元素是该索引的值A 例如 A array 1 2 3 4 5 6 Then B 0 0 1 0 1 2 0 2 3 1 0
  • 在pyyaml中表示具有相同基类的不同类的实例

    我有一些单元测试集 希望将每个测试运行的结果存储为 YAML 文件以供进一步分析 YAML 格式的转储数据在几个方面满足我的需求 但测试属于不同的套装 结果有不同的父类 这是我所拥有的示例 gt gt gt rz shorthand for
  • 当玩家触摸屏幕一侧时,如何让 pygame 发出警告?

    我使用 pygame 创建了一个游戏 当玩家触摸屏幕一侧时 我想让 pygame 给出类似 你不能触摸屏幕两侧 的错误 我尝试在互联网上搜索 但没有找到任何好的结果 我想过在屏幕外添加一个方块 当玩家触摸该方块时 它会发出警告 但这花了很长
  • Geopandas 设置几何图形:MultiPolygon“等于 len 键和值”的 ValueError

    我有 2 个带有几何列的地理数据框 我将一些几何图形从 1 个复制到另一个 这对于多边形效果很好 但对于任何 有效 多多边形都会返回 ValueError 请指教如何解决这个问题 我不知道是否 如何 为什么应该更改 MultiPolygon
  • 表达式中的 Python 'in' 关键字与 for 循环中的比较 [重复]

    这个问题在这里已经有答案了 我明白什么是in运算符在此代码中执行的操作 some list 1 2 3 4 5 print 2 in some list 我也明白i将采用此代码中列表的每个值 for i in 1 2 3 4 5 print
  • HTTPS 代理不适用于 Python 的 requests 模块

    我对 Python 还很陌生 我一直在使用他们的 requests 模块作为 PHP 的 cURL 库的替代品 我的代码如下 import requests import json import os import urllib impor
  • 循环中断打破tqdm

    下面的简单代码使用tqdm https github com tqdm tqdm在循环迭代时显示进度条 import tqdm for f in tqdm tqdm range 100000000 if f gt 100000000 4 b
  • Python - 按月对日期进行分组

    这是一个简单的问题 起初我认为很简单而忽略了它 一个小时过去了 我不太确定 所以 我有一个Python列表datetime对象 我想用图表来表示它们 x 值是年份和月份 y 值是此列表中本月发生的日期对象的数量 也许一个例子可以更好地证明这
  • Numpy 优化

    我有一个根据条件分配值的函数 我的数据集大小通常在 30 50k 范围内 我不确定这是否是使用 numpy 的正确方法 但是当数字超过 5k 时 它会变得非常慢 有没有更好的方法让它更快 import numpy as np N 5000
  • 检查所有值是否作为字典中的键存在

    我有一个值列表和一本字典 我想确保列表中的每个值都作为字典中的键存在 目前我正在使用两组来确定字典中是否存在任何值 unmapped set foo set bar keys 有没有更Pythonic的方法来测试这个 感觉有点像黑客 您的方
  • 在 Pandas DataFrame Python 中添加新列[重复]

    这个问题在这里已经有答案了 例如 我在 Pandas 中有数据框 Col1 Col2 A 1 B 2 C 3 现在 如果我想再添加一个名为 Col3 的列 并且该值基于 Col2 式中 如果Col2 gt 1 则Col3为0 否则为1 所以
  • 您可以在 Python 类型注释中指定方差吗?

    你能发现下面代码中的错误吗 米皮不能 from typing import Dict Any def add items d Dict str Any gt None d foo 5 d Dict str str add items d f
  • Spark.read 在 Databricks 中给出 KrbException

    我正在尝试从 databricks 笔记本连接到 SQL 数据库 以下是我的代码 jdbcDF spark read format com microsoft sqlserver jdbc spark option url jdbc sql
  • 改变字典的哈希函数

    按照此question https stackoverflow com questions 37100390 towards understanding dictionaries 我们知道两个不同的字典 dict 1 and dict 2例

随机推荐

  • 在 Visual Studio 2015 Community RTM 中为 ASP.NET 5 项目启用 SSL

    Most tutorials suggest that you can enable SSL for the website by going to properties of the project and then ticking th
  • ObjectAnimator 像素化 TextView

    我在 Samsung GT N5110 android 版本 4 1 2 中放大 TextViews 和 Checkboxes 时遇到问题 放大 TextView 后出现下图 里面有 textview 我想放大它我确实尝试在开发人员选项中启
  • Haskell Prelude.read:无法解析字符串

    来自哈斯克尔的例子http learnyouahaskell com types and typeclasses http learnyouahaskell com types and typeclasses ghci gt read 5
  • 如何获取Azure ResourceManagementClient对象的标签

    我正在尝试使用 ResourceManagementClient 类获取资源组的标签列表 Microsoft Azure Management Resources 2 14 1 预览版 添加自包管理器控制台 ResourceManageme
  • 如何在 MongoDB shell 中将 NumberLong 转换为 Date?

    我将 unix 时间戳存储为 MongoDB 的NumberLongtype 毫秒 如何在 Mongo shell 中转换为人类可读的日期字符串 供我自己将来参考 并结合其他答案 db mycollection aggregate matc
  • 如何横向显示 AutoCompleteTextView 建议

    AutoCompleteTextView 在纵向模式的下拉列表中显示建议 我想在对话框或横向模式的下拉列表中显示建议 这里 EditText 和键盘全屏显示 我应该在适配器中使用哪种布局才能在横向模式下将提示显示为对话框 我目前正在使用an
  • 如何从 Web 应用程序中找出 ASP.NET 中的会话大小?

    如何从 Web 应用程序中找出 ASP NET 中的会话大小 如果您尝试在运行时而不是在调试跟踪中获取会话的大小 您可能需要尝试如下操作 long totalSessionBytes 0 BinaryFormatter b new Bina
  • 在 matplotlib 中设置图例中标签部分的样式

    是否可以有part特定风格的传说文本 比方说 bold or italic 写在之间 强制 matplotlib 解释它 import matplotlib pyplot as plt plt plot range 10 range 10
  • 如何仅循环批处理脚本一定的次数?

    如何仅循环批处理脚本一定次数 x10 或其他 如果代码是 echo off loop1 Start taskmgr exe Goto loop loop2
  • HttpRuntime.Cache.Add 中的值为 Null

    我想为其中的一些键存储 nullHttpRuntime Cache因为我不想再次进入数据库发现没有该密钥的条目 所以第一次 它会进入数据库并填充缓存 目的是使用缓存数据来服务以下调用 而不是执行数据库调用 这是我正在使用的代码 Info i
  • 在javascript中访问ruby数组

    我想在 javascript 中访问 Ruby 数组 请告诉我这样做的方法 我的数组保存了 sql 查询的结果 contacts Contact order contacts position ASC 我正在尝试这样做 for var i
  • 导入 F2Py 模块时如何“捕获”段错误?

    一些背景 其相关性可能会波动 我目前拥有一些 F2Py 库 F2Py 从一些 Fortran 代码编译的 Python 模块 出于所有意图和目的 您可以将这些模块视为 第三方 我目前无法访问 Fortran 源代码 并且我不负责编译过程 这
  • 如何将 shell 变量导出到所有会话?

    我想知道有没有办法将我的 shell 变量导出到系统中的所有会话 不仅仅是当前会话 我不想在 bashrc 文件中设置它 因为 shell 变量是动态变量 它会不时更改 您可以通过在调试中设置陷阱来设置会话以继续重新读取磁盘上的文件 bas
  • 如何在 ASP.NET 项目中设置无限会话超时?

    我正在开发一个 ASP NET 项目 如何增加会话超时 无限超时 或者我应该在 IIS 上执行此操作 如果可以的话请解释一下 您可以设置session timeout in web config如下所示 该值显示分钟 因此您可以根据需要设置
  • CSS 中报告部分样式列表编号?

    现在我了解了 正常 CSS 列表样式 罗马 拉丁等 当然在过去的几年里 它们在不允许诸如以下内容方面有些不灵活 a or a only a 现在我相信你可以通过 before 和 after 伪元素得到像上面这样的效果 那是对的吗 如果可以
  • 如何填充seaborn分布图中曲线下的面积

    我有两个变量 x 1 883830 7 692308 8 791209 9 262166 y 5 337520 4 866562 2 825746 6 122449 我想使用 matplotlib 包装的 seaborn 来拟合高斯分布 似
  • 如何打破多个 foreach 循环? [复制]

    这个问题在这里已经有答案了 我有四个 foreach 循环 它们遍历集合并根据条件执行某些操作 这是我现在正在编写的代码 boolean breakFlag false String valueFromObj2 null String va
  • iOS 自动布局:两个并排的宽度相等的按钮

    我目前在自动布局方面遇到困难 我正在使用界面生成器 并尝试并排放置两个宽度相等的按钮 如下图所示 从下面的预览图像中 我的 titleImage 已被正确约束并正确显示 但按钮却不然 我尝试将按钮 1 与 titleImage 的前缘对齐
  • 在控制台应用程序中使用 Razor 的最佳方式是什么

    我知道以前也有人问过类似的问题 但唯一的答案是六年前的 而且人们提到的项目似乎没有得到维护 我想在控制台应用程序或类库中使用 Razor 来渲染 HTML 我还想在 cshtml 文件中使用智能感知 目前 我可以通过执行以下操作来临时操纵此
  • 如何将python/cython unicode字符串转换为长整数数组,以进行levenshtein编辑距离[重复]

    这个问题在这里已经有答案了 可能的重复 如何纠正 Damerau Levenshtein 实施中的错误 https stackoverflow com questions 3431933 how to correct bugs in thi