Rumah > pembangunan bahagian belakang > Tutorial Python > Algoritma Kesamaan Hibrid

Algoritma Kesamaan Hibrid

Linda Hamilton
Lepaskan: 2025-01-21 22:17:09
asal
478 orang telah melayarinya

HybridSimilarity Algorithm

Menyelami Algoritma Keserupaan Hibrid

Artikel ini meneroka algoritma HybridSimilarity, rangkaian saraf canggih yang direka untuk menilai persamaan antara pasangan teks. Model hibrid ini dengan bijak menyepadukan perbandingan leksikal, fonetik, semantik dan sintaksis untuk skor persamaan yang menyeluruh.

import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.decomposition import TruncatedSVD
from sentence_transformers import SentenceTransformer
from Levenshtein import ratio as levenshtein_ratio
from phonetics import metaphone
import torch
import torch.nn as nn

class HybridSimilarity(nn.Module):
    def __init__(self):
        super().__init__()
        self.bert = SentenceTransformer('all-MiniLM-L6-v2')
        self.tfidf = TfidfVectorizer()
        self.attention = nn.MultiheadAttention(embed_dim=384, num_heads=4)
        self.fc = nn.Sequential(
            nn.Linear(1152, 256),
            nn.ReLU(),
            nn.LayerNorm(256),
            nn.Linear(256, 1),
            nn.Sigmoid()
        )

    def _extract_features(self, text1, text2):
        # Feature Extraction
        features = {}

        # Lexical Analysis
        features['levenshtein'] = levenshtein_ratio(text1, text2)
        features['jaccard'] = len(set(text1.split()) & set(text2.split())) / len(set(text1.split()) | set(text2.split()))

        # Phonetic Analysis
        features['metaphone'] = 1.0 if metaphone(text1) == metaphone(text2) else 0.0

        # Semantic Analysis (BERT)
        emb1 = self.bert.encode(text1, convert_to_tensor=True)
        emb2 = self.bert.encode(text2, convert_to_tensor=True)
        features['semantic_cosine'] = nn.CosineSimilarity()(emb1, emb2).item()

        # Syntactic Analysis (LSA-TFIDF)
        tfidf_matrix = self.tfidf.fit_transform([text1, text2])
        svd = TruncatedSVD(n_components=1)
        lsa = svd.fit_transform(tfidf_matrix)
        features['lsa_cosine'] = np.dot(lsa[0], lsa[1].T)[0][0]

        # Attention Mechanism
        att_output, _ = self.attention(
            emb1.unsqueeze(0).unsqueeze(0), 
            emb2.unsqueeze(0).unsqueeze(0), 
            emb2.unsqueeze(0).unsqueeze(0)
        )
        features['attention_score'] = att_output.mean().item()

        return torch.tensor(list(features.values())).unsqueeze(0)

    def forward(self, text1, text2):
        features = self._extract_features(text1, text2)
        return self.fc(features).item()

def similarity_coefficient(text1, text2):
    model = HybridSimilarity()
    return model(text1, text2)
Salin selepas log masuk
Salin selepas log masuk

Komponen Teras

Model HybridSimilarity bergantung pada komponen utama ini:

  • Pengubah Ayat: Menggunakan model pengubah terlatih untuk penjanaan pembenaman semantik.
  • Jarak Levenshtein: Mengira persamaan leksikal berdasarkan suntingan peringkat aksara.
  • Metafon: Menentukan persamaan fonetik.
  • TF-IDF dan SVD Terpenggal: Menggunakan Analisis Semantik Terpendam (LSA) untuk persamaan sintaksis.
  • PyTorch: Menyediakan rangka kerja untuk membina rangkaian saraf tersuai dengan mekanisme perhatian dan lapisan bersambung sepenuhnya.

Pecahan Terperinci

1. Persediaan Model

Kelas HybridSimilarity, melanjutkan nn.Module, memulakan:

  • Satu Model penyusunan ayat berasaskan BERT (all-MiniLM-L6-v2).
  • Sebuah Penyetor vektor TF-IDF.
  • Satu mekanisme perhatian berbilang kepala.
  • Satu rangkaian bersambung sepenuhnya untuk mengagregat ciri dan menjana skor persamaan akhir.
self.bert = SentenceTransformer('all-MiniLM-L6-v2')
self.tfidf = TfidfVectorizer()
self.attention = nn.MultiheadAttention(embed_dim=384, num_heads=4)
self.fc = nn.Sequential(
    nn.Linear(1152, 256),
    nn.ReLU(),
    nn.LayerNorm(256),
    nn.Linear(256, 1),
    nn.Sigmoid()
)
Salin selepas log masuk
Salin selepas log masuk
2. Pengekstrakan Ciri

Kaedah _extract_features mengira beberapa ciri persamaan:

  • Persamaan Leksikal:
    • Nisbah Levenshtein: Mengukur bilangan suntingan (sisipan, pemadaman, penggantian) untuk menukar satu teks kepada teks yang lain.
    • Indeks Jaccard: Mengukur pertindihan perkataan unik dalam kedua-dua teks.
features['levenshtein'] = levenshtein_ratio(text1, text2)
features['jaccard'] = len(set(text1.split()) & set(text2.split())) / len(set(text1.split()) | set(text2.split()))
Salin selepas log masuk
  • Persamaan Fonetik:
    • Pengekodan metafon: Membandingkan perwakilan fonetik.
