Согласно предыдущей статье серии, мы уже поняли основные концепции графов знаний, а также текущий статус развития графов знаний и направление интеграции с передовым искусственным интеллектом. Теперь единственный шаг — это построить граф знаний. По сути, вы получите более четкое представление о продукте графа знаний.
Поэтому, если вы хотите хорошо выполнять свою работу, вам необходимо сначала отточить свои инструменты. Как и в случае с нашим знанием языков программирования, более продвинутое использование и навыки могут еще больше улучшить качество наших проектных продуктов. В этой статье мы будем использовать их с самого начала. среда разработки Напишите о практике построения базового графа знаний и завершите процесс построения графа знаний с нуля.
Извлечение информации Экстракция, короче IE) — это сборка График Одним из основных шагов в области знаний является автоматическое извлечение значимой структурированной информации из неструктурированных текстовых данных, включая сущности, отношения и события. извлечение информации В основном он разделен на следующие этапы:Извлечение сущности、Извлечение отношений、Извлечение атрибутовиизвлечение событий,На каждом этапе используются разные методы и инструменты.
Что касается инструмента извлечения информации, я использую модель UIE PaddleNLP. Яоджи Лу и др. предложили единую структуру для общего извлечения информации UIE в ACL-2022. Эта среда реализует унифицированное моделирование таких задач, как извлечение сущностей, извлечение отношений, извлечение событий и анализ настроений, а также обеспечивает хорошие возможности переноса и обобщения между различными задачами.
Что касается инструмента извлечения информации, я использую модель UIE PaddleNLP. Яоджи Лу и др. предложили единую структуру для общего извлечения информации UIE в ACL-2022. Эта среда реализует унифицированное моделирование таких задач, как извлечение сущностей, извлечение отношений, извлечение событий и анализ настроений, а также обеспечивает хорошие возможности переноса и обобщения между различными задачами.Вот краткое введениеUIE。
UIE (Universal Information Extraction) — это технология обработки естественного языка, основанная на глубоком обучении, предназначенная для автоматического извлечения ценной информации из неструктурированного текста. Он объединяет различные задачи извлечения информации, включая распознавание сущностей, извлечение взаимосвязей, извлечение событий и т. д., чтобы сформировать единую структуру.
UIE в основном включает в себя следующие подзадачи:
Внедрить модуль извлечения информации из графа знаний на основе модели PaddleNLP-UIE:
! pip install --upgrade paddlenlp
! pip show paddlenlp
Извлечение объектов, также известное как распознавание именованных объектов (NER, Named Entity Recognition), предназначено для идентификации конкретных типов именных фраз из текста, обычно слов с реальным значением, таких как имена людей, географические названия, организации, даты, продукты и технические данные. существительные подождите. Целью извлечения сущностей является структурирование важных информационных точек в тексте для последующего анализа и хранения.
В качестве примера возьмем текстовые данные:
schema = ['время', 'Город'] # Define the schema for entity extraction
ie = Taskflow('information_extraction', schema=schema, model='uie-base')
ie_en = Taskflow('information_extraction', schema=schema, model='uie-base-en')
pprint(ie("Все строительные конкурсы, по которым проекты жилищного строительства и муниципальной инфраструктуры инвестировались за счет государственных средств в нашем городе (включая уезды (районы) и зоны застройки (новые районы)) с 3 июня 2017 года выдали тендерную документацию, должен Положения «Уведомления Главного управления муниципального народного правительства Наньчана о выпуске системы обеспечения ежегодных тендерных заявок (испытательной) для торгов по инвестиционно-строительному проекту государственного фонда Наньчана» (Hongfu Tingfa [2016] № 74) » )). # Better print results using pprint
[{'Город': [{'end': 71,
'probability': 0.9465240012183784,
'start': 68,
'text': «Город Наньчан»},
{'end': 85,
'probability': 0.9736215907851147,
'start': 82,
'text': «Город Наньчан»}],
'время': [{'end': 48,
'probability': 0.5193512646392762,
'start': 39,
'text': '3 июня 2017'}]}]
Связь Экстракция, корочеRE),Это относится к идентификации сущностей из текста и извлечению семантических связей между сущностями.,Затем получите информацию о тройке,Прямо сейчас<основная часть,предикат,объект>。Извлечение отношенийцельсуществовать Идентифицировать два или более объекта в текстемеждусвязь。например,Определите «основательные» отношения в «Alibaba была основана Джеком Ма».,Ссылка «Джек Ма» и «Алибаба».
schema = {'Отдел':['Руководство','Название деятельности']}
ie.set_schema(schema)
txt_file='Отдел развития и реформ Государственного совета направляет и координирует национальные торги и конкурсную работу, а также контролирует и проверяет инженерные торги и тендерную деятельность по крупным национальным строительным проектам. '
pprint(ie(txt_file))
[{'отделение': [{'end': 9,
'probability': 0.9600018973785609,
'relations': {'гид': [{'end': 22,
'probability': 0.9368320465242093,
'start': 14,
'text': «Национальные торги и тендеры»}]},
'start': 0,
'text': «Департамент развития и реформ Госсовета»}]}]
Извлечение атрибутов заключается в идентификации и извлечении соответствующих значений атрибутов сущностей. Например, укажите дату основания компании, характеристики продукции, участников мероприятия и т. д.
schema = {'Компания':['Основатель','Время основания','Место']}
ie.set_schema(schema)
txt_file='Alibaba Group Holdings Co., Ltd. (аббревиатура: Alibaba Group) — компания, основанная в 1999 году в Ханчжоу, провинция Чжэцзян, 18 основателями под руководством Джека Ма. '
pprint(ie(txt_file))
[{'компания': [{'end': 12,
'probability': 0.8997031190817637,
'relations': {'Основатель': [{'end': 26,
'probability': 0.7737946618519764,
'start': 24,
'text': 'Джек Ма'}],
'Место': [{'end': 49,
'probability': 0.3552619337063625,
'start': 43,
'text': 'Город Ханчжоу, провинция Чжэцзян'}],
«Время установления»: [{'end': 42,
'probability': 0.8343506849196594,
'start': 37,
'text': '1999'}]},
'start': 0,
'text': 'Alibaba Group Holdings Limited'}]}]
Извлечение событий — это идентификация и извлечение сложных структур событий из текста. Например, «Alibaba» идентифицируется как субъект из «В 2020 году Alibaba объявила о запуске нового плана розничной торговли», событие — «начало», время — «2020», а объект — «новый план розничной торговли». ".
schema = {'Начало':['время','Объект']}
ie.set_schema(schema)
txt_file='В 2020 году Alibaba объявила о запуске нового розничного плана'
pprint(ie(txt_file))
[{'запускать': [{'end': 19,
'probability': 0.975417622363075,
'relations': {'время': [{'end': 5,
'probability': 0.9598323070613546,
'start': 0,
'text': '2020'}]},
'start': 14,
'text': «Новый розничный план»}]}]
Итак, мы понимаем метод извлечения, а затем нам нужно составить общий пакет для наших данных:
import paddlehub as hub
import json
from collections import defaultdict
from docx import Document
import jieba.posseg as pseg
from paddlenlp import Taskflow
def extract_text_from_docx(docx_path):
document = Document(docx_path)
return [paragraph.text.strip() for paragraph in document.paragraphs if paragraph.text.strip()]
def split_paragraphs_into_sections(paragraphs):
sections = defaultdict(list)
current_section = "другой"
for paragraph in paragraphs:
if «Тендерный тип» in paragraph:
current_section = «Тендерный тип»
elif «Метод организации тендеров» in paragraph:
current_section = «Метод организации тендеров»
elif «Требования к проекту» in paragraph:
current_section = «Требования к проекту»
sections[current_section].append(paragraph)
return sections
def generate_schema_from_sections(sections):
section_schemas = {}
for section, paragraphs in sections.items():
entity_candidates = defaultdict(int)
relation_candidates = defaultdict(int)
for paragraph in paragraphs:
words = pseg.cut(paragraph)
for word, flag in words:
if flag in ['n', 'nr', 'ns', 'nt', 'nz']:
entity_candidates[word] += 1
elif flag in ['v']:
relation_candidates[word] += 1
top_relations = sorted(relation_candidates, key=relation_candidates.get, reverse=True)[:10]
schema = {}
for entity in entity_candidates:
schema[entity] = top_relations
section_schemas[section] = schema
return section_schemas
def process_text_with_uie_by_sections(sections, ie_model, section_schemas):
extracted_info = {}
for section, paragraphs in sections.items():
schema = section_schemas.get(section, {})
ie_model.set_schema(schema)
section_info = []
for paragraph in paragraphs:
extraction_result = ie_model(paragraph)
section_info.append(extraction_result)
extracted_info[section] = section_info
return extracted_info
def save_extracted_info_to_json(extracted_info, output_path):
with open(output_path, 'w', encoding='utf-8') as f:
json.dump(extracted_info, f, ensure_ascii=False, indent=4)
def main():
docx_path = 'данные/Базовые знания в области торгов и закупок.docx' # Replace with your actual file path
output_json_path = 'data/extracted_info.json' # Replace with your output path
paragraphs = extract_text_from_docx(docx_path)
sections = split_paragraphs_into_sections(paragraphs)
section_schemas = generate_schema_from_sections(sections)
print(f"Generated Schemas: {section_schemas}")
ie_model = Taskflow('information_extraction', model='uie-base') # Load PaddleHub UIE model
extracted_info = process_text_with_uie_by_sections(sections, ie_model, section_schemas)
save_extracted_info_to_json(extracted_info, output_json_path)
print(f"Extracted information and saved to {output_json_path}")
if __name__ == "__main__":
main()
Получите соответствующий json-файл:
Мы обучаем базовую версию UIE в Taskflow с помощью большого количества помеченных образцов, но эффект извлечения UIE в некоторых подполях не является удовлетворительным. UIE может быстро улучшить эффект с помощью небольших выборок. Почему UIE может улучшить результаты за счет небольших выборок? Метод моделирования UIE в основном заключается в Prompt
способ моделирования, Prompt
Точная настройка на небольших выборках очень эффективна. Ниже рассмотрим конкретный случай. Чтобы продемонстрировать эффект тонкой настройки UIE.
Сначала нам нужно установить:
pip3 install setuptools_scm -i https://pypi.tuna.tsinghua.edu.cn/simple
Поскольку этот плагин может сообщать об ошибке, если он не установлен отдельно, установите doccano позже:
pip3 install doccano -i https://pypi.tuna.tsinghua.edu.cn/simple
Инициализировать базу данных и учетную запись(имя пользователяи Пароль можно заменитьдляпользовательское значение)
$ doccano init
$ doccano createuser --username fanstuck --password xwt353008
Начать документацию
$ doccano webserver --port 8000
$ doccano task
Шаг 4. Запустите doccano для аннотирования объектов и связей.
Откройте браузер (рекомендуется Chrome),существоватьв адресной строкевходитьhttp://127.0.0.1:8000/
Затем нажмите EnterПрямо сейчас Получите следующий интерфейс。
Вход в аккаунт。Нажмите на правый верхний уголLOGIN
,входитьStep 2中设置的имя пользователяи Пароль для входа。
Создать проект。Нажмите на верхний левый уголCREATE
,Перейдите к следующему интерфейсу.
Sequence Labeling
)Project name
)等必要信息Allow overlapping entity
)、использоватьсвязьотметка(Use relation labeling
)Установить ярлык。существоватьLabelsНажмите на столбецActions
,Create Label
Установить вручную илиImport Labels
импорт из файла。
Импортировать данные。существоватьDatasetsНажмите на столбецActions
、Import Dataset
импорт из файлатекстовые данные。
Annotate
кнопка начала тега。Тип тега в правой части страницы тегов(Label Типы) для переключения между тегами сущностей и тегами отношений.
Экспортировать данные。существоватьDatasetsНажмите на столбецActions
、Export Dataset
Экспортированоотметка的данные。
Преобразуйте данные аннотаций в данные, необходимые для обучения UIE.
Запустите следующий код, чтобы преобразовать данные аннотации в данные, необходимые для обучения UIE.
! python preprocess.py --input_file ./data/test.jsonl --save_dir ./data/ --negative_ratio 5 --splits 0.2 0.8 0.0 --seed 1000
./checkpoint/
Оглавление。tips: рекомендоватьиспользоватьGPUсреда,В противном случае может произойти переполнение памяти. В среде ЦП,Может быть измененmodelдляuie-tiny
,Отрегулируйте пакетный_размер соответствующим образом.
! python finetune.py --train_path ./data/train.txt --dev_path ./data/dev.txt --save_dir ./checkpoint --model uie-base --learning_rate 1e-5 --batch_size 16 --max_seq_len 512 --num_epochs 50 --seed 1000 --logging_steps 10 --valid_steps 10
Теперь мы в основном завершили небольшую часть обучения кейсу. В следующей главе мы отобразим граф знаний в базе данных.