对于有类似问题的人(在找到解决方案后编写):
如下面的答案所示,这个问题有很多不同的解决方案。我只选择了Evan的答案,因为它对我来说是最容易实现到我的代码中去的。然而,从我尝试过的结果来看,每个其他的答案也都起作用。@SalvadorDali 链接了这个Kaggle页面,非常有趣,如果你感兴趣,我建议你阅读一下。Prolog也被提出作为一个可能的解决方案,我对它不熟悉,但是如果你已经了解了它--那么考虑使用它可能是值得的。此外,如果您只是想获取可用的代码,请参考以下工作的Javascript和Python示例。然而,每一个都有不同的解决方法,我不确定哪种方法最有效(可以自己测试)。
获取进一步的解决方案/阅读材料:
http://en.wikipedia.org/wiki/Breadth-first_search
Prolog and ancestor relationship
https://www.kaggle.com/c/word2vec-nlp-tutorial/details/part-2-word-vectors
对于标题不太清晰的问题表示抱歉,我无法想出一个适当的方式来表达我的问题--欢迎提供更好的建议。
由于我很难描述我的问题,所以我将尽可能详细地解释我的目标和代码:
注:我的代码是Go语言编写的,但如果您有任何问题,我也可以接受其他语言的答案,并会尽快回答。
基本上,我有一个包含“Word”对象的数组,它看起来像这样:
type Word struct{
text string
synonyms []string
}
这是数组中包含4个单词的示例:
[]Word{
{text: "cat" synonyms: ["feline", "kitten", "mouser"]}
{text: "kitten" synonyms: ["kitty", "kit"]}
{text: "kit" synonyms: ["pack", "bag", "gear"]}
{text: "computer" synonyms: ["electronics", "PC", "abacus"]}
}
我的挑战是编写一个方法来测试两个单词之间的关系。当然,像"cat"和"kitten"这样的单词之间的测试将因为以上示例而变得容易。我可以检查 "Cat" 的同义词列表并测试它是否包含 "kitten" 这个单词。使用如下代码:
areWordsRelated(word1 Word, word2 Word) bool{
for _, elem := range word1.synonyms{
if elem == word2.text{
return true
}
}
return false
}
然而,我无法弄清如何测试更远的关系。
例如:
areWordsRelated("cat","pack") //should return true
//because "cat" is related to "kitten" which is related to "pack"
areWordsRelated("cat", "computer") //should return false
我尝试递归来做它,但是我的所有尝试似乎都不起作用。任何示例代码(我的代码是Go,但Python、Java或Javascript也可以),伪代码或解释都将非常棒。