features['metaphone'] = 1.0 if metaphone(text1) == metaphone(text2) else 0.0
Salin selepas log masuk
  • Persamaan Semantik:
    • Pembenaman BERT dijana dan persamaan kosinus dikira.
emb1 = self.bert.encode(text1, convert_to_tensor=True)
emb2 = self.bert.encode(text2, convert_to_tensor=True)
features['semantic_cosine'] = nn.CosineSimilarity()(emb1, emb2).item()
Salin selepas log masuk
  • Persamaan Sintaksis:
    • TF-IDF mengvektorkan teks dan LSA digunakan menggunakan TruncatedSVD.
tfidf_matrix = self.tfidf.fit_transform([text1, text2])
svd = TruncatedSVD(n_components=1)
lsa = svd.fit_transform(tfidf_matrix)
features['lsa_cosine'] = np.dot(lsa[0], lsa[1].T)[0][0]
Salin selepas log masuk
  • Ciri berasaskan perhatian:
    • Perhatian berbilang kepala memproses benam dan purata skor perhatian digunakan.
att_output, _ = self.attention(
    emb1.unsqueeze(0).unsqueeze(0),
    emb2.unsqueeze(0).unsqueeze(0),
    emb2.unsqueeze(0).unsqueeze(0)
)
features['attention_score'] = att_output.mean().item()
Salin selepas log masuk
3. Gabungan Rangkaian Neural

Ciri yang diekstrak digabungkan dan dimasukkan ke dalam rangkaian saraf yang bersambung sepenuhnya. Rangkaian ini mengeluarkan skor persamaan (0-1).

import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.decomposition import TruncatedSVD
from sentence_transformers import SentenceTransformer
from Levenshtein import ratio as levenshtein_ratio
from phonetics import metaphone
import torch
import torch.nn as nn

class HybridSimilarity(nn.Module):
    def __init__(self):
        super().__init__()
        self.bert = SentenceTransformer('all-MiniLM-L6-v2')
        self.tfidf = TfidfVectorizer()
        self.attention = nn.MultiheadAttention(embed_dim=384, num_heads=4)
        self.fc = nn.Sequential(
            nn.Linear(1152, 256),
            nn.ReLU(),
            nn.LayerNorm(256),
            nn.Linear(256, 1),
            nn.Sigmoid()
        )

    def _extract_features(self, text1, text2):
        # Feature Extraction
        features = {}

        # Lexical Analysis
        features['levenshtein'] = levenshtein_ratio(text1, text2)
        features['jaccard'] = len(set(text1.split()) & set(text2.split())) / len(set(text1.split()) | set(text2.split()))

        # Phonetic Analysis
        features['metaphone'] = 1.0 if metaphone(text1) == metaphone(text2) else 0.0

        # Semantic Analysis (BERT)
        emb1 = self.bert.encode(text1, convert_to_tensor=True)
        emb2 = self.bert.encode(text2, convert_to_tensor=True)
        features['semantic_cosine'] = nn.CosineSimilarity()(emb1, emb2).item()

        # Syntactic Analysis (LSA-TFIDF)
        tfidf_matrix = self.tfidf.fit_transform([text1, text2])
        svd = TruncatedSVD(n_components=1)
        lsa = svd.fit_transform(tfidf_matrix)
        features['lsa_cosine'] = np.dot(lsa[0], lsa[1].T)[0][0]

        # Attention Mechanism
        att_output, _ = self.attention(
            emb1.unsqueeze(0).unsqueeze(0), 
            emb2.unsqueeze(0).unsqueeze(0), 
            emb2.unsqueeze(0).unsqueeze(0)
        )
        features['attention_score'] = att_output.mean().item()

        return torch.tensor(list(features.values())).unsqueeze(0)

    def forward(self, text1, text2):
        features = self._extract_features(text1, text2)
        return self.fc(features).item()

def similarity_coefficient(text1, text2):
    model = HybridSimilarity()
    return model(text1, text2)
Salin selepas log masuk
Salin selepas log masuk

Aplikasi Praktikal

Fungsi similarity_coefficient memulakan model dan mengira persamaan antara dua teks input.

self.bert = SentenceTransformer('all-MiniLM-L6-v2')
self.tfidf = TfidfVectorizer()
self.attention = nn.MultiheadAttention(embed_dim=384, num_heads=4)
self.fc = nn.Sequential(
    nn.Linear(1152, 256),
    nn.ReLU(),
    nn.LayerNorm(256),
    nn.Linear(256, 1),
    nn.Sigmoid()
)
Salin selepas log masuk
Salin selepas log masuk

Ini mengembalikan apungan antara 0 dan 1, mewakili persamaan.

Kesimpulan

Algoritma HybridSimilarity menawarkan pendekatan yang mantap kepada persamaan teks dengan menyepadukan pelbagai aspek perbandingan teks. Gabungan analisis leksikal, fonetik, semantik dan sintaksisnya membolehkan pemahaman yang lebih komprehensif dan bernuansa tentang persamaan teks, menjadikannya sesuai untuk pelbagai aplikasi, termasuk pengesanan pendua, pengelompokan teks dan pengambilan maklumat.

Atas ialah kandungan terperinci Algoritma Kesamaan Hibrid. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan