findtheinfo_ds()中的WordNet SynSet ptrlist只进入一个级别
WordNet SynSet ptrlist from findtheinfo_ds() only goes one level
我正在尝试从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->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();
}
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 用C++中的一个变量定义一个常量
- 函数向量_指针有不同的原型,我可以构建一个吗
- 在c++中用vector填充一个简单的动态数组
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 预处理器:插入结构名称中的前一个行号
- 我在c++代码中生成了一个运行时#3异常
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 从链接列表c++中删除一个项目
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '