使用n-gram从书面文本中定位和提取数值数据

时间:2017-01-17 19:57:40

标签: python regex parsing n-gram

问题:

我正在尝试解析人工生成的文本以提取定量数据并使用Python将其输出到表中。

我从半结构化电子邮件中提取了大约14,000个患者记录。我能够解析(匿名)患者身份,日期和治疗计划。治疗计划字符串的长度通常不超过30个字,并由某人手动编写。它包含我试图提取和制表的信息,以及一些我可以忽略的无关的注释。运行一袋单词模型为unigrams导致词汇量约2000字,所以它不是特别多样化。一个6克的单词会导致词汇文件大小为2.2MB,因此内存不应该成为一个问题。

对于unigrams,我能够识别哪些记录包含感兴趣的药物。如果有20种感兴趣的药物,我有一个包含列的Pandas数据框:

patient_id || date || raw_plan_text || drug_1 || drug_2 || ... || drug_20

drug_N 列是简单的布尔值,表示计数向量器返回大于0的计数。

目标:

接下来我要做的是解析药物的剂量和摄入频率。治疗计划字符串可能包含以下子字符串:

<dosage> <drug_name> <intake_frequency>

但这些术语的相对顺序在整个语料库中是可变的,剂量 intake_frequency 本身可能是bigrams或trigrams。

最后我想要的是以下形式的数据框:

patient_id || date || raw_plan_text || drug1 || drug1_dose || drug1_freq || ...

当前方法:

我拥有一些关于每种感兴趣药物的典型剂量的领域知识和摄入频率的常见表示(例如“qid”代表每天四次“prn”代表根据需要)。正如我所提到的,频率可以是简单的单字组(“prn”)或bigram(“4-6hrs prn”)。剂量也一样。

我计划使用药物unigram和剂量+频率ngrams来配置相关记录并引导正则表达式在药物名称之前/之后搜索适当的子串提取,考虑术语的变量排序。当患者的原始治疗计划文本中含有多种药物时,情况会变得有点毛茸茸。我担心将错误的剂量/频率与错误的药物联系起来。我认为我可以使用标点符号作为分隔符,但由于我无法在视觉上检查所有记录,因此无法保证在语料库的自由形式下这是足够的。

我对那些知识渊博的人提出的问题:是否有更好的方法可以使用更高阶的ngrams来解决我的问题?我一直在寻找类似的问题,但很多内容都存在与文本分类和情绪分析有关。谢谢!

0 个答案:

没有答案