首页 > 解决方案 > word2vec 或基于位置查找同义词的替代方法

问题描述

我在一家医院工作。我现在正在处理的任务之一是从受控词汇表 (RxNorm) 中查找代码,这些代码对应于我们电子健康记录中药物的字符串表示。

例如,“500 毫克泰诺片剂”将映射到RxNorm 209459,“对乙酰氨基酚 500 毫克口服片剂 [泰诺]”,得分为 0.8,使用RxNav API

现在有很多方法可以做到这一点。我想通过查找在我们的中介字符串中常见但在 RxNorm 中的任何药物标签中不常见的缩写和其他标记来优化我们的成功。

例如,“500 mg tylenol po tab”也映射到 RxNorm 209459,但只有 0.67 分,因为 RxNorm 似乎不知道“po”是“口服”或“口服”的常见医学术语, tab 是“tablet”的词法变体。它似乎工作得很好,但只有完美的单词匹配。

word2vec 或其他东西可以检测“po tab”和“oral tablet”之间的相似性,因为 EHR 经常包含类似的字符串

“废话少说”

而 RxNorm 有

“等等等等口服片剂”

有同样的“喋喋不休”?

我尝试按照 word2vec 演示脚本进行操作,但几乎所有噪音。显然,我的字符串本身就是短句,而不是叙述的片段。训练集也很小......到目前为止,我一直在训练一个特征良好的语料库,该语料库包含 11 026 087 个(非唯一)单词,分布在 2 148 750 行中。

我一直在使用在 MacOS clang 下编译的 word2vec 的 2013 分支,没有任何摆弄。

标签: nlpword2vec

解决方案


尽管这些小短语与 word2vec 及相关算法通常使用的各种自然语言文本不太一样,但如果有足够的数据,它可能会有所帮助。即使不是确切的同义词,它也会倾向于了解哪些词是“高度相关的”。

最好的数据将包含每个令牌在不同上下文中使用的许多示例,包括不同术语的混合。例如,如果您的训练数据包括...

blah blah oral tablet
blah blah po tab

...它会更难发现 'oral' 和 'po' 以及 'tablet' 和 'tab' 之间的相似之处,而不是如果你也有训练示例,其中包括:

blah blah oral tab
blah blah po tablet

(也就是说:在其术语混合中更加混乱/渐进的数据可能比将替代约定完全分开的数据更好。)

当您说您收到“所有噪音”时,最相似的单词列表对您的目的是否合理?(例如,'oral' 和 'po' 在训练后是否非常接近?)如果是这样,至少有一点,你可能走在正确的道路上,并且能够进一步调整以获得更好的结果。如果没有,您的数据或训练参数可能不足或存在其他问题。

在训练中,对于较小或变化较少的数据,减少向量维数或增加训练时期的数量以挤出有意义的最终向量位置可能会有所帮助。如果您的数据有一些自然的排序顺序,将所有相关项目组合在一起——这样某些词只会出现在所有早期或所有晚期——示例的初始洗牌可能会有所帮助。

window参数在影响结果模型是否强调精确的“句法”(替换词)相似性或一般领域/主题相似性方面可能特别有影响。较小的窗口 - 只说 1-3 个单词 - 强调插入替换词(同义词和反义词),而较大的窗口找到更一般的关联。

(请参阅此答案以获取更多背景信息和指向观察此窗口大小效应的论文的链接。)

如果您的管道的任何部分在 Python 中,或者您想尝试一些不在初始 Google 中的选项word2vec.c(例如使用非默认ns_exponent值),您可能想尝试稍后的 word2vec 实现,例如在 Python gensim 库中,一篇论文建议在相关项目篮标记频率与自然语言有些不同的推荐应用程序中特别有用)。

如果您的许多“未知”单词实际上是已知单词的缩写或拼写错误,则使用 Facebook 的“FastText”改进 word2vec 可能会有所帮助。它还学习子词的向量,因此将“tab”和“tablet”拉得更近,当遇到一个从未见过的词时,可以从词片段中组装一个候选向量,这通常比随机猜测要好,同样就像人们从词根直觉一个词的一般要旨一样。(Python gensim 还包含一个 FastText 实现。)

如果您确实实现了一个单词模型,其最相似的单词列表对您来说似乎是明智的,那么您可以尝试:

  • 当您的文本中包含您知道不在“RxNorm”中的单词时,请尝试将未知单词替换为“RxNorm”中的最近邻居

  • 使用“Word Mover's Distance”将您的短语与已知短语进行比较——它通常擅长量化短语之间的转换,使用词向量作为输入。它在较大的文本上很昂贵,但在 4-6 个单词的片段上,可能效果很好。(它在 gensim word-vectors 类中作为一种.wmdistance()方法可用。)

最后,在 'tab'->'tablet' 类型的精确替换数量有限的情况下,用专家确认的同义词逐步替换 word2vec 分析中的任何模糊发现似乎是个好主意,用确定的东西替换统计猜测。

回到上面的例子,如果你已经知道 'tab'->'tablet',但还不知道 'po'->'oral',那么获取所有具有 'tab' 或 'tablet' 的文本甚至可能是有意义的& 创建新的附加合成示例,并将该单词颠倒。这可以为后续的 word2vec 训练提供额外的提示/推动,以便能够意识到“po”/“oral”与“tab”/“tablet”都填充相同的相对角色。


推荐阅读