WordNet SynSet ptrlist из findtheinfo_ds () проходит только один уровень

Я пытаюсь вызвать WordNet C API из моего приложения C ++, и это работает, но не так, как ожидалось. Вот мой код:

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, что есть много уровней.

Я что-то пропустил? Я неправильно называю findtheinfo_ds ()?

2

Решение

findtheinfo_ds() возвращает только один узел. Чтобы проложить свой путь через дерево, нужно позвонить findtheinfo_ds() для каждого соединения он находит. я нашел эта страница который показывает интерактивный сеанс GDB на возвращенной структуре данных, что, я думаю, вы найдете полезным.

Также взгляните на traceptrs_ds() функция, которая звучит так, как будто она предназначена для того, что вы пытаетесь сделать.

2

Другие решения

Спасибо @Darren Cook за то, что указал мне правильное направление.

Правильное решение — позвонить findtheinfo_ds() чтобы получить начальный узел. Затем переберите каждое из чувств, получая synset->nextss каждого для головного узла следующего смысла.

Для каждого из этих узлов чувствительных головок сначала выведите syn->words или же syn->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();
}
2

По вопросам рекламы [email protected]