NLP-Textähnlichkeitsberechnung
Die Textähnlichkeitsberechnung ist eine grundlegende Aufgabe der Verarbeitung natürlicher Sprache (NLP), mit dem Ziel, den Grad der Ähnlichkeit zwischen zwei Textabschnitten zu quantifizieren. Diese Technologie wird in verschiedenen Bereichen wie Informationssuche, Frage-Antwort-Systemen, Plagiatserkennung und Empfehlungssystemen weit verbreitet eingesetzt.
Kernkonzepte
- Semantische Ähnlichkeit: Misst, wie nahe sich Texte in ihrer Bedeutung sind
- Wörtliche Ähnlichkeit: Misst den Grad der Überlappung im Oberflächenvokabular von Texten
- Vektorraummodell: Stellt Texte als Vektoren in einem hochdimensionalen Raum dar
- Distanzmetriken: Berechnet die Distanz oder Ähnlichkeit zwischen Vektoren
Gängige Methoden zur Berechnung der Textähnlichkeit
1. Wortfrequenzbasierte Methoden
Bag-of-Words-Modell
Beispiel
from sklearn.feature_extraction.text import CountVectorizer
Korpus = [
'Ich mag die Verarbeitung natürlicher Sprache',
'Ich liebe es, NLP-Technologie zu lernen',
'Die Berechnung der Textähnlichkeit ist sehr interessant'
]
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus)
print(X.toarray())
Korpus = [
'Ich mag die Verarbeitung natürlicher Sprache',
'Ich liebe es, NLP-Technologie zu lernen',
'Die Berechnung der Textähnlichkeit ist sehr interessant'
]
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus)
print(X.toarray())
TF-IDF-Methode
Beispiel
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer()
tfidf_matrix = tfidf.fit_transform(corpus)
print(tfidf_matrix.toarray())
tfidf = TfidfVectorizer()
tfidf_matrix = tfidf.fit_transform(corpus)
print(tfidf_matrix.toarray())
2. Wortvektorbasierte Methoden
Word2Vec-Ähnlichkeit
Beispiel
from gensim.models import Word2Vec
sentences = [
['I','like','natural language processing'],
['I','love','learning','NLP','technology'],
['text','similarity','calculation','very','interesting']
]
model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, workers=4)
vector = model.wv['natural language processing'] # Wortvektoren abrufen
sentences = [
['I','like','natural language processing'],
['I','love','learning','NLP','technology'],
['text','similarity','calculation','very','interesting']
]
model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, workers=4)
vector = model.wv['natural language processing'] # Wortvektoren abrufen
Berechnung des Satzvektors
Beispiel
import numpy as np
def sentence_vector(sentence, model):
vectors = [model.wv[word] for word in sentence if word in model.wv]
return np.mean(vectors, axis=0) if vectors else np.zeros(model.vector_size)
sentence_vec1 = sentence_vector(['I','like','natural language processing'], model)
sentence_vec2 = sentence_vector(['I','love','NLP'], model)
def sentence_vector(sentence, model):
vectors = [model.wv[word] for word in sentence if word in model.wv]
return np.mean(vectors, axis=0) if vectors else np.zeros(model.vector_size)
sentence_vec1 = sentence_vector(['I','like','natural language processing'], model)
sentence_vec2 = sentence_vector(['I','love','NLP'], model)
3. Vortrainierte modellbasierte Methoden
BERT-Ähnlichkeitsberechnung
Beispiel
from transformers import BertTokenizer, BertModel
import torch
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
model = BertModel.from_pretrained('bert-base-chinese')
inputs = tokenizer("This is an example sentence", return_tensors="pt")
outputs = model(**inputs)
last_hidden_states = outputs.last_hidden_state
import torch
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
model = BertModel.from_pretrained('bert-base-chinese')
inputs = tokenizer("This is an example sentence", return_tensors="pt")
outputs = model(**inputs)
last_hidden_states = outputs.last_hidden_state
Ähnlichkeitsmetriken
Gängige Distanzmetriken
| Methodenname | Formel | Eigenschaften |
|---|---|---|
| Kosinus-Ähnlichkeit | cos(θ) = (A·B)/(|A||B|) | Ignoriert die Vektorlänge, konzentriert sich auf die Richtung |
| Euklidische Distanz | √Σ(Ai-Bi)² | Berücksichtigt die absolute Position von Vektoren |
| Manhattan-Distanz | Σ|Ai-Bi| | Nicht empfindlich gegenüber Ausreißern |
| Jaccard-Ähnlichkeit | |A∩B|/|A∪B| | Geeignet für Mengenähnlichkeit |
Code-Implementierungsbeispiele
Beispiel
from sklearn.metrics.pairwise import cosine_similarity
# Kosinusähnlichkeit berechnen
similarity = cosine_similarity(tfidf_matrix[0:1], tfidf_matrix[1:2])
print(f"Textähnlichkeit: {similarity)
# Kosinusähnlichkeit berechnen
similarity = cosine_similarity(tfidf_matrix[0:1], tfidf_matrix[1:2])
print(f"Textähnlichkeit: {similarity)
Praktische Anwendungsbeispiele
Ähnlichkeitserkennung von Nachrichtenschlagzeilen
Beispiel
import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity
# Beispieldaten
titles = [
"Apple veröffentlicht neues iPhone",
"Apple Inc. startet das neueste Smartphone",
"Microsoft kündigt Quartalsergebnisbericht an",
"Google kündigt neuen Plan für künstliche Intelligenz an"
]
# Ähnlichkeitsmatrix berechnen
tfidf = TfidfVectorizer()
tfidf_matrix = tfidf.fit_transform(titles)
similarities = cosine_similarity(tfidf_matrix)
# Ergebnisse anzeigen
df = pd.DataFrame(similarities, columns=titles, index=titles)
print(df)
from sklearn.metrics.pairwise import cosine_similarity
# Beispieldaten
titles = [
"Apple veröffentlicht neues iPhone",
"Apple Inc. startet das neueste Smartphone",
"Microsoft kündigt Quartalsergebnisbericht an",
"Google kündigt neuen Plan für künstliche Intelligenz an"
]
# Ähnlichkeitsmatrix berechnen
tfidf = TfidfVectorizer()
tfidf_matrix = tfidf.fit_transform(titles)
similarities = cosine_similarity(tfidf_matrix)
# Ergebnisse anzeigen
df = pd.DataFrame(similarities, columns=titles, index=titles)
print(df)
Ergebnisanalyse
苹果发布新款iPhone手机 苹果公司推出最新智能手机 微软公布季度财报 谷歌宣布新的人工智能计划 苹果发布新款iPhone手机 1.000000 0.723417 0.000000 0.000000 苹果公司推出最新智能手机 0.723417 1.000000 0.000000 0.000000 微软公布季度财报 0.000000 0.000000 1.000000 0.204598 谷歌宣布新的人工智能计划 0.000000 0.000000 0.204598 1.000000
Fortgeschrittene Techniken und Herausforderungen
1. Umgang mit Texten mit ähnlicher Semantik, aber unterschiedlichem Vokabular
Beispiel
text1 = "Ich mag Katzen"
text2 = "Ich hasse Hunde"
# Die oberflächliche Ähnlichkeit ist gering, aber beide drücken semantisch Haltungen gegenüber Tieren aus
text2 = "Ich hasse Hunde"
# Die oberflächliche Ähnlichkeit ist gering, aber beide drücken semantisch Haltungen gegenüber Tieren aus
2. Das Polysemieproblem lösen
Beispiel
# "Apple" kann sich auf eine Frucht oder ein Unternehmen beziehen
text1 = "Der Apfel ist sehr süß"
text2 = "Apples Marktwert erreicht einen neuen Höchststand"
text1 = "Der Apfel ist sehr süß"
text2 = "Apples Marktwert erreicht einen neuen Höchststand"
3. Ähnlichkeitsberechnung für lange Texte

Best-Practice-Empfehlungen
Datenvorverarbeitung ist wichtig
- Groß-/Kleinschreibung normalisieren
- Stoppwörter entfernen
- Stemming / Lemmatisierung
Methoden je nach Szenario auswählen
- Kurze Texte: vortrainierte Modelle wie BERT
- Lange Dokumente: TF-IDF + Kosinusähnlichkeit
- Echtzeitsysteme: leichtgewichtige Modelle wie Word2Vec
Recheneffizienz berücksichtigen
- Approximate-Nearest-Neighbor-(ANN)-Algorithmen für große Datenmengen verwenden
- Die Verwendung effizienter Bibliotheken für die Ähnlichkeitssuche wie Faiss in Betracht ziehen
Kontinuierliche Evaluierung und Optimierung
- Ein manuelles Evaluierungsset erstellen
- Leistung in Produktionsumgebungen überwachen
- Modelle regelmäßig aktualisieren