- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个单字母组(单个单词)、双字母组(两个单词)和三字母组(三个单词)的列表,我从一堆文档中提取出来。我的目标是静态分析报告,以及搜索我可以在这些文档上使用。
John Doe
Xeon 5668x
corporate tax rates
beach
tax plan
Porta San Giovanni
ngram 由日期和文档标记。因此,例如,我可以找到双字母组之间的关系以及它们的短语首次出现的时间以及文档之间的关系。我还可以搜索包含这些 X 个 un/bi/trigram 短语的文档。
所以我的问题是如何存储它们以优化这些搜索。
最简单的方法就是为每个短语创建一个简单的字符串列,然后每次在文档中找到该单词/短语时,我都会将关系添加到 document_ngram 表。
table document
{
id
text
date
}
table ngram
{
id
ngram varchar(200);
}
table document_ngram
{
id
ngram_id
document_id
date
}
但是,这意味着如果我想在三元组中搜索单个单词,我必须使用字符串搜索。例如,假设我想要所有包含单词“summer”的八卦。
因此,如果我改为将单词分开,以便 ngram 中存储的唯一内容是单个单词,然后添加三列,以便所有 1、2 和 3 单词链都可以放入 document_ngram
?
table document_ngram
{
id
word1_id NOT NULL
word2_id DEFAULT NULL
word3_id DEFAULT NULL
document_id
date
}
这是正确的做法吗?他们的方法更好吗?我目前正在使用 PostgreSQL 和 MySQL,但我认为这是一个通用的 SQL 问题。
最佳答案
这就是我为您的数据建模的方式(请注意“the”被引用了两次)您还可以为单个词添加权重。
DROP SCHEMA ngram CASCADE;
CREATE SCHEMA ngram;
SET search_path='ngram';
CREATE table word
( word_id INTEGER PRIMARY KEY
, the_word varchar
, constraint word_the_word UNIQUE (the_word)
);
CREATE table ngram
( ngram_id INTEGER PRIMARY KEY
, n INTEGER NOT NULL -- arity
, weight REAL -- payload
);
CREATE TABLE ngram_word
( ngram_id INTEGER NOT NULL REFERENCES ngram(ngram_id)
, seq INTEGER NOT NULL
, word_id INTEGER NOT NULL REFERENCES word(word_id)
, PRIMARY KEY (ngram_id,seq)
);
INSERT INTO word(word_id,the_word) VALUES
(1, 'the') ,(2, 'man') ,(3, 'who') ,(4, 'sold') ,(5, 'world' );
INSERT INTO ngram(ngram_id, n, weight) VALUES
(101, 6, 1.0);
INSERT INTO ngram_word(ngram_id,seq,word_id) VALUES
( 101, 1, 1)
, ( 101, 2, 2)
, ( 101, 3, 3)
, ( 101, 4, 4)
, ( 101, 5, 1)
, ( 101, 6, 5)
;
SELECT w.*
FROM ngram_word nw
JOIN word w ON w.word_id = nw.word_id
WHERE ngram_id = 101
ORDER BY seq;
结果:
word_id | the_word
---------+----------
1 | the
2 | man
3 | who
4 | sold
1 | the
5 | world
(6 rows)
现在,假设您要向现有(6 克)数据添加 4 克:
INSERT INTO word(word_id,the_word) VALUES
(6, 'is') ,(7, 'lost') ;
INSERT INTO ngram(ngram_id, n, weight) VALUES
(102, 4, 0.1);
INSERT INTO ngram_word(ngram_id,seq,word_id) VALUES
( 102, 1, 1)
, ( 102, 2, 2)
, ( 102, 3, 6)
, ( 102, 4, 7)
;
SELECT w.*
FROM ngram_word nw
JOIN word w ON w.word_id = nw.word_id
WHERE ngram_id = 102
ORDER BY seq;
附加结果:
INSERT 0 2
INSERT 0 1
INSERT 0 4
word_id | the_word
---------+----------
1 | the
2 | man
6 | is
7 | lost
(4 rows)
顺便说一句:向该模型添加文档类型对象会向该模型添加两个额外的表:一个用于文档,一个用于 document*ngram。 (或另一种方法:for document*word)递归模型也是可能的。
更新:上述模型将需要一个额外的约束,这将需要触发器(或一个规则+一个额外的表)来实现。伪代码:
ngram_word.seq >0 AND ngram_word.seq <= (select ngram.n FROM ngram ng WHERE ng.ngram_id = ngram_word.ngram_id)
关于mysql - 在 RDBMS 中存储 uni/bi/trigrams ngrams 的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10963316/
RDBMS 中有哪些不同类型的键?请在答案中包含示例。 最佳答案 来自 here和 here :(在我用谷歌搜索你的标题后) Alternate key - An alternate key is a
请解释什么是 RDBMS 中的集群? 最佳答案 在 SQL 中,簇也可以指行的特定物理顺序。 例如,考虑一个包含两个表的数据库:INVOICES 和 INVOICE_ITEMS。如果同时插入许多 IN
请解释什么是 RDBMS 中的集群? 最佳答案 在 SQL 中,簇也可以指行的特定物理顺序。 例如,考虑一个包含两个表的数据库:INVOICES 和 INVOICE_ITEMS。如果同时插入许多 IN
这个问题在这里已经有了答案: What is the difference between DBMS and RDBMS? (9 个回答) 关闭 10 个月前。 这就是他们的区别吗,这就是我的理解。
如果我正确理解了 CAP 定理,可用性意味着即使节点出现故障,集群也会继续运行。 我见过很多人(http://blog.nahurst.com/tag/guide)将RDBMS列为CA,但我不明白RB
关闭。这个问题需要更多 focused .它目前不接受答案。 想改进这个问题?更新问题,使其仅关注一个问题 editing this post . 6年前关闭。 Improve this questi
在我作为首席开发人员的项目中,我们之前有一个存储单个 XML 文件的网络配置。配置包含有关网络布局的信息 - 其组成主机、每个主机的各种详细信息(如操作系统、平台、每个主机中配置的用户、每个用户的多个
我想编写一些可以在几乎所有数据库中运行而没有任何 SQLExceptions 的查询。那么,我在哪里可以获得编写查询的 ANSI 标准? 最佳答案 不确定这对您有帮助。 供应商在标准实现方面千差万别,
作为一名程序员,我在各种系统上工作过,一些使用 Oracle,一些使用 MySQL。我一直听到人们说 Oracle 更稳定、更健壮、更安全。是这样吗? 如果是,以什么方式和为什么? 为了这个问题的目的
重要提示:我收到了很多答案,感谢大家。但是所有的答案都是评论多于答案。我的问题与每个 RDBMS 的往返次数有关。一位有经验的人告诉我,MySQL 的往返次数比 Firebird 少。我希望答案保持在
我正在开发一个开源产品,需要一个嵌入式 dbms。 你能推荐一个嵌入式开源数据库吗... 每个可以处理超过 10 GB 的对象 拥有对嵌入友好的许可证(LGPL,而非 GPL)。 是纯Java 是(最
为什么使用同义词?,syNONYMS IN SQL 的优点? 最佳答案 它们只是数据库中对象的简写名称。例如,您可以创建一个名为 Products 的同义词。如果您在名为 ProductionCont
我经常创建的查询具有7-8个联接来检索数据。在实际的数据库应用程序中,是否有许多这样的联接正常?或者我的数据库设计不佳?我很好奇,因为如果在每个请求数据库上必须做很多工作,那么如果成千上万的客户端连接
Aheo问是不是ok to have a table with just one column .如果没有列,或者考虑到在大多数现代“关系”DBMS 中这似乎很难做到,那么没有属性的关系如何? 最佳答
模式的定义是数据库中数据的逻辑结构。它归用户所有,并且与数据库用户同名。模式包含表的名称,列类型是什么等等。数据字典也仅包含元数据(当然,它是在数据库级别而不是用户级别)。模式和数据字典之间的确切区别
在以下方面设置游泳池的最佳方法是什么: - 你什么时候创建连接? 你什么时候关闭连接,你会关闭所有连接吗? 你测试连接还是不错的。何时以及如何? 您如何确定最大连接数的好数字? 你有什么样的监控来确保
我目前正在尝试选择数据库供应商。 我只是想从其他数据库开发人员那里征求一些个人意见。 我的问题特别针对以下人群: 1) 之前使用过支持复制到磁盘(混合)的主内存数据库(MMDB)(即 ExtremeD
空值表示 没有值(value) 不适用、未分配、未知或不可用 哪个是真的? 最佳答案 这完全取决于使用它的上下文。 null 表示没有值,但其原因取决于使用它的域。在许多情况下,您列出的项目都是 nu
假设我有这个 RDBM 表(Entity-attribute-value_model): col1: entityID col2: attributeName col3: value 由于扩展问题,我
我想知道是否在其中一个属性上创建了具有聚集索引的表或特别是堆文件是根据该属性排序的。排序的堆文件和具有聚集索引的堆文件之间有区别吗? 最佳答案 Is there a difference betwee
我是一名优秀的程序员,十分优秀!