From 26a283cc16c878631bacdb6ef300871e75f095dd Mon Sep 17 00:00:00 2001 From: ajokar Date: Tue, 17 Sep 2024 16:45:41 +0000 Subject: [PATCH] Upload files to "import_data" --- import_data/qavanin480_dataset.py | 171 +++++++++++++++++ import_data/remove_html_tags.py | 67 +++++++ import_data/result_objects.py | 105 +++++++++++ import_data/section_topic_dataset.py | 97 ++++++++++ import_data/test_dataset.txt | 268 +++++++++++++++++++++++++++ 5 files changed, 708 insertions(+) create mode 100644 import_data/qavanin480_dataset.py create mode 100644 import_data/remove_html_tags.py create mode 100644 import_data/result_objects.py create mode 100644 import_data/section_topic_dataset.py create mode 100644 import_data/test_dataset.txt diff --git a/import_data/qavanin480_dataset.py b/import_data/qavanin480_dataset.py new file mode 100644 index 0000000..aa695c3 --- /dev/null +++ b/import_data/qavanin480_dataset.py @@ -0,0 +1,171 @@ +from decimal import Decimal +import requests +import json +import os + + +TOKEN = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE3MTg0NTE3MTUsImp0aSI6InNWaDljNkdlRWdEK0IzM1N2UHNzbXkybkxUK0tWWnBjIiwiaXNzIjoiaHR0cHM6XC9cL2NwLnRhdmFzaS5pciIsImV4cCI6MTcxOTc1MTcxNCwiYXVkIjoiaHR0cHM6XC9cL2NwLnRhdmFzaS5pciIsImRhdGEiOnsiaWQiOjQwLCJmaXJzdF9uYW1lIjoiXHUwNjM5XHUwNjQ1XHUwNjI3XHUwNjMxIiwibGFzdF9uYW1lIjoiXHUwNjJjXHUwNjQ4XHUwNmE5XHUwNjI3XHUwNjMxIiwiZW1haWwiOiJham9rYXI5MUB5YWhvby5jb20iLCJ1c2VybmFtZSI6ImFqb2thciIsInVzZXJfbGV2ZWwiOjF9fQ.frkLaR1HYyfZ8sFhLtiuEZaBPwDPWKSxKDQpql6aOZc' +ACCEPT = "application/json" +HEADERS = {"Authorization": TOKEN, "Accept": ACCEPT} + +url = "https://api.tavasi.ir/repo/dataset/multi/add/qasection/ner" +headers = HEADERS + +address = os.getcwd() +if 'impoert_data' in address: + address += '/data/qavanin_dataset.txt' +else: + address += '/impoert_data/data/qavanin_dataset.txt' +# باز کردن فایل متنی +with open(address, 'r', encoding='utf-8') as file: + input_text = file.read() + +# تبدیل متن به لیستی از خطوط +lines = input_text.strip().split('\n') + +key = '' +begin = -1 +end = -1 +tokenNumber = -1 +content = '' +result_token = [] + +class JSONEncoder(json.JSONEncoder): + def default(self, obj): + if isinstance(obj, Decimal): + return float(obj) + return json.JSONEncoder.default(self, obj) + +# def createIndex(content, result_token): +# output = { +# "content": content, +# "domain": "پیکره قوانین 480", +# "ref_id": "", +# "ref_url": "", +# "result_token": result_token, +# } +# # print(output) +# # print(json.dumps(output, indent=4, ensure_ascii=False)) +# return output + +def createIndex(content, result_token): + result_objects = [{ + "task":"ner", + "key":"qavanin_ner", + "label":"خروجی تیم همتا", + "values":result_token + } ] + output ={ + "content": content, + "domain": "پیکره قوانین 480", + "ref_id": "", + "ref_url": "", + "result_objects": result_objects, + } + # print(output) + # print(json.dumps(output, indent=4, ensure_ascii=False)) + return output + +def appendResultToken(text, key, begin, tokenNumber, result_token): + end = -1 + # if key == 'HALFREFERENCE' : + # key = 'H_REF' + # elif key == 'REFERENCE' : + # key = 'REF' + if key: + # if key == 'org' : + # key = 'ORG' + # elif key == 'loc' : + # key = 'LOC' + # elif key == 'Facility' : + # key = 'fac' + # elif key == 'event' : + # key = 'EVENT' + # elif key == 'pro' : + # key = 'PRO' + # elif key == 'pers' : + # key = 'PER' + + end = tokenNumber -1 + result_token.append({ + "begin": begin, + "end": end, + "result_key": key, + "text" : text + }) + begin = -1 + end = -1 + key = '' + return key, begin, end, result_token + +bulk_data = [] +bulk_count = 1 +count = 0 +text = '' + +for i, line in enumerate(lines): + print('line: ' + str(i)) + count += 1 + tokenNumber = tokenNumber + 1 + + if line.strip() == '' : + key, begin, end, result_token = appendResultToken(text, key, begin, tokenNumber, result_token) + + data = createIndex(content, result_token) + tokenNumber = -1 + content = '' + result_token = [] + + bulk_data.append(data) + bulk_count +=1 + if bulk_data.__len__() > 100: + print('=' * 30 ) + print('count ' + str(count)) + payload = json.dumps(bulk_data, cls=JSONEncoder) #Works! + response = requests.request("POST", url, headers=headers, data=payload) + print(response) + bulk_data = [] + bulk_count = 1 + + continue + + + + parts = line.split() + if len(parts) != 2: + continue + + content += ' ' + parts[0] + + result_key = parts[1] + if result_key.startswith('I-'): + text += ' ' + parts[0] + continue + + if result_key == 'O' : + key, begin, end, result_token = appendResultToken(text, key, begin, tokenNumber, result_token) + + if result_key.startswith('B-'): + key, begin, end, result_token = appendResultToken(text, key, begin, tokenNumber, result_token) + + text = parts[0] + begin = tokenNumber + end = -1 + key = result_key.replace('B-', '') + + +if content != '' : + key, begin, end, result_token = appendResultToken(text, key, begin, tokenNumber, result_token) + data = createIndex(content, result_token) + bulk_data.append(data) + bulk_count +=1 + + +if bulk_data.__len__() > 0: + print(bulk_count) + payload = json.dumps(bulk_data, cls=JSONEncoder) #Works! + response = requests.request("POST", url, headers=headers, data=payload) + print(response.text) + +# نمایش دیکشنری خروجی به صورت JSON +print("***************** end ") \ No newline at end of file diff --git a/import_data/remove_html_tags.py b/import_data/remove_html_tags.py new file mode 100644 index 0000000..8191791 --- /dev/null +++ b/import_data/remove_html_tags.py @@ -0,0 +1,67 @@ +from docx import Document +from bs4 import BeautifulSoup +import re + +tableTag=["table","tr", "th", "tc"] +mark1 = r'#\[#' +mark2 = r'#\]#' +hTag1 = r'<' +hTag2 = r'>' +strTable = '' +for tag in tableTag: + if strTable != '': + strTable += '|' + strTable += '('+tag+')' +regTable = r'<(?P/)*(?P'+strTable+')(?P[^>]+)*>' +regTableReplace = r'#[#\g\g\g#]#' + +def removeHtmlNoTableTag(html): + html = re.sub(regTable, regTableReplace, html) + soup = BeautifulSoup(html, "html.parser") + text = soup.get_text("\n", strip=True) + text = re.sub(mark1, hTag1, text) + text = re.sub(mark2, hTag2, text) + return text + +def removeHtmlTags(html, exceptionTags=[]): + if len(exceptionTags): + exceptTags = '' + for tag in exceptionTags: + if exceptTags != '': + exceptTags += '|' + exceptTags += '(' + tag + ')' + reg1 = r'<(?P/)*(?P' + exceptTags + ')(?P[^>]+)*>' + html = re.sub(reg1, regTableReplace, html) + + soup = BeautifulSoup(html, "html.parser") + text = soup.get_text("\n", strip=True) + + if len(exceptionTags): + text = re.sub(mark1, hTag1, text) + text = re.sub(mark2, hTag2, text) + + return text + +def read_docx(file_path): + doc = Document(file_path) + full_text = [] + for para in doc.paragraphs: + full_text.append(para.text) + return '\n'.join(full_text) + +def write_docx(text, output_path): + doc = Document() + for line in text.split('\n'): + doc.add_paragraph(line) + doc.save(output_path) + +input_path = 'qavanin.docx' +output_path = 'output.docx' + +html_content = read_docx(input_path) + +clean_text = removeHtmlTags(html_content, exceptionTags=[]) + +write_docx(clean_text, output_path) + +print("تگ‌های HTML با موفقیت حذف شدند و نتیجه در فایل جدید ذخیره شد.") diff --git a/import_data/result_objects.py b/import_data/result_objects.py new file mode 100644 index 0000000..6eebe50 --- /dev/null +++ b/import_data/result_objects.py @@ -0,0 +1,105 @@ +import json +import requests +from decimal import Decimal + +TOKEN = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE3MTg3ODk5OTEsImp0aSI6IlNGaWVOcWIxeEFzZ252QmtvUkxXWU9UbXR2VTNvT3R6IiwiaXNzIjoiaHR0cHM6XC9cL2NwLnRhdmFzaS5pciIsImV4cCI6MTcyMDA4OTk5MCwiYXVkIjoiaHR0cHM6XC9cL2NwLnRhdmFzaS5pciIsImRhdGEiOnsiaWQiOjEsImZpcnN0X25hbWUiOiJcdTA2MjhcdTA2MzFcdTA2NDZcdTA2MjdcdTA2NDVcdTA2NDcgXHUwNjQ2XHUwNjQ4XHUwNmNjXHUwNjMzIiwibGFzdF9uYW1lIjoiXHUwNjQxXHUwNjQ2XHUwNmNjIiwiZW1haWwiOiJkZXZAZ21haWwuY29tIiwidXNlcm5hbWUiOiJkZXYiLCJ1c2VyX2xldmVsIjoyfX0.7DzFqHLee3ZI7EnZYjy5ChtVWhT3QJvBNUbLUdPssSo' +ACCEPT = "application/json" +HEADERS = {"Authorization": TOKEN, "Accept": ACCEPT} + +url = "https://api.tavasi.ir/repo/dataset/multi/add/qasection/keyword" +headers = HEADERS + + +# # باز کردن فایل متنی +# file_path = 'G:/_majles/ner_law_dataset.txt' +# with open(file_path, 'r', encoding='utf-8') as file: +# input_text = file.read() + +# # تبدیل متن به لیستی از خطوط +# lines = input_text.strip().split('\n') + + +file_address = './new_law_excel.xlsx' +# output_file_address = './output/keywords_law_excel.xlsx' +column_name = "content" + +contents = read_from_excel(file_address, column_name) + +contents_list = [] +for index, section in enumerate(contents): + #ner_values = inference_main(model, section) + contents_list.append(section) + # contents_list = contents_list + section + '\n********************\n' + +new_column_name = 'content_keywords' + + + +key = '' +begin = -1 +end = -1 +tokenNumber = -1 +content = '' +result_token = [] + +class JSONEncoder(json.JSONEncoder): + def default(self, obj): + if isinstance(obj, Decimal): + return float(obj) + return json.JSONEncoder.default(self, obj) + + + +# content : main text/content +# results : keywords list +def createIndex(content, extracted_keywords): + result_objects = [{ + "task":"keyword", + "key":"lama3-8b", + "label":"لاما3 فارسی شده", + "values":extracted_keywords + } ] + output ={ + "content": content, + "domain": "مقررات", + "ref_id": "", + "ref_url": "", + "result_objects": result_objects, + } + # print(output) + # print(json.dumps(output, indent=4, ensure_ascii=False)) + return output + +bulk_data = [] +bulk_count = 1 +count = 0 + +for mentry in contents_list: + count += 1 + tokenNumber = tokenNumber + 1 + + + extracted_keywords = [] + + data=createIndex(mentry, extracted_keywords) + bulk_data.append(data) + bulk_count +=1 + if bulk_data.__len__() > 10: + print('=' * 10 ) + print('count' + str(count)) + payload = json.dumps(bulk_data, cls=JSONEncoder) #Works! + response = requests.request("POST", url, headers=headers, data=payload) + print(response.text) + bulk_data = [] + bulk_count = 1 + + +if bulk_data.__len__() > 0: + print(bulk_count) + payload = json.dumps(bulk_data, cls=JSONEncoder) #Works! + response = requests.request("POST", url, headers=headers, data=payload) + print(response.text) + + +# نمایش دیکشنری خروجی به صورت JSON +print("***************** end ") \ No newline at end of file diff --git a/import_data/section_topic_dataset.py b/import_data/section_topic_dataset.py new file mode 100644 index 0000000..3a93976 --- /dev/null +++ b/import_data/section_topic_dataset.py @@ -0,0 +1,97 @@ +import json +import requests +from config_base import * +import requests +from bs4 import BeautifulSoup +from html import escape +import json +from decimal import Decimal +import datetime + + +from config_base import * +from general_functions import * +from funcs import write_to_json + +# موقت +# این برنامه موقتا بخاطر اصلاح داده اجرا شد، اگر از ابتدا انتقال داده انجام شود این بخش خودکار انجام خواهد شد + +cursor, cnxn = create_cursor() + +# Does quasi the same things as json.loads from here: https://pypi.org/project/dynamodb-json/ +class JSONEncoder(json.JSONEncoder): + def default(self, obj): + if isinstance(obj, Decimal): + return float(obj) + return json.JSONEncoder.default(self, obj) + +#نکته : برای مقررات هیچ موردی نبود که جدولی باشد +query = '''SELECT [ID],[CODE],[CAPTION] + FROM [Qavanin].[dbo].[lwTopic] + ''' + +cursor.execute(query) + +headers = HEADERS + +t1= datetime.datetime.now() +print("start time: " + str(t1)) +i = 0 +topic_list = [] +while 1: + + i += 1 + row = cursor.fetchone() + if not row: + break + topic_id = int(row.ID) + caption = str(row.CAPTION) + topic_code = str(row.CODE).strip() + + caption = normalize_content(caption) + + if topic_id == 96: + topic_id = 68, + topic_code = "426" + caption = "آمار و سرشماری" + if topic_id == 61: + topic_id = 60, + topic_code = "418", + caption = "بورس اوراق بهادار و اسناد خزانه " + if topic_id == 126: + topic_id = 149, + topic_code = "104/51", + caption = "وظایف وزارت جهاد کشاورزی" + + if topic_id == 122: + topic_id = 150, + topic_code = "104/52", + caption = "وظایف صنایع و معادن" + + if topic_id == 41: + topic_id= 185, + topic_code= "304/1", + caption= "اتومبیل های دولتی" + + topic_list.append({ + "topic_id" : topic_id, + "topic_code": topic_code, + "caption" : caption, + }) +cursor.close() +cnxn.close() + +address = "./impoert_data/data/section_topic.json" +result = write_to_json(topic_list, address) + +if result: + print("all done correctly!") +else: + print("operation failed!") +print() +t2= datetime.datetime.now() +print("update rows count: " + str(i)) +print("finished time: " + str(t2)) +print("process time: " + str(t2-t1)) +print('*********** end success ***********') + diff --git a/import_data/test_dataset.txt b/import_data/test_dataset.txt new file mode 100644 index 0000000..b437a11 --- /dev/null +++ b/import_data/test_dataset.txt @@ -0,0 +1,268 @@ +بانک B-ORG +مرکزی I-ORG +جمهوری I-ORG +اسلامی I-ORG +ایران I-ORG +موظف O +است O +بازپرداخت O +تعهدات O +ارزی O +را O +کسر O +نماید. O + +ماده B-HALFREFERENCE +3 I-HALFREFERENCE +به O +سازمان B-ORG +مدیریت I-ORG +و I-ORG +برنامه I-ORG +ریزی I-ORG +کشور I-ORG +اجازه O +داده O +می O +شود O +به O +منظور O +تامین O +هزینه O +های O +انجام O +داوری O +توسط O +شورای O +عالی O +فنی O +از O +متقاضیان O +داوری O +در O +مورد O +طرحهای O +عمرانی O +هزینه O +های O +مربوط O +را O +بر O +اساس O +تعرفه O +ای O +که O +به O +تصویب O +هیات O +وزیران O +می O +رسد O +اخذ O +و O +به O +حساب O +درآمد O +عمومی O +واریز O +نماید. O + +ماده B-HALFREFERENCE +5 I-HALFREFERENCE +عملیات O +تامین O +منابع O +ارزی O +و O +متن O +و O +شرایط O +قراردادهای O +مالی O +از O +جمله O +زمان O +بندی O +بازپرداخت O +کلیه O +قراردادهای O +دستگاههای O +اجرایی O +باید O +با O +هماهنگی O +بانک O +مرکزی O +جمهوری O +اسلامی O +ایران O +صورت O +گیرد. O + +ماده B-HALFREFERENCE +6 I-HALFREFERENCE +در O +اجرای O +قانون B-REFERENCE +تشویق I-REFERENCE +و I-REFERENCE +حمایت I-REFERENCE +سرمایه I-REFERENCE +گذاری I-REFERENCE +خارجی I-REFERENCE +مصوب O +19 B-DATE2 +/12 I-DATE2 +/1380 I-DATE2 +به O +منظور O +جلب O +سرمایه O +گذاری O +خارجی O +به O +دولت O +اجازه O +داده O +می O +شود O +در O +چارچوب O +قانون B-REFERENCE +تشویق I-REFERENCE +و I-REFERENCE +حمایت I-REFERENCE +سرمایه I-REFERENCE +گذاری I-REFERENCE +خارجی I-REFERENCE +مصوب O +19 B-DATE2 +/12 I-DATE2 +/1380: I-DATE2 +اقدام O +نماید O + +ماده B-HALFREFERENCE +8 I-HALFREFERENCE +دولت O +مکلف O +است O +در O +خصوص O +بهینه O +سازی O +مصرف O +انرژی O +به O +کشاورزانی O +که O +برای O +برقی O +کردن O +موتور O +پمپ O +چاههای O +کشاورزی O +خود O +اقدام O +می O +نمایند O +از O +طریق O +بانک O +کشاورزی O +تسهیلات O +لازم O +را O +در O +اختیارشان O +قرار O +دهد. O + +ماده B-HALFREFERENCE +13 I-HALFREFERENCE +در O +اجرای O +بند O +(ح) O +ماده B-HALFREFERENCE +(33) I-HALFREFERENCE +قانون B-REFERENCE +برنامه I-REFERENCE +چهارم I-REFERENCE +توسعه I-REFERENCE +اقتصادی I-REFERENCE +اجتماعی I-REFERENCE +و I-REFERENCE +فرهنگی I-REFERENCE +جمهوری I-REFERENCE +اسلامی I-REFERENCE +ایران I-REFERENCE +به O +دولت O +اجازه O +داده O +می O +شود O +به O +پیشنهاد O +وزیر O +صنعت O +معدن O +و O +تجارت O +به O +شرح O +زیر O +اقدام O +نماید: O + +1 O +از O +محصولات O +خارجی O +که O +با O +قیمت O +غیرمتعارف O +و O +یا O +تسهیلات O +غیرعادی O +به O +کشور O +وارد O +می O +شوند O +مابه O +التفاوت O +اخذ O +نماید. O + +ماده B-HALFREFERENCE +16 I-HALFREFERENCE +در O +ماده B-HALFREFERENCE +(92) I-HALFREFERENCE +قانون B-REFERENCE +تنظیم I-REFERENCE +بخشی I-REFERENCE +از I-REFERENCE +مقررات I-REFERENCE +مالی I-REFERENCE +دولت I-REFERENCE +مصوب O +27 B-DATE2 +/11 I-DATE2 +/1380 I-DATE2 +عبارت O +«درآمد O +عمومی» O +به O +عبارت O +«درآمد O +اختصاصی» O +اصلاح O +می O +گردد. O + \ No newline at end of file