229 lines
10 KiB
Python
229 lines
10 KiB
Python
"""
|
||
در این فایل سکشن هایی که از نظر سه فاکتور دسته موضوعی، کلیدواژه های مشترک و سازمان اشتراک دارند، مشخص می شود
|
||
"""
|
||
from funcs import read_from_json, write_to_json, save_to_file_by_address
|
||
import datetime
|
||
from tqdm import tqdm
|
||
import pandas as pd
|
||
|
||
print(datetime.datetime.now())
|
||
|
||
"""
|
||
similars = read_from_json("./data/temp_similar.json")
|
||
|
||
finall_text = ""
|
||
for item in similars:
|
||
|
||
similar_items = item["similars"]
|
||
similar_sections = ""
|
||
for item1 in similar_items:
|
||
kws1 = item1["keywords"]
|
||
kws_str = ""
|
||
for key in kws1:
|
||
kws_str += "".join(key+" | ")
|
||
if item1.__contains__("orgs"):
|
||
|
||
orgs1 = item1["orgs"]
|
||
orgs_str = ""
|
||
for org in orgs1:
|
||
orgs_str += "".join(org+" | ")
|
||
|
||
similar_sections += "".join(item1["id"] + "\n" +item1["content"] + "\n" + kws_str + "\n" + orgs_str + "\n ~~~~~~~~~~~~~\n" )
|
||
|
||
mkws1 = item["main_keywords"]
|
||
mkws_str = ""
|
||
for mkey in mkws1:
|
||
mkws_str += "".join(mkey+" | ")
|
||
if item.__contains__("main_orgs"):
|
||
morgs1 = item["main_orgs"]
|
||
morgs_str = ""
|
||
for morg in morgs1:
|
||
morgs_str += "".join(morg+" | ")
|
||
main_section = item["main_id"] + " ->\n" + item["main_content"] + "\nموضوع: " + item["main_topic"] + "\nکلیدواژه ها: " + mkws_str + "\nسازمان ها: "+ morgs_str+ "\n ************************************\n"
|
||
finall_text += ''.join(main_section + similar_sections + "------------------------------------------------------\n\n")
|
||
|
||
save_to_file_by_address("./data/similar_sections.txt", finall_text)"""
|
||
|
||
main_7k_sections = read_from_json("./data/sections_7K_full_metadata.json")
|
||
|
||
sections7k_df = pd.DataFrame(main_7k_sections)
|
||
count = 0
|
||
jumped = []
|
||
finall_sections = []
|
||
for section in tqdm(main_7k_sections):
|
||
count += 1
|
||
print("section --> " + str(count))
|
||
related_sections = []
|
||
id = section["id"]
|
||
keywords = section["keywords"]
|
||
topic = section["ai-code"]
|
||
ners = section["ners"]
|
||
ners_df = pd.DataFrame(ners)
|
||
#بررسی اینکه آیا این سکشن دارای موجودیت نامدار هست یا خیر
|
||
if not 'key' in ners_df.columns:
|
||
jumped.append(id)
|
||
continue
|
||
# انتخاب موجودیت های نامدار از نوع سازمانی
|
||
orgs = ners_df[ners_df['key'] == 'ORG']
|
||
main_orgs = [o.value for ii, o in orgs.iterrows()]
|
||
main_orgs = list(set(main_orgs))
|
||
if topic == "" or not topic:
|
||
jumped.append(id)
|
||
continue
|
||
|
||
# یافتن همه رکورد هایی که با رکورد جاری، هم موضوع هستند
|
||
records_similar_topic = sections7k_df[sections7k_df['ai-code'] == topic]
|
||
|
||
similar_keyowrd_list = []
|
||
similar_keyowrd_list2 = []
|
||
|
||
# region """ تست """
|
||
# kw_set = set()
|
||
# for ind, row in records_similar_topic.iterrows():
|
||
# this_keywords = row["keywords"]
|
||
# for item1 in this_keywords:
|
||
# kw_set.add(item1)
|
||
# kw_list = list(kw_set)
|
||
# kw_list_text = ""
|
||
# for kw in kw_list:
|
||
# kw_list_text += "".join(kw + "$")
|
||
# endregion
|
||
|
||
# پیمایش سکشن های هر موضوع بر اساس کلیدواژه های سکشن جاری
|
||
for current_keyword in tqdm(keywords):
|
||
# یافتن سکشن هایی که کلیدواژه های آن با کلیدواژه های سکشن اصلی که در حال بررسی است، اشتراک داشته باشند
|
||
for i, similar_record in records_similar_topic.iterrows():
|
||
# به دست آوردن کلیدواژه های سکشن جاری در این حلقه
|
||
this_kws = similar_record['keywords']
|
||
# بررسی مشابهت کلیدواژه ها
|
||
if current_keyword in this_kws:
|
||
# جلوگیری از مقایسه سکشن با خودش
|
||
if similar_record["id"] == id:
|
||
continue
|
||
# similar_keyowrd_list.append(similar_record)
|
||
data = {
|
||
"id": similar_record["id"],
|
||
"content": similar_record["content"],# میتونه حذف بشه
|
||
"keywords": current_keyword,
|
||
"ners": similar_record["ners"]
|
||
}
|
||
similar_keyowrd_list.append(data)
|
||
|
||
# for index, item in found_items.iterrows():
|
||
# # جلوگیری از مقایسه سکشن با خودش
|
||
# if item["id"] == id:
|
||
# continue
|
||
# similar_keyowrd_list.append(item)
|
||
|
||
# اگر سکشنی که کلیدواژه مشترک با کلیدواژه های سکشن جاری داشته باشد، پیدا نشد، جستجو را ادامه ندهد
|
||
|
||
# تبدیل لیست سکشن های مشابه بر اساس کلیدواژه به یک دیتافریم و گروپ بای به منظور حذف سکشن های تکراری
|
||
similar_keyowrd_df = pd.DataFrame(similar_keyowrd_list)
|
||
new_similar_kw_list = []
|
||
new_similar_kw_ids = []
|
||
# پیمایش لیست سکشنهایی که در کلیدواژه با سکشن مورد بررسی اشتراک داشته اند برای
|
||
for j, sec in similar_keyowrd_df.iterrows():
|
||
if sec["id"] in new_similar_kw_ids:
|
||
continue
|
||
# اگر رکورد هایی با شناسه تکراری وجود داشته باشد، با این خط کد، همگی پیدا می شود
|
||
# دلیل تکرار یک شناسه این هست که بازای هر کلیدواژه اشتراکی، یک رکورد در لیست رکورد ها بر اساس کلیدواژه مشابه درج شده است که در اینجا قصد داریم مقادیر تکراری را ادغام کنیم
|
||
data_section = similar_keyowrd_df[similar_keyowrd_df['id'] == sec["id"]]
|
||
kws = []
|
||
if len(data_section) > 1:
|
||
kws = [row1["keywords"] for k, row1 in similar_keyowrd_df.iterrows()]
|
||
"""در این حالت زیر که تعداد کلیدواژه های مشترک فقط یکی است احتمالا صرف نظر کنیم تا از تعدد موارد مشترک جلوگیری شود"""
|
||
# else:
|
||
# kws.append(sec["keywords"])
|
||
# حذف کلیدواژه های تکراری
|
||
kws = set(kws)
|
||
if len(kws) <= 1:
|
||
continue
|
||
new_similar_kw_list.append({
|
||
"id": sec["id"],
|
||
"content": sec["content"], # می تونه حذف بشه
|
||
"keywords_len":len(kws),
|
||
"keywords": list(kws),
|
||
"ners": sec["ners"],
|
||
})
|
||
new_similar_kw_ids.append(sec["id"])
|
||
if not new_similar_kw_list:
|
||
jumped.append(id)
|
||
continue
|
||
|
||
similar_ner_list = []
|
||
new_similar_kw_list_df = pd.DataFrame(new_similar_kw_list)
|
||
# پیمایش سکشن های هر موضوع بر اساس تک تک موجودیت های نامدار سکشن جاری
|
||
for current_ner in tqdm(ners):
|
||
#بررسی اینکه آیا این سکشن دارای موجودیت نامدار هست یا خیر
|
||
if not 'key' in ners_df.columns:
|
||
continue
|
||
# انتخاب موجودیت های نامدار از نوع سازمانی
|
||
for l, sec_row in new_similar_kw_list_df.iterrows():
|
||
this_ners = sec_row["ners"]
|
||
this_ners_df = pd.DataFrame(this_ners)
|
||
if not 'key' in this_ners_df.columns:
|
||
continue
|
||
found_orgs = this_ners_df[this_ners_df['key'] == 'ORG']
|
||
# اگر سازمانی پیدا نشد، ادامه نده
|
||
if not list(found_orgs.value):
|
||
continue
|
||
|
||
found_orgs_list = []
|
||
# حذف مقادیر تکراری
|
||
this_orgs = list(set(list(found_orgs.value)))
|
||
# this_orgs = pd.DataFrame(this_orgs)
|
||
for found_org in this_orgs:
|
||
# جلوگیری از مقایسه سکشن با خودش
|
||
if sec_row["id"] == id:
|
||
continue
|
||
# اگر این موجودیت نامدار مساوی با موجودیت نامدار سکشن اصلی نبود، ادامه نده
|
||
if not found_org == current_ner["value"]:
|
||
continue
|
||
# اگر قبلا این موجودیت نامدار ثبت شده بود ، ادامه نده
|
||
if found_org in found_orgs_list:
|
||
continue
|
||
found_orgs_list.append(found_org)
|
||
if not "orgs" in new_similar_kw_list_df.columns:
|
||
# تعریف یک ستون برای سازمان ها در صورتی که چنین ستونی وجود نداشت
|
||
new_similar_kw_list_df["orgs"] = 'NAN'
|
||
# به روز رسانی مقدار مربوط به ستون سازمان ها در ردیف جاری
|
||
new_similar_kw_list_df.at[l, 'orgs'] = this_orgs
|
||
|
||
finall_sections.append({
|
||
"main_id": id,
|
||
"main_content": section["content"],
|
||
"main_topic": topic,
|
||
"main_keywords": keywords,
|
||
"main_orgs": main_orgs,
|
||
# تبدیل دیتافریم پانداس به دیکشنری
|
||
"similars": new_similar_kw_list_df.to_dict("records")
|
||
})
|
||
# write_to_json(finall_sections, './data/temp_similar.json')
|
||
|
||
new_dict = []
|
||
# for ind, data in new_similar_kw_list_df.iterrows():
|
||
# orgs = []
|
||
# try: orgs = data["orgs"]
|
||
# except: pass
|
||
|
||
# new_dict.append({
|
||
# "id": data["id"],
|
||
# "content": data["content"],
|
||
# "keywords_len": data["keywords_len"],
|
||
# "keywords": data["keywords"],
|
||
# "orgs": orgs,
|
||
# })
|
||
write_to_json(finall_sections, './data/temp_similar.json')
|
||
|
||
#write_to_json(sections_rel, "./data/sections_7K_relation.json")
|
||
|
||
print(datetime.datetime.now())
|
||
print(" # # # relation update finished! # # # ")
|
||
|
||
"""new_similar_kw_list.append({
|
||
"id": id,
|
||
"content": section["content"], # می تونه حذف بشه
|
||
"keywords_len":len(keywords),
|
||
"keywords":keywords,
|
||
"orgs": list(orgs.value),
|
||
})""" |