Ruby on rails 在文本中存储单词

Ruby on rails 在文本中存储单词,ruby-on-rails,postgresql,nlp,Ruby On Rails,Postgresql,Nlp,我正在用Rails和Postgresql构建一个学习语言的应用程序 文本被上传。文本的长度会有所不同,但我们假设它们的长度为100-3000个单词 上传时,每个文本位置都会转换为一个“标记”,表示该位置的单词信息(基本单词、名词/动词/形容词等、语法标记、定义id) 在文本中单击一个单词时,我需要查找(并显示)数据库中具有与单击单词相同属性(基本单词、词性、标记)的所有其他文本 要做到这一点,最简单也是最相关的方法是在表Text和Word之间建立一个联接表TextWord。每个text\u-wo

我正在用Rails和Postgresql构建一个学习语言的应用程序

文本被上传。文本的长度会有所不同,但我们假设它们的长度为100-3000个单词

上传时,每个文本位置都会转换为一个“标记”,表示该位置的单词信息(基本单词、名词/动词/形容词等、语法标记、定义id)

在文本中单击一个单词时,我需要查找(并显示)数据库中具有与单击单词相同属性(基本单词、词性、标记)的所有其他文本

要做到这一点,最简单也是最相关的方法是在表
Text
Word
之间建立一个联接表
TextWord
。每个
text\u-word
将代表文本中的一个位置,并包含
text\u-id
word\u-id
语法标签
开始索引
结束索引

但是,如果一个文本包含100-3000个单词,这意味着每个文本对象包含100-3000个条目

那疯了吗?贵吗?这会导致什么问题

有更好的办法吗

我不能使用Postgres全文搜索,因为,例如,如果我在“我离开了纳什维尔”中单击“左”,我不希望“在灯光前向左转”。我只想要“left”作为动词,以及其他形式的“leave”作为动词。此外,我可能只想要带有特定定义的“左”(例如,“左”用作“政党”,而不是“右的对立面”)

我能想到的另一个选项是在文本对象上存储JSON,标记是一个大的散列或散列数组(任意一种)。Postgresql有没有办法通过这种嵌套数据结构进行搜索

第三个选项是使用与选项2相同的JSON(在文本中存储所有位置),在每个单词对象/定义对象/语法对象上使用第二个JSON(在该对象出现的所有文本中存储所有位置)。然而,这似乎比连接表占用更多的存储空间,我不确定它是否会带来任何实际的好处

任何建议都将不胜感激

谢谢,
Michael。

一个简单的解决方案是拥有一个包含多个索引的数据库:一个用于基本单词,一个用于词性,另一个用于您感兴趣的所有其他功能

当你点击左键时,你会发现它是“离开”的一种形式,是“过去时”中的“动词”。现在您转到索引,并获得“离开”、“动词”和“过去时”的所有标记位置。取所有索引位置的交点,剩下的是要查找的表单的标记位置


如果你想节省空间,请看一看,这是一本关于这个主题的好书。过去,我曾用它为数百万个单词的文本语料库建立索引(这是20年前的事了……)

为什么要重新发明轮子?使用PostgreSQL全文搜索。因为如果我在“我离开了纳什维尔”中单击“左”,我不希望出现“在灯光前向左转”(左=>名词)。它们需要在基本单词/词性级别进行链接。我只想要动词“leave”(“left”),还要“leaves”,“leave”)。此外,我可能最终只希望那些标记了特定定义id的位置。换句话说(没有双关语),我需要通过附加到每个位置的特定属性进行搜索,而不仅仅是直接的文本匹配。我希望事情能这么简单。但是然而:postgres全文搜索会让我像搜索文本一样搜索散列吗。。。?要在散列中查找特定属性,可以从文本中计算一个
tsvector
(这可能是您设想的散列的PostgreSQL等价物),然后使用
@
操作符搜索
tsquery
。但是,如果需要基于文本的语法分析进行匹配(即,消除不同的
),则无法使用PostgreSQl全文搜索进行匹配。PostgreSQL全文搜索最酷的一点(或者更好,最酷的一点)是,它可以非常快地使用GIN索引。非常感谢。当你说“管理多个索引”时,这本质上是文本和单词特征之间的连接表吗?据我所知,Postgresql中的外键是索引和整数。除非我有误解,这是我在帖子中引用的TextWord表,对吗?有什么不同吗?可能吧。我没有使用Postgres,但编写了自己的索引文件(遵循MG手册)