向量化DPLA

文化遗产元数据全都与结构有关。 MARC,MODS,EAD等…具有专业词汇的高度结构化的数据格式。 但是结构经常崩溃,尤其是在聚集点。 当多个机构将数据提供给单个系统时,很难将机构实践统一为使用相同结构的内容,更不用说一致的词汇了。

像Word2Vec这样的新型机器学习技术不仅可以用于资源的内容,还可以用于元数据记录吗? 如果您使用了数百万个元数据记录来训练模型,是否可以将不同的记录整理成有用的东西? 我想尝试使用DPLA的1800万条记录。 坏消息是这不是魔术,但好消息是发生了一些有趣的事情。

我使用的过程Doc2Vec基本上是Word2Vec,但在文档级别(请在此处了解更多)。 简单地说,它将每个文档转换为向量,然后可以将其与模型中的其他文档进行比较。 根据文档的嵌入词,文档越相似,它们的向量就越紧密。 然后,您可以测量向量之间的距离,并希望找到相关文档。 我将在下面详细介绍该过程,但首先是结果。

将1800万条DPLA记录矢量化并绘制在一起。 访问:https://s3.amazonaws.com/thisismattmiller/dpla-vector-provider2/index.html

我根据它们的向量绘制了所有1800万条记录,这基本上是X / Y散点图。 从理论上讲,更多类似的记录应该在一起。 您可以在可视化文件中单击以查看不同记录的来源。 我根据记录的来源给每个记录上色,哪个机构为DPLA贡献了它。 跳出的鲜明特征是蓝色区域(即NARA记录),粉红色中心(即NYPL)和绿色分支(即南加州大学图书馆)。 整个事情看起来像一只模糊的蜂鸟,我猜这很好。

这些机构的分组很有趣,因为在培训数据中我没有包括来源/机构名称。 这意味着这些记录归为一组,因为元数据的内容相似或样式相似。 例如,蜂鸟的绿色喙,如果您查看这些记录的元数据,它们都是非常小的记录,每个记录的标题都像“ PAGE 243”。 相反,Hathi trust(在模型中拥有最多记录)具有深蓝色,但没有聚在一起,其中的记录相差很大,因此或多或少地均匀分布在整个图形中。 这是有道理的,因为它也是一个聚合器,可能没有元数据的主要“样式”。

在较小的宏观规模上,该模型的运行效果不理想。 测试模型的一种常见方法是将训练集反馈回模型中,并查看其性能。 给定培训文档,您希望它返回与模型中最相似的文档完全相同的文档。 但是对于这种模型,仅发生了60%的记录。 这指出了一些重大问题,我们将在以后讨论。 但是,如果您仍然想使用模型,可以将此书签添加到浏览器中:

https://s3.amazonaws.com/thisismattmiller/dpla-vector-provider2/bookmark.html

在DPLA项页面上时,单击它,它会显示模型中最近的邻居:

使用书签的演示

虽然存在问题,但有时会因匹配而使您感到惊讶。 这种方法似乎可以通过更多的工作来产生更好的结果。

这篇文章的其余部分将着眼于本实验的技术过程。


第一步是训练需要文档的模型。 我首先尝试使用DPLA记录中的原始源元数据。 这是来自数据提供者的尚未映射的原始数据。 我以为我可以通过使用未精炼的数据来获取更多的元数据。 这意味着模型中的每个文档中都有随机数据,无论提供者包括了什么。 经过一些初步的测试,我切换到仅对每个文档使用映射的元数据,这样就产生了18M个文档。 我使用Node脚本来完成此提取,您可以在脚本的开头看到每个文档中包含哪些字段。 解放这一点的是,没有字段,所有字段都是自由文本,根本没有结构化。

下一步是训练模型。 我使用python库Gensim来做到这一点。 使用此脚本。 需要指出的是,迭代次数20是我从默认值5开始增加的,希望获得更好的结果。 我还需要在一台更大的机器上执行此操作,我使用了一个具有255GB内存和32个虚拟核心的AWS Memory Optimized类框,这花了大约12-14个小时来训练8.8GB的文档。

下一步是将文档放回原处,并为每个文档找到最近的邻居。 不幸的是,Gensim方法在这种规模下并不是很快。 将1000个文档与该模型进行比较大约需要5分钟,这对于1800万文档来说是行不通的。 因此,我改为使用此脚本导出每个文档的所有矢量(每个100个)。

现在我有了原始向量,可以使用其他工具比较它们。 我使用此脚本将向量加载到Annoy中,并使用50棵树构建了索引。 这产生了一个索引文件,然后我可以运行每个文档,这将使我最近的邻居相对较快。 您必须做些杂耍,因为Annoy仅允许您使用整数作为索引ID,因此您需要跟踪什么int映射到什么DPLA UUID。

如果您想制作类似DPLA书签查找工具的工具,那就太好了。 但是,如果要绘制结果图,则需要简化模型。 现在,每个文档都由100维向量表示。 如果要绘制,则需要将其缩小为二维。 我使用scikit-learn库对PCA进行了此操作。 这是执行此操作的脚本。

最后一步是获取这些X / Y点并将其绘制出来,您可以做一个样本,但是我想绘制所有18M的图形,因此我将它们绘制在一个大的PNG文件上,并切成图块。 我用这个脚本画了它。

然后,您可以使用VIPS对其进行切割:

  vips dzsave /data/providers.png dpla_vectors_providers 

整个过程是相当昂贵的,可能有一些方法可以减少某些步骤所需的RAM,但是您仍在寻找一台具有60–120GB RAM的机器来执行大多数这些操作,而更多的机器用于模型训练。 幸运的是,我一直对Amazon Spot Instance感到好运,因此几天使用这些机器并不太昂贵。

通常,文档可能太小,几行元数据可能不够用,从而导致不良结果/培训。 但是我认为它可以改进,我应该选择一个较小的数据集来开始使用Word / Doc2Vec,但是一旦我了解更多信息以了解是否能够建立一个更好的模型,我想回到此数据集。