Wordnet sqlite 同义词和示例
Wordnet sqlite Synonyms and Samples
我正在尝试获取给定 wordid 的同义词和示例列表。经过大量的试验和错误后,我可以获得所有同义词集的样本,但不是实际的同义词。这是我的查询,它给出了以下结果。
select senses.wordid, senses.synsetid, senses.sensekey, synsets.definition FROM
感觉
LEFT OUTER JOIN
同义词ON senses.synsetid = synsets.synsetid
where senses.wordid = 79459
我知道您可以通过将 synsetid 提交回感官 table 来获得同义词,这会为您提供唯一的 wordid 和 sensekey,然后您可以将它们与单词 table 连接起来。我的问题是我似乎无法构建该查询。
如果可能的话,我想获得这些专栏。如果不是 synsetid,引理和定义就可以了。当前数据库是 mySql 但我希望答案也适用于 sqlite,因为我将它用于 android 应用程序。
wordid、词条、senseid、synsetid、定义
架构:
CREATE TABLE `synsets` (
`synsetid` int(10) unsigned NOT NULL DEFAULT '0',
`pos` enum('n','v','a','r','s') NOT NULL,
`definition` mediumtext,
PRIMARY KEY (`synsetid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `words` (
`wordid` int(10) unsigned NOT NULL DEFAULT '0',
`lemma` varchar(80) NOT NULL,
`mantiq` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`wordid`),
UNIQUE KEY `unq_words_lemma` (`lemma`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `senses` (
`wordid` int(10) unsigned NOT NULL DEFAULT '0',
`synsetid` int(10) unsigned NOT NULL DEFAULT '0',
`senseid` int(10) unsigned DEFAULT NULL,
`sensekey` varchar(100) DEFAULT NULL,
PRIMARY KEY (`wordid`,`synsetid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `samples` (
`synsetid` int(10) unsigned NOT NULL DEFAULT '0',
`sampleid` smallint(5) unsigned NOT NULL DEFAULT '0',
`sample` mediumtext NOT NULL,
PRIMARY KEY (`synsetid`,`sampleid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Link 到数据库:https://cloud.generatedesign.com/index.php/s/LA2G8ZvqNClqHFN
模式发布后编辑
看来 senses
table 捕获了每个单词及其所有同义词集之间的所有关系,应该与 inner join
以及 words
和 synsets
table 解开所有关系
select sen.wordid,
w.lemma,
w.mantiq,
sen.senseid,
sen.synsetid,
syn.definition,
from senses sen
inner join words w on sen.wordid = w.wordid
inner join synsets syn on sen.synsetid = syn.synsetid
order by sen.wordid, sen.synsetid;
您不需要 LEFT JOIN
,因为您加入的字段似乎不可为空。
我不确定我是否完全理解这个问题,但这样的东西行不通吗?
SELECT s1.wordid, s1.synsetid, s1.sensekey, synsets.definition
, s2.wordid AS matchedWordID, w.* -- Additional info not from question's query
FROM senses AS s1
LEFT JOIN synsets ON s1.synsetid = synsets.synsetid
LEFT JOIN senses AS s2 ON s1.synsetid = s2.synsetid AND s1.wordid <> s2.wordid
LEFT JOIN words AS w ON s2.wordid = w.wordid
WHERE s1.wordid = 79459
;
注意:...
只是您实际需要的字段列表的简写。
注#2:您当然可以使用 synsets
引用加入样本,但请记住,每个词对和样本的结果都会重复;如果某些词对是具有多种含义的同义词,则它们可能会重复。
我正在尝试获取给定 wordid 的同义词和示例列表。经过大量的试验和错误后,我可以获得所有同义词集的样本,但不是实际的同义词。这是我的查询,它给出了以下结果。
select senses.wordid, senses.synsetid, senses.sensekey, synsets.definition FROM
感觉
LEFT OUTER JOIN
同义词ON senses.synsetid = synsets.synsetid
where senses.wordid = 79459
我知道您可以通过将 synsetid 提交回感官 table 来获得同义词,这会为您提供唯一的 wordid 和 sensekey,然后您可以将它们与单词 table 连接起来。我的问题是我似乎无法构建该查询。
如果可能的话,我想获得这些专栏。如果不是 synsetid,引理和定义就可以了。当前数据库是 mySql 但我希望答案也适用于 sqlite,因为我将它用于 android 应用程序。
wordid、词条、senseid、synsetid、定义
架构:
CREATE TABLE `synsets` (
`synsetid` int(10) unsigned NOT NULL DEFAULT '0',
`pos` enum('n','v','a','r','s') NOT NULL,
`definition` mediumtext,
PRIMARY KEY (`synsetid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `words` (
`wordid` int(10) unsigned NOT NULL DEFAULT '0',
`lemma` varchar(80) NOT NULL,
`mantiq` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`wordid`),
UNIQUE KEY `unq_words_lemma` (`lemma`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `senses` (
`wordid` int(10) unsigned NOT NULL DEFAULT '0',
`synsetid` int(10) unsigned NOT NULL DEFAULT '0',
`senseid` int(10) unsigned DEFAULT NULL,
`sensekey` varchar(100) DEFAULT NULL,
PRIMARY KEY (`wordid`,`synsetid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `samples` (
`synsetid` int(10) unsigned NOT NULL DEFAULT '0',
`sampleid` smallint(5) unsigned NOT NULL DEFAULT '0',
`sample` mediumtext NOT NULL,
PRIMARY KEY (`synsetid`,`sampleid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Link 到数据库:https://cloud.generatedesign.com/index.php/s/LA2G8ZvqNClqHFN
模式发布后编辑
看来 senses
table 捕获了每个单词及其所有同义词集之间的所有关系,应该与 inner join
以及 words
和 synsets
table 解开所有关系
select sen.wordid,
w.lemma,
w.mantiq,
sen.senseid,
sen.synsetid,
syn.definition,
from senses sen
inner join words w on sen.wordid = w.wordid
inner join synsets syn on sen.synsetid = syn.synsetid
order by sen.wordid, sen.synsetid;
您不需要 LEFT JOIN
,因为您加入的字段似乎不可为空。
我不确定我是否完全理解这个问题,但这样的东西行不通吗?
SELECT s1.wordid, s1.synsetid, s1.sensekey, synsets.definition
, s2.wordid AS matchedWordID, w.* -- Additional info not from question's query
FROM senses AS s1
LEFT JOIN synsets ON s1.synsetid = synsets.synsetid
LEFT JOIN senses AS s2 ON s1.synsetid = s2.synsetid AND s1.wordid <> s2.wordid
LEFT JOIN words AS w ON s2.wordid = w.wordid
WHERE s1.wordid = 79459
;
注意:...
只是您实际需要的字段列表的简写。
注#2:您当然可以使用 synsets
引用加入样本,但请记住,每个词对和样本的结果都会重复;如果某些词对是具有多种含义的同义词,则它们可能会重复。