亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何找到對象之間的關系

如何找到對象之間的關系

Go
慕絲7291255 2021-10-11 18:51:40
對于有類似問題的人(找到解決方案后寫的):根據下面的答案,您可能會注意到這個問題有很多不同的解決方案。我只選擇了 Evan 的,因為它是我在自己的代碼中實現的最簡單的方法。但是,根據我的嘗試,其他所有答案也都有效。@SalvadorDali鏈接了這個Kaggle 頁面,這絕對很有趣,如果您有興趣,我建議您閱讀。Prolog 也被提出作為一種可能的解決方案,我不熟悉它,但如果您已經知道它 - 可能值得考慮。此外,如果您只是想使用代碼,下面有可用的 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”和“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 也可以)、偽代碼或只是解釋都非常棒。
查看完整描述

3 回答

?
胡子哥哥

TA貢獻1825條經驗 獲得超6個贊

首先,這里不清楚你如何定義關系。如果你的“貓”有同義詞:[“貓”,“小貓”,“鼠標”],這是否意味著“鼠標”有一個同義詞“貓”。


根據我的理解,答案是否定的。所以這是python中的解決方案:


G = {

    "cat": ["feline", "kitten", "mouser"],

    "kitten": ["kitty", "kit"],

    "kit": ["pack", "bag", "gear"],

    "computer": ["electronics", "PC", "abacus"]

}


def areWordsRelated(G, w1, w2):

    if w1 == w2:

        return True


    frontier = [w1]

    checked = set()

    while len(frontier):

        el = frontier.pop()

        if el in G:

            neighbors = G[el]

            for i in neighbors:

                if i == w2:

                    return True

                if i not in checked:

                    frontier.append(i)

                    checked.add(i)


    return False


areWordsRelated(G, "cat", "pack") #true

areWordsRelated(G, "cat", "computer") #false

那么我們在這里做什么呢?起初你有你的圖表,它只是字典(地圖),它顯示了你的關系(我基本上拿了你的切片)。


我們的算法像模具一樣增長,維護一組檢查元素和當前邊界。如果 frontier 是空的(沒有什么可探索的,那么元素沒有連接)。我們一次從邊界中提取一個元素并檢查所有鄰居。如果它們中的任何一個是我們正在尋找的元素 - 那么就存在聯系。否則檢查我們是否已經看到了這樣的元素(如果沒有,則將其添加到邊界和已檢查的集合中)。


請注意,如果您的關系以稍微不同的方式運作,您需要的只是修改圖表。


最后一句話,如果您正在尋找一種正常的方法來查找同義詞,請查看word to vector 算法和python 中的一個很好的實現。這將允許您找到真正復雜的關系,即使是在沒有指定這種關系的情況下,California也Golden Gate可以找到相關的詞。


查看完整回答
反對 回復 2021-10-11
  • 3 回答
  • 0 關注
  • 216 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號