关于如何处理多对多的逻辑问题
作者:互联网
1.多对多的理解:
一对一的理解:就是一个班主任只属于一个班级,一个班级也只能有一个班主任。这就是对于一对一的理解,一一对应是很容易处理的问题,这是数据库里比较常见的。
一对多: 一个顾客对应多个订单,而一个订单只能对应一个客户
多对一:多个客户可以在同一个商家对同一件商品下单。
多对多: 一个用户可以属于多个集体(家人,朋友,同学),当然一个集体也包含了多个用户。
2.遇到问题时的处理:
最近遇到近义词处理问题,即“近义词-政策”的关系。一个词可能是多个政策的近义词,一个政策也有多个近义词。语料如下:
"高新技术企业","国家级高新技术企业认定"
"高新技术企业","市级高新技术企业认定"
#以上属于一对多的情况
"企业孵化器认定","企业孵化器认定"
"企业孵化器","企业孵化器认定"
"孵化器认定","企业孵化器认定"
"孵化器","企业孵化器认定"
#这属于多对一的情况
这里处理有两个难点:
1.同一近义词对于多个政策的替换。
2.一个近义词有可能是另一个近义词的子串。子串的存在就不能直接使用替换来解决了。
我的思路是这样:
对于第一个问题,同近义词的政策实行字符串拼接,这样能够保证每个近义词的唯一性。
对于第二个问题,实行同义词替换,找到一个中间的字符串替换。匹配规则是从最长的子串匹配,符合匹配规则,直接使用中间字符串替换。中间字符串则保存成字典,检查替换完所有的近义词后,然后从字典中取值,再次替换为原来的字符串。字典的存在也能够保证,即使出现和中间字符串同名的情况,也能够正常处理。
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])
这样感觉就完美的解决了这个问题。
如果有更好的方法,欢迎指教!!!
标签:近义词,逻辑,synonym,处理,text,syn,孵化器,关于,table 来源: https://blog.csdn.net/u010883226/article/details/87967379