Сравнение текстовых документов в Python: NLP и сходство
Быстрый ответ
Для подсчета сходства текстовых документов часто применяется метод косинусного сходства. При этом текстовые данные преобразуются в векторы TF-IDF, для обработки данных можно использовать библиотеку sklearn в 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 (абсолютное совпадение). Такой код позволяет получать результаты моментально.
Обработка "больших данных"
При работе с большими массивами текстов незаменимы разреженные матрицы, позволяющие сократить используемую память и ускорить вычисления. Scikit-learn
по умолчанию создает разреженные матрицы TF-IDF, что очень удобно при обработке больших объемов данных.
Предобработка текста
Чтобы тексты были более схожими, необходимо провести их предварительную обработку: привести все к нижнему регистру, выполнить стемминг и удалить пунктуацию:
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, способствует повышению качества определения схожести:
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)}")
Для работы с нейронными сетями:
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]}")
Визуализация
Представьте себе, что документы – это элементы общего пазла:
Паззл A (🧩📃): [🧩1, 🧩2, 🧩3]
Паззл B (🧩📄): [🧩2, 🧩3, 🧩4]
**Совпадают**: [🧩2, 🧩3] => **Чем больше общих элементов, тем выше степень схожести**!
Работа с Gensim
При работе с большим объемом текстов Gensim поможет сравнивать и кластеризовать данные:
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])
Демонстрация результатов
Тепловая карта поможет наглядно представить матрицу сходства:
import seaborn as sns
import matplotlib.pyplot as plt
sns.heatmap(similarity, annot=True)
plt.show()