gpt4 book ai didi

mysql - 在 RDBMS 中存储 uni/bi/trigrams ngrams 的正确方法?

转载 作者:行者123 更新时间:2023-11-29 01:09:04 24 4
gpt4 key购买 nike

我有一个单字母组(单个单词)、双字母组(两个单词)和三字母组(三个单词)的列表,我从一堆文档中提取出来。我的目标是静态分析报告,以及搜索我可以在这些文档上使用。

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com