Validate ICD-10-CM

本文关键字:ICD-10-CM Validate | 更新日期: 2023-09-27 18:25:54

有人为ICD-10-CM编写过验证(regex或其他)吗?

我对琐碎的解决方案(3-7字母数字)不感兴趣,我想知道第7位需求的合并是如何处理的。

Validate ICD-10-CM

我没有为ICD-10-CM编写正则表达式,但我编写了查找引擎。您可以通过将官方XML文件解析到SQL数据库中,并在数据库中搜索代码来完成同样的操作(如果没有找到结果,则代码无效)。不幸的是,由于各种NDA,我无法在这里发布我的代码,但这样做应该很琐碎。好处是,您只能获得有效的代码(而不是像使用regex那样"看起来"像ICD-10-CM但无效的代码)。

或者(我不建议这样做),您可以在一个简单的正则表达式的基础上对XML文件本身进行全文搜索,但这会有问题(根据经验)。

我刚刚为所有2016年的ICD10代码编写了一个正则表达式:

/^[A-TV-Z]'d[0-9AB](?:'.(['dA-KXZ]|['dA-KXZ]['dAX-Z]|['dA-KXZ]['dAX-Z]['dX]|['dA-KXZ]['dAX-Z]['dX][0-59A-HJKMNP-S]))?$/

这个正则表达式假定点出现在第三个字符之后,而它应该是;疾病控制与预防中心分发省略了点的代码列表。

在我所做的关于ICD10代码结构的研究中,并不是所有的规则和陷阱都被记录下来。这个正则表达式是根据实际存在的代码构建的,因为在线找到的ICD10结构的文档并不能说明全部情况。

第一个字符是阿尔法,除了U。

第二个字符是数字。

第三个字符是数字、A或B(这些字母是最近添加的)。

点表示长度超过3个字符的代码(在代码规则的任何描述中都不称为字符)。

第四个字符是数字或字母EFGHIJKXZ。

第五个字符是数字或字母AXYZ。

第六个字符是数字或X.

当X作为第四个、第五个或第六个字符(但绝不是最后一个字符)出现时,它是一个占位符。

第七个字符比任何参考文献都要复杂。A、 D,s代表后遗症。某些其他代码集有自己的扩展;对于骨折,这些是ABCDEFGHJKMNPQRS,ADS仍然表达后遗症,但可能会提供更多信息。此位置存在使用数字01234的代码。

横向性一点也不简单。文档说明1==右,2==左,这通常是正确的。然而,3==双边、9==未指定(第5个字符)和0==未特定(第6个字符)并不总是正确的。

在许多代码中,偏侧性与其他事物(通常是哪一个肢体)一起表示。在这些代码中,左、右、未指定用1、2、3表示;4,5,6;7,8,9表示另一个因素。还可能存在使用0的双重非特定代码。

此外,表示偏侧性的字符并不总是前六个字符中的最后一个。

一些横向代码的描述暗示了一个额外的"另一面"。

ICD10实际上是一个代码树,其中可用的代码是叶子,每个节点都包含应用于自身和所有子节点的元数据。

正如在其他答案中所说,有些代码可能看起来像ICD10代码,但实际上是无效的。然而,它们确实包括的所有代码的平面列表

http://www.cdc.gov/nchs/icd/icd10cm.htm

此代码列表不包含约50个代码上的UTF-8编码字符,如

H81.01 Ménière's disease, right ear

具有非ascii字符,但确实包含所有69823可用代码的描述。因此,您可以立即判断出26*10*10*10*10*10*26的最大可能代码基数远大于69823,因此正则表达式是正确的。

为了获得所有第7个字符的信息,需要对XML进行解析并基于"规则"进行扩展。如果你正在寻找每个代码的元数据,平面代码文件中没有。你必须解析该元数据的XML(或者使用API等)

一个最好的例子是:

  <diag>
    <name>H40.11</name>
    <desc>Primary open-angle glaucoma</desc>
    <inclusionTerm>
      <note>Chronic simple glaucoma</note>
    </inclusionTerm>
    <sevenChrNote>
      <note>One of the following 7th characters is to be assigned to code H40.11 to designate the stage of glaucoma</note>
    </sevenChrNote>
    <sevenChrDef>
      <extension char="0">stage unspecified</extension>
      <extension char="1">mild stage</extension>
      <extension char="2">moderate stage</extension>
      <extension char="3">severe stage</extension>
      <extension char="4">indeterminate stage</extension>
    </sevenChrDef>
  </diag>

在XML解析中,要正确获得第7个字符,必须解析字符串One of the following 7th characters is to be assigned to code H40.11 to designate the stage of glaucoma,并将代码H40.11扩展到<sevenChrDef></>下的每个<extension>。因此,通过上面的例子,您将获得每个代码:

H40.11X0 Primary open-angle glaucoma, stage unspecified
H40.11X1 Primary open-angle glaucoma, mild stage
H40.11X2 Primary open-angle glaucoma, moderate stage
H40.11X3 Primary open-angle glaucoma, severe stage
H40.11X4 Primary open-angle glaucoma, indeterminate stage

X是一个"占位符",用于确保7个字符的代码长度。

情况越来越糟。。。

考虑以T64:开头的代码分支

<diag>
<name>T64</name>
<desc>Toxic effect of aflatoxin and other mycotoxin food contaminants</desc>
<sevenChrNote>
  <note>The appropriate 7th character is to be added to each code from category T64</note>
</sevenChrNote>
<sevenChrDef>
  <extension char="A">initial encounter</extension>
  <extension char="D">subsequent encounter</extension>
  <extension char="S">sequela</extension>
</sevenChrDef>
<diag>
  <name>T64.0</name>
  <desc>Toxic effect of aflatoxin</desc>
  <diag>
    <name>T64.01</name>
    <desc>Toxic effect of aflatoxin, accidental (unintentional)</desc>
  </diag>
  <diag>
    <name>T64.02</name>
    <desc>Toxic effect of aflatoxin, intentional self-harm</desc>
  </diag>
  <diag>
    <name>T64.03</name>
    <desc>Toxic effect of aflatoxin, assault</desc>
  </diag>...

T64不是叶节点,因此不可计费。然而,它仍然有第7个字符的元数据。这意味着您必须将每个子代码与其<sevenCharDef>ADS应用或"相乘",从而获得代码:

T6401XA Toxic effect of aflatoxin, accidental (unintentional), initial encounter
T6401XD Toxic effect of aflatoxin, accidental (unintentional), subsequent encounter
T6401XS Toxic effect of aflatoxin, accidental (unintentional), sequela
T6402XA Toxic effect of aflatoxin, intentional self-harm, initial encounter
T6402XD Toxic effect of aflatoxin, intentional self-harm, subsequent encounter
T6402XS Toxic effect of aflatoxin, intentional self-harm, sequela
T6403XA Toxic effect of aflatoxin, assault, initial encounter
T6403XD Toxic effect of aflatoxin, assault, subsequent encounter
T6403XS Toxic effect of aflatoxin, assault, sequela

我们有望获得以JSON格式重新打印/补充ICD10代码的许可,其中每个代码都有明确的元数据,但在此之前,这是您的最佳选择。

如果您只需要确定ICD10代码的有效性,只需加载平面文件的第一列(用'r分隔)。

问题是ICD10代码可以是三到七个字符。您可以根据行首和行尾的要求添加^和$。

这个适用于7个字符的

[A-TV-Z]'d[0-9AB]'.['dA-KXZ]['dAX-Z]['dX][0-59A-HJKMNP-S]

这个适用于6个字符的

[A-TV-Z]'d[0-9AB]'.['dA-KXZ]['dAX-Z]['dX]

等等。完成的正则表达式查找7,然后是6等三个字符,此处提供:https://regex101.com/r/VYPHXZ/3在一个工作测试站点上,并在下面的文本中。

问题是regex从来没有被设计用来处理相当于扩展操作代码的内容。但这是可以做到的。从7到3,正则表达式是一个OR分组链。万一您不熟悉捕获组,()中的任何内容默认情况下都将是捕获组。通过使用?:,我已选择覆盖此行为。在查找"扩展代码"时,总是先查找最长的代码,然后按长度降序查找。

^(?:(?:[A-TV-Z]'d[0-9AB]'.['dA-KXZ]['dAX-Z]['dX][0-59A-HJKMNP-S])|(?:[A-TV-Z]'d[0-9AB]'.['dA-KXZ]['dAX-Z]['dX])|(?:[A-TV-Z]'d[0-9AB]'.['dA-KXZ]['dAX-Z])|(?:[A-TV-Z]'d[0-9AB]'.['dA-KXZ])|(?:[A-TV-Z]'d[0-9AB]'.)|(?:[A-TV-Z]'d[0-9AB]))$

新冠肺炎诊断代码的更新:字母"U〃;有效期至2020年。

已经实现了ICD9几次,并且看过ICD10,据我所知,ICD(9或10)从来都不是一个可以用正则表达式完全检查的东西。当然,从理论上讲,如果你知道所有的语言"关键字",你就可以为它实现DFA,但这并不实用。

我写了一个快速查找函数(2006年是针对移动设备的,所以当时SQL引擎有点慢)。只要在启动时将ICD数据库读取到哈希表中,并将其保存在那里,哈希查找的速度大约与DFA一样快。

FWIW我仍然有EMR引擎的来源(并拥有许可证),但它是C++。仅仅描述这种方法(如上所述)就很容易了。