我有一个用例,其中我有一个词,我需要知道以下事情:
这个词的同义词(只要同义词就足够了)
所有的词义,其中每个词义都包含-在这个意义上匹配那个词的同义词,那个意义上的例句(如果有的话),那个意义上的词性。
示例-this query link。单词carry的屏幕截图:
mysql - Wordnet查询以返回例句-LMLPHP
对于每个“意义”,我们都有词性(如V)、与该意义匹配的同义词(如第一意义上的transport、第二意义上的packtake等)、包含该意义上的单词的例句(如第一意义上的This train is carrying nuclear wastecarry the suitcase to the car等、第二意义上的I always carry money等)。
如何从aWordnet MySQL database执行此操作?我运行此查询,它返回单词的含义列表:
SELECT a.lemma, c.definition FROM words a INNER JOIN senses b ON a.wordid = b.wordid INNER JOIN synsets c ON b.synsetid = c.synsetid WHERE a.lemma = 'carry';
我如何得到每个意义上的同义词、例句、词性和同义词?我查询了vframesentencesvframesentencemaps表,看到了带有像%s这样的占位符的示例语句,并且基于wordid列,我试图将它们与words表匹配,但是得到了非常错误的结果。
编辑:
对于单词carry,如果我运行这些查询,我将正确获得同义词和意义:

1. select * from words where lemma='carry' //yield wordid as 21354
2. select * from senses where wordid=21354 //yield 41 sysnsetids, like 201062889
3. select * from synsets where synsetid=201062889 //yields the explanation "serve as a means for expressing something"
4. select * from senses where synsetid=20106288` /yields all matching synonyms for that sense as wordids, including "carry" - like 21354, 29630, 45011
5. select * from words where wordid=29630 //yields 'convey'

所以我现在只需要找到一种方法,在41种感觉中的每一种中找到单词carry的例句。我该怎么做?

最佳答案

您可以从samples表中获取句子。例如:

SELECT sample FROM samples WHERE synsetid = 201062889;

产量:
玛丽的画承载着母爱
他的声音带着很大的愤怒
因此,您可以按如下方式扩展查询:
SELECT
    a.lemma AS `word`,
    c.definition,
    c.pos AS `part of speech`,
    d.sample AS `example sentence`,
    (SELECT
            GROUP_CONCAT(a1.lemma)
        FROM
            words a1
                INNER JOIN
            senses b1 ON a1.wordid = b1.wordid
        WHERE
            b1.synsetid = b.synsetid
                AND a1.lemma <> a.lemma
        GROUP BY b.synsetid) AS `synonyms`
FROM
    words a
        INNER JOIN
    senses b ON a.wordid = b.wordid
        INNER JOIN
    synsets c ON b.synsetid = c.synsetid
        INNER JOIN
    samples d ON b.synsetid = d.synsetid
WHERE
    a.lemma = 'carry'
ORDER BY a.lemma , c.definition , d.sample;

注意:带有GROUP_CONCAT的子选择将每个意义的同义词作为逗号分隔的列表返回到一行中,以便减少行数。如果愿意的话,可以考虑在单独的查询中返回这些内容(或者作为该查询的一部分,但所有内容都是重复的)。
更新
如果你真的需要同义词作为结果中的行,下面的代码可以做到,但我不建议这样做:同义词和例句都属于一个特定的定义,因此每一个例句的同义词集都会重复。例如,如果一个特定定义有4个例句和5个同义词,则仅此定义的结果就有4 x 5=20行。
SELECT
    a.lemma AS `word`,
    c.definition,
    c.pos AS `part of speech`,
    d.sample AS `example sentence`,
    subq.lemma AS `synonym`
FROM
    words a
        INNER JOIN
    senses b ON a.wordid = b.wordid
        INNER JOIN
    synsets c ON b.synsetid = c.synsetid
        INNER JOIN
    samples d ON b.synsetid = d.synsetid
        LEFT JOIN
    (SELECT
        a1.lemma, b1.synsetid
    FROM
        senses b1
    INNER JOIN words a1 ON a1.wordid = b1.wordid) subq ON subq.synsetid = b.synsetid
        AND subq.lemma <> a.lemma
WHERE
    a.lemma = 'carry'
ORDER BY a.lemma , c.definition , d.sample;

10-06 10:32