【发布时间】:2015-08-24 19:31:26
【问题描述】:
对于有类似问题的人(在找到解决方案后写):
根据下面的答案,您可能会注意到这个问题有很多不同的解决方案。我只选择了 Evan 的,因为它是我在自己的代码中实现的最简单的方法。但是,根据我的尝试,其他所有答案也都有效。 @SalvadorDali 链接了这个Kaggle page,这绝对很有趣,如果您有兴趣,我建议您阅读。 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 也可以)、伪代码或只是解释都会非常棒。
【问题讨论】:
-
按照你构建它的方式,你基本上会有多个有限的相关词集(一组是 {computer, electronics, PC, abacus},另一个是 {feline, kitten, cat ,鼠标,包,齿轮,包等等})。为什么不提前编写代码来定义所有这些集合,然后测试这两个词是否都是任何一个集合的成员?
-
这似乎非常适合 Prolog
-
代码从同义词库中读取所有单词,因此每个单词都有不同数量的同义词。此外,如果该方法可以检查不同“距离”之间的关系,那将是理想的,这样它就可以找到可能相隔 5 个(或更多)单词的关系。
-
在这里,我在 Prolog 中找到了一个相关问题,您可以根据自己的问题进行调整:stackoverflow.com/questions/8966488/…
-
@DiogoDoreto Progol 是 declarative 语言,而 Go、Python 和 JavaScript 都是 imperative...所以我不推荐这种解决方案,只是出于好奇。跨度>
标签: javascript python arrays recursion go