Извлечь фразы/ключевые слова, которые ПОДОБНЫ списку ключевых слов/фраз на Python, из документа.

Вопрос или проблема

ИЗМЕНЕНИЕ : Если бы мне нужно было сопоставить односоставные фразы, я мог бы сначала токенизировать текст из документа, а затем рассчитать косинусное сходство всех токенов со всеми ключевыми словами из keyword_list. Но проблема в том, что у меня могут быть односоставные или многосоставные ключевые фразы в keyword_list. Даже если я попробую использовать ngrams, как мне знать, какую длину ngrams использовать?

Я искал и читал множество статей/вопросов по этому поводу, но не смог найти решения.

Формулировка проблемы : Я пытаюсь извлечь похожие ключевые слова/фразы из документа на основе заранее установленного списка ключевых слов/фраз.

Например, ниже приведен список:

keyword_list = ['ваша работа', 'текущие операции', 'завершенные операции', 'ваше имя', 'телесные повреждения', 'ущерб имуществу', 
     'в пределах, разрешенных законом', 'требуется по контракту или соглашению']

У меня также есть текст, который я извлек из документов с помощью OCR. Предположим, текст следующий:

text = "В свете ваших текущих операций, ваше имя является приближением ваших рабочий моделей. Контракт требует, чтобы ущерб, нанесенный имуществу, несла обе стороны, в соответствии с законом." 

Теперь я хочу извлечь все ключевые слова/фразы, которые встречаются в keyword_list. Кроме того, я также хочу извлечь похожие ключевые фразы (под «похожими» я имею в виду похожие по контексту или значению, но сформулированные иначе). Таким образом, логика/модель должны иметь возможность извлекать следующие термины:

output = ["текущие операции", "ваше имя", "ваша работа", "Контракт требует", "ущерб, нанесенный имуществу", "в соответствии с законом"]

Мы видим, что текущие операции и ваше имя присутствуют в keyword_list, и, следовательно, извлекаются.

Но ваша работа, Контракт требует, ущерб, нанесенный имуществу, в соответствии с законом также извлекаются, потому что они имеют то же значение/контекст, что и ваша работа, требуется по контракту или соглашению, ущерб имуществу, в пределах, разрешенных законом.

Для полностью совпадающих фраз (текущие операции и ваше имя) я написал логику, которая использует регулярные выражения для сопоставления фраз. Но для фраз, которые имеют то же значение/контекст, но сформулированы иначе, я не знаю, как действовать. Я думаю, что машинное обучение или подход глубокого обучения будут подходящими здесь, но я не знаю, какой именно подход!

Любая помощь будет высоко оценена!

Вы можете использовать библиотеку sentence transformer, чтобы рассчитать сходство между различными фразами. Она также работает для многосоставных токенов.

from sentence_transformers import SentenceTransformer, util
import compress_fasttext
import numpy as np

mpnet_v2 = SentenceTransformer('all-mpnet-base-v2')

sentence1 = "ущерб имуществу"
sentence2 = "ущерб, нанесенный имуществу"

# кодируем предложения, чтобы получить их эмбеддинги
embeb_r_large1 = mpnet_v2.encode(sentence1, convert_to_tensor=True)

# вычисляем коэффициенты сходства двух эмбеддингов
mpnetv2_score = util.pytorch_cos_sim(embeb_r_large1, embeb_r_large2)

print(f'коэффициент сходства : {mpnetv2_score}')

#результат
#коэффициент сходства : 0.8635872602462769

Ответ или решение

Чтобы извлечь ключевые слова и фразы из документа, которые похожи на предварительно заданный список ключевых слов, требуется многоуровневый подход, который включает как прямое сопоставление, так и оценку семантической схожести. В данном ответе подробно рассмотрим, как можно реализовать этот процесс, начиная с простой идентификации и заканчивая использованием более сложных методов на основе машинного обучения.

1. Прямое сопоставление

Первый шаг — это прямое сопоставление ключевых фраз из документа с вашим списком keyword_list. Для этого вы можете использовать регулярные выражения (regex), что позволит извлечь фразы, содержащие точные совпадения. Вот пример:

import re

keyword_list = ['your work', 'ongoing operations', 'completed operations', 'your name', 
                'bodily injury', 'property damage', 
                'to the extent permitted by law', 'is required by a contract or agreement']

text = "In light of your ongoing operations, your name is an approximation of your working models. The contract requires that the damage done to the property must be borne by both the parties, as permitted by the law."

# Поиск точных совпадений с использованием регулярных выражений
extracted_phrases = []
for keyword in keyword_list:
    if re.search(r'\b' + re.escape(keyword) + r'\b', text):
        extracted_phrases.append(keyword)

print(extracted_phrases)

2. Семантическая схожесть

Для идентификации схожих по смыслу фраз, которые не совпадают с ключевыми словами, можно использовать методы машинного обучения, такие как вычисление векторных представлений фраз (embeddings). Одним из наиболее эффективных подходов является использование библиотеки Sentence Transformers.

Пример кода для извлечения семантически похожих фраз

from sentence_transformers import SentenceTransformer, util

# Инициализация модели
model = SentenceTransformer('all-mpnet-base-v2')

# Обработка фраз из keyword_list
keyword_embeddings = model.encode(keyword_list, convert_to_tensor=True)

# Разделение текста на предложения
sentences = text.split('. ')

# Инициализация списка для извлеченных схем и их оценка
output = []

for sentence in sentences:
    # Генерация векторного представления для нашего предложения
    sentence_embedding = model.encode(sentence, convert_to_tensor=True)

    # Вычисление схожести с каждой фразой из keyword_list
    cosine_scores = util.pytorch_cos_sim(sentence_embedding, keyword_embeddings)

    # Установление порога схожести
    threshold = 0.7  # Это значение может быть изменено в зависимости от требований
    for idx, score in enumerate(cosine_scores[0]):
        if score >= threshold:
            output.append(sentence.strip())
            break  # Проходим к следующему предложению

print(output)

Возможные улучшения и уточнения

  1. Настройка порога: Значение порога (в данном случае 0.7) можно настроить в зависимости от желаемого уровня строгости при отборе схожих фраз.
  2. Предобработка текста: Можно добавить дополнительные этапы предобработки текста, такие как удаление стоп-слов, лемматизация и нормализация для повышения качества результатов.
  3. Обучение модели: Рассмотрите возможность дообучения модели на собственном наборе данных, чтобы повысить её точность в вашей специфической области.

Заключение

Комбинирование прямого сопоставления фраз с машинным обучением для извлечения семантически похожих выражений предоставляет мощный инструмент для анализа текста. Используя комбинацию этих методов, вы сможете успешно извлекать ключевые слова и фразы, которые соответствуют вашим требованиям. Создание такой системы может потребовать начального вложения времени и ресурсов, но в долгосрочной перспективе оно окупится улучшением качества анализа и понимания текста.

Оцените материал
Добавить комментарий

Капча загружается...