本质上,我使用 python 库来查询单词的同义词,然后将该单词及其同义词添加到 postgreSQL 表中。如果一些表列是空的,那很好,但是我不知道如何将同义词插入数据库,因为我不知道会有多少。
例如,我有一个包含 6 列的表,1 列用于原始单词,5 列用于其同义词。对于一个词,我可能会得到 3 个同义词,但对于其他词,我可能会得到全部 5 个。
我设法编写此任务的唯一方法是一组可怕的 if 语句:
for word in textlist:
syns = dictionary.synonym(word)
num = len(syns)
if len(syns) == 5:
for i in syns:
syn1 = i[0]
syn2 = i[1]
syn3 = i[2]
syn4 = i[3]
syn5 = i[4]
等等...然后使用这些变量将同义词插入数据库表中。
我想到的一种方法是构建另一个单词和同义词列表,然后循环遍历该列表以将其添加到表格中。但我不知道该怎么做。关于如何进一步推进的任何帮助将是一个很大的帮助。谢谢。
注意:syns 返回一个列表对象。
编辑:
感谢@systemjack,我已经将系统更改为有 3 个表列。 id(这是一个串行主键)、word 和 synos(最初是 syn,但更改只是为了确保它不是一些奇怪的关键字)。应将每个单词连同一个同义词添加到一行中,然后下一行可以是具有不同同义词的同一个单词,依此类推...总之,新方法如下:
for word in textlist:
syns = dictionary.synonym(word)
if syns is not None:
for syn in syns:
cursor.execute('INSERT INTO wordsyn (word, "synos") VALUES (%s, %s);', (word, syn))
但是我现在得到了错误
psycopg2.ProgrammingError:关系“wordsyn”的列“synos”不存在 LINE 1: INSERT INTO wordsyn (word, "synos") VALUES ('&c
我在 synos 周围加了双引号试图让它工作,但没有它们它也不能工作。任何进一步的帮助将不胜感激。
\d+ wordsyn 输出:
最终编辑:发现问题。没有正确的数据库中的表。我以为\dt 只显示当前数据库中的表,但显然不是。
最佳答案
典型的关系方法会将其设置为一个包含单词列和第二个同义词列的双列表。然后每个单词-同义词组合都有一行。
在这种情况下,使用数据的查询要简单得多。您真的不想处理可变数量的填充列。另外,如果一个词有 6 个同义词会怎样?
最简单的实现需要每个单词多次插入,但这不是什么大问题。还有ways to batch up the inserts
如果你真的想每个单词一行,你可以使用 SPLIT_PART 的组合和 STRING_AGG在一列中存储可变数量的值。不过,我强烈建议使用前一种方法。
还可以管理更复杂的动态structures as JSON .
请记住,后两种方法都会慢得多。
使用第一种方法,您的插入将类似于:
for word in textlist:
syns = dictionary.synonym(word)
for syn in syns:
cursor.execute('insert into syns (word, syn) values (%s, %s);', (word, syn))
然后如果你想查看一个词的所有同义词,你可以这样做:
select word, string_agg(syn, ', ')
from syns where word='perspicuitous'
group by word;
关于python - 在不知道变量数量的情况下插入 PostgreSQL 数据库,在 python 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42569168/