()
| 24 | |
| 25 | |
| 26 | def match_entity_from_yago(): |
| 27 | |
| 28 | #创建虚拟表,用以执行全文搜索 |
| 29 | conn, cursor = get_yagoTypes_from_tsv() |
| 30 | |
| 31 | #先一把所有表的所有行都映射到yago中的类,使用match,全文搜索 |
| 32 | floder_path = 'benchmark' |
| 33 | save_floder_path = 'benchmarkSem' |
| 34 | for file_name in os.listdir(floder_path): |
| 35 | if file_name not in os.listdir('benchmarkSem'): |
| 36 | file_path = os.path.join(floder_path, file_name) |
| 37 | df = pd.read_csv(file_path) |
| 38 | saved_data = {} |
| 39 | #取出每一列,将列的每个值都先映射到实体,选出最多三个实体,把这个实体映射到类中 |
| 40 | for column in df.columns: |
| 41 | values = df[column].to_list() |
| 42 | #把所有的值都处理成小写,并用空格来代替标点符号 |
| 43 | for i in range(len(values)): |
| 44 | values[i] = process_string(values[i]) |
| 45 | values = [s for s in values if s!=" " and s!=""] |
| 46 | counter = Counter(values) |
| 47 | #统计值出现的次数,形成一个字典 |
| 48 | values_set= set(values) |
| 49 | classes_of_thisColumn = [] |
| 50 | for value in values_set: |
| 51 | search_keywords = value |
| 52 | query = f'''select entity |
| 53 | from yagoEntitys |
| 54 | where entity match '{search_keywords}' |
| 55 | order by bm25(yagoEntitys) desc |
| 56 | limit 3;''' |
| 57 | try: |
| 58 | cursor.execute(query) |
| 59 | results = cursor.fetchall() |
| 60 | #找到了这个value匹配的实体名称,还要依次把相应的taxonomy_class类找出来 |
| 61 | for result in results: |
| 62 | query = f'''SELECT distinct taxonomy_class |
| 63 | FROM yagoTypejoinclasses |
| 64 | WHERE entity = '{result[0]}'; |
| 65 | ''' |
| 66 | cursor.execute(query) |
| 67 | temp = cursor.fetchall() |
| 68 | for i in range(len(temp)): |
| 69 | temp[i] = temp[i][0] |
| 70 | |
| 71 | #根据列中value出现的次数,添加相应个数的class值 |
| 72 | classes_of_thisColumn += temp * counter[value]#列表*一个数,是把列表扩大几倍 |
| 73 | #查询返回的是一个元组,需要把元组中的[0]拿出来,然后放进classes_of_thisColumn, 并且需要distinct |
| 74 | except sqlite3.Error: |
| 75 | continue |
| 76 | |
| 77 | #把这个列的属于的所有类都存到字典中 |
| 78 | saved_data[column] = classes_of_thisColumn |
| 79 | |
| 80 | #创建DataFrame对象,把saved_data字典加载到这里面,最后使用to_csv将这个表对应的sem表保存 |
| 81 | saved_data = fill_zero(saved_data) |
| 82 | saved_df = pd.DataFrame(saved_data) |
| 83 | saved_file_path = os.path.join(save_floder_path, file_name) |
no test coverage detected