基本上我使用python库来查询单词的同义词,然后将该单词及其同义词添加到postgreSQL表中。如果某些表列是空的,这很好,但我不知道如何将同义词插入数据库,因为我不知道会有多少。
E.g我有一个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(这是一个串行主键),单词和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: column "synos" of relation "wordsyn" does not exist LINE 1: INSERT INTO wordsyn (word, "synos") VALUES ('&c
我已经在synos周围放了双引号以试图让它工作,但是如果没有它们它也无法工作。任何进一步的帮助将不胜感激。
\ d + wordsyn输出:
最终编辑:发现问题。没有正确的数据库中的表。我以为\ dt只显示当前数据库中的表,但显然不是。
答案 0 :(得分:3)
典型的关系方法会将其设置为带有字列和第二个同义词列的两列表。然后,每个单词 - 同义词组合都有一行。
在这种情况下,使用数据的查询要简单得多。你真的不想处理可变数量的填充列。另外,如果一个单词有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;
答案 1 :(得分:0)
一个approch将创建2个表一个用于单词,另一个用于同义词,如下面的
Word:
id - primary key - could be autogenerated.
word - sring - To store the word
Synoym:
id -- primary key - could be autogenerated.
word_id -- Foreign key to Word table id
synonym -- String - The synonym
对于每个单词,如果单词存在则在Word表中查找,如果不存在,则只需获取现有条目的id。 使用dictionary.synonym(word)获取单词的同义词。对于每个同义词查找同义词表,其中包含来自上方的单词id和同义词,如果不存在,则插入其他移动到下一个同义词。
对所有单词重复此操作。
选择单词的同义词将成为如下查询:
select syn.synonym from synonym syn , word wd
where wd.id = syn.word_id and wd.word = 'foo'