關於如何處理多對多的邏輯問題

1.多對多的理解:

    一對一的理解:就是一個班主任只屬於一個班級,一個班級也只能有一個班主任。這就是對於一對一的理解,一一對應是很容易處理的問題,這是數據庫裏比較常見的。   

    一對多: 一個顧客對應多個訂單,而一個訂單隻能對應一個客戶

    多對一:多個客戶可以在同一個商家對同一件商品下單。

    多對多: 一個用戶可以屬於多個集體(家人,朋友,同學),當然一個集體也包含了多個用戶。

2.遇到問題時的處理:

   最近遇到近義詞處理問題,即“近義詞-政策”的關係。一個詞可能是多個政策的近義詞,一個政策也有多個近義詞。語料如下:

"高新技術企業","國家級高新技術企業認定"
"高新技術企業","市級高新技術企業認定"
#以上屬於一對多的情況
"企業孵化器認定","企業孵化器認定"
"企業孵化器","企業孵化器認定"
"孵化器認定","企業孵化器認定"
"孵化器","企業孵化器認定"
#這屬於多對一的情況

這裏處理有兩個難點:

1.同一近義詞對於多個政策的替換。

2.一個近義詞有可能是另一個近義詞的子串。子串的存在就不能直接使用替換來解決了。

我的思路是這樣:

對於第一個問題,同近義詞的政策實行字符串拼接,這樣能夠保證每個近義詞的唯一性。拼接後的字符串如下:

"高新技術企業","國家級高新技術企業認定_市級高新技術企業認定"

對於第二個問題,實行同義詞替換,找到一個中間的字符串替換。匹配規則是從最長的子串匹配,符合匹配規則,直接使用中間字符串替換。中間字符串則保存成字典,檢查替換完所有的近義詞後,然後從字典中取值,再次替換爲原來的字符串。字典的存在也能夠保證,即使出現和中間字符串同名的情況,也能夠正常處理。

例如:輸入:企業孵化器的認定標準是什麼?
使用中間字符串的替換後:
     topic1標準是什麼?
和一個字典dict1 = {
   topic1:企業孵化器
}
def read_csv(self):#csv轉化爲字典,將多對多的情況。
        filename = 'Synonym_Rasa.csv'
        with open(filename) as f:
            reader = csv.reader(f)
            synonym_table = list(reader)
            synonym_list = []
            count = 0
            for syn in synonym_table:
                if syn[1] not in synonym_list:
                    synonym_list.append(syn[1])
                else:
                    index1 = synonym_list.index(syn[1])
                    synonym_table[index1][2] = synonym_table[index1][2] +' '+syn[2]
                    synonym_table.pop(count)
                count += 1    
        return synonym_table
    
def processing(self,text,synonym_table):
        #把字典轉化爲第三方形式,防止影響後面的程序。
        extract_dic = {}
        a = 0
        old_text = text
        for syn_line in synonym_table:
            if syn_line[1] in text:
                print(syn_line[1])
                topic = 'topic'+str(a)
                print(topic)
                text = text.replace(syn_line[1],topic)
                extract_dic[topic] = syn_line[2]
                # print(text)
                a += 1
        # print(text)
        for syn_value in extract_dic:
            text = text.replace(syn_value,extract_dic[syn_value])

這樣感覺就完美的解決了這個問題。

如果有更好的方法,歡迎指教!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章