Сравнение текстовых документов в Python: NLP и сходство

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для подсчета сходства текстовых документов часто применяется метод косинусного сходства. При этом текстовые данные преобразуются в векторы TF-IDF, для обработки данных можно использовать библиотеку sklearn в Python:

Python
Скопировать код
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

# Компактное решение для векторизации и косинусного сходства
documents = ['Текст документа 1', 'Текст документа 2']
vectorizer = TfidfVectorizer()
matrix = vectorizer.fit_transform(documents)
similarity = cosine_similarity(matrix)

print(f"Уровень схожести: {similarity[0][1]}")

Результат – цифра от 0 (нет сходства) до 1 (абсолютное совпадение). Такой код позволяет получать результаты моментально.

Кинга Идем в IT: пошаговый план для смены профессии

Обработка "больших данных"

При работе с большими массивами текстов незаменимы разреженные матрицы, позволяющие сократить используемую память и ускорить вычисления. Scikit-learn по умолчанию создает разреженные матрицы TF-IDF, что очень удобно при обработке больших объемов данных.

Предобработка текста

Чтобы тексты были более схожими, необходимо провести их предварительную обработку: привести все к нижнему регистру, выполнить стемминг и удалить пунктуацию:

Python
Скопировать код
import nltk
from nltk.stem.porter import PorterStemmer
from sklearn.feature_extraction.text import ENGLISH_STOP_WORDS

stemmer = PorterStemmer()
def preprocess(text):
    text = text.lower()
    tokens = nltk.word_tokenize(text)
    tokens = [stemmer.stem(token) for token in tokens if token not in ENGLISH_STOP_WORDS]
    return ' '.join(tokens)

processed_docs = [preprocess(doc) for doc in documents]

Учет семантики

Контекст играет важную роль для определения схожести текстов. Использование языковых моделей, таких как spaCy, и Универсального Кодировщика Предложений от Google, способствует повышению качества определения схожести:

Python
Скопировать код
import spacy

# Загрузка продвинутой модели spaCy
nlp = spacy.load('en_core_web_lg')
doc1 = nlp(processed_docs[0])
doc2 = nlp(processed_docs[1])

print(f"Оценка схожести с учетом контекста: {doc1.similarity(doc2)}")

Для работы с нейронными сетями:

Python
Скопировать код
import tensorflow_hub as hub

encoder = hub.load("https://tfhub.dev/google/universal-sentence-encoder/2")
embeddings = encoder(processed_docs)
similarity_deep = cosine_similarity(embeddings)

print(f"Оценка схожести на основе глубокого обучения: {similarity_deep[0][1]}")

Визуализация

Представьте себе, что документы – это элементы общего пазла:

Markdown
Скопировать код
Паззл A (🧩📃): [🧩1, 🧩2, 🧩3]
Паззл B (🧩📄): [🧩2, 🧩3, 🧩4]

**Совпадают**: [🧩2, 🧩3] => **Чем больше общих элементов, тем выше степень схожести**!

Работа с Gensim

При работе с большим объемом текстов Gensim поможет сравнивать и кластеризовать данные:

Python
Скопировать код
from gensim.similarities import MatrixSimilarity
from gensim.models import TfidfModel
from gensim.corpora.dictionary import Dictionary

corpus_dict = Dictionary(processed_docs)
corpus = [corpus_dict.doc2bow(text) for text in processed_docs]

tfidf = TfidfModel(corpus)
index = MatrixSimilarity(tfidf[corpus])

query = preprocess('ваш поисковый запрос')
query_bow = corpus_dict.doc2bow(query.split())
similarity_list = index[tfidf[query_bow]]

most_similar_docs = sorted(enumerate(similarity_list), key=lambda item: -item[1])

Демонстрация результатов

Тепловая карта поможет наглядно представить матрицу сходства:

Python
Скопировать код
import seaborn as sns
import matplotlib.pyplot as plt

sns.heatmap(similarity, annot=True)
plt.show()

Полезные материалы