Для людей с похожим вопросом (написано после нахождения решения):
Эта проблема, как вы могли заметить в соответствии с приведенными ниже ответами, имеет множество различных решений. Я выбрал только Эван, потому что это был самый простой для меня вариант в моем собственном коде. Однако из того, что я пробовал, каждый другой ответ тоже работал. @SalvadorDali связала эту страницу Kaggle, которая была определенно интересна, и я рекомендую прочитать, если вы заинтересованы. Пролог был также взят в качестве возможного решения, я не знаком с ним, но если вы уже это знаете - его, вероятно, стоит рассмотреть. Кроме того, если вы просто хотите получить код для использования, здесь приводятся примеры Javascript и Python. Однако у каждого из них был другой подход к решению, и я не уверен, что он наиболее эффективен (не стесняйтесь сами его тестировать).
Для дальнейших подходов/чтения:
http://en.wikipedia.org/wiki/Breadth-first_search
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" и проверить, содержит ли он "котенка". С кодом, подобным этому:
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 также прекрасны), псевдокод или просто объяснения будут действительно замечательными.