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())

TF-IDF-Methode

Beispiel

from sklearn.feature_extraction.text import TfidfVectorizer

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

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)

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

Ä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)

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)

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

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"

3. Ähnlichkeitsberechnung für lange Texte


Best-Practice-Empfehlungen

  1. Datenvorverarbeitung ist wichtig

    • Groß-/Kleinschreibung normalisieren
    • Stoppwörter entfernen
    • Stemming / Lemmatisierung
  2. Methoden je nach Szenario auswählen

    • Kurze Texte: vortrainierte Modelle wie BERT
    • Lange Dokumente: TF-IDF + Kosinusähnlichkeit
    • Echtzeitsysteme: leichtgewichtige Modelle wie Word2Vec
  3. 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
  4. Kontinuierliche Evaluierung und Optimierung

    • Ein manuelles Evaluierungsset erstellen
    • Leistung in Produktionsumgebungen überwachen
    • Modelle regelmäßig aktualisieren

Empfohlene Lernressourcen

  1. Offizielle Gensim-Dokumentation
  2. Hugging Face Transformers-Bibliothek
  3. Scikit-learn-Tutorial zur Textverarbeitung
  4. BERT-Paper "Attention Is All You Need"
Andere Erweiterungen