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])
這樣感覺就完美的解決了這個問題。
如果有更好的方法,歡迎指教!!!