findtheinfo_ds()中的WordNet SynSet ptrlist只进入一个级别

WordNet SynSet ptrlist from findtheinfo_ds() only goes one level

本文关键字:一个 ptrlist ds 中的 WordNet findtheinfo SynSet      更新时间:2023-10-16

我正在尝试从C++应用程序调用WordNet C API,它可以工作,但并不像预期的那样。这是我的代码:

int search (char* term)
{
    results.clear();
    SynsetPtr synsets = findtheinfo_ds(term, NOUN, HYPERPTR, ALLSENSES);
    SynsetPtr currentSynset = synsets;
    // Loop all senses
    while (currentSynset != nullptr)
    {
        SynsetPtr next = currentSynset;
        // Iterate up hierarchy for each sense.
        while (next != nullptr)
        {
            String words;
            for (int i = 0; i != next->wcount; ++i)
            {
                String nextWord = next->words[i];
                nextWord = nextWord.replaceCharacter('_', ' ');
                words += String(nextWord);
                if (i != (next->wcount - 1)) words += ", ";
            }
            results.add (words + " - " + String(next->defn));
            next = next->ptrlist;
        }
        currentSynset = currentSynset->nextss;
    }
    free_syns(synsets);
    return results.size();
}

我的程序正确地输出了每个意义的定义,但对于每个意义,它只输出层次结构中我的搜索词正上方的一个超名称,而不是一直到树上的"实体"。换句话说,第二个SynsetPtr->ptrlist始终为NULL,即使我可以从WordNet CLI中看到有许多级别向上。

我是不是错过了什么?我调用findtheinfo_ds()是否错误?

findtheinfo_ds()只返回一个节点。要在树中工作,必须为它找到的每个连接调用findtheinfo_ds()。我发现这个页面显示了一个关于返回数据结构的gdb交互式会话,我认为您会发现它很有用。

还可以看看traceptrs_ds()函数,它听起来可能是为您想要做的事情而设计的。

感谢@Darren Cook为我指明了正确的方向。

正确的解决方案是调用findtheinfo_ds()来获取起始节点。然后遍历每个感测,得到下一个感测的头节点的每个感测的synset->nextss

对于这些感测头节点中的每一个,首先打印定义的syn->wordssyn->defn。然后调用traceptrs_ds(),传递头节点和深度1(这意味着我们请求递归搜索,以将所有节点都搜索到"实体")。然后从节点traceptrs_ds()返回进行迭代,以获得该意义上的所有(在我的情况下)超名称。这是我更新的代码:

int setSearch (char* term)
{
    results.clear();
    SynsetPtr synsets = findtheinfo_ds(term, NOUN, HYPERPTR, ALLSENSES);
    SynsetPtr currentSynset = synsets;
    // Loop all senses
    while (currentSynset != NULL)
    {
        // Function that prints the synset->defn i.e. the definition of this sense.
        printSynsetDef(currentSynset);
        // Call this to get the hypernyms for this sense, with next->ptrlist linked as expected.
        SynsetPtr next = traceptrs_ds(currentSynset, *currentSynset->ptrtyp, *currentSynset->ppos, 1);
        // Iterate up/down tree for each sense.
        while (next != NULL)
        {
            printSynsetDef(next);
            next = next->ptrlist;
        }
        // Don't forget to free the list. Hairy C!
        free_syns(next);
        currentSynset = currentSynset->nextss;
    }
    // And free the original list.
    free_syns(synsets);
    return results.size();
}