Я пытаюсь вызвать 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 ()?
findtheinfo_ds()
возвращает только один узел. Чтобы проложить свой путь через дерево, нужно позвонить findtheinfo_ds()
для каждого соединения он находит. я нашел эта страница который показывает интерактивный сеанс GDB на возвращенной структуре данных, что, я думаю, вы найдете полезным.
Также взгляните на traceptrs_ds()
функция, которая звучит так, как будто она предназначена для того, что вы пытаетесь сделать.
Спасибо @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();
}