Algoritma Kesamaan Hibrid

Linda Hamilton
Linda Hamiltonasal
2025-01-21 22:17:09427semak imbas

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.

<code class="language-python">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)</code>

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.
<code class="language-python">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()
)</code>
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.
<code class="language-python">features['levenshtein'] = levenshtein_ratio(text1, text2)
features['jaccard'] = len(set(text1.split()) & set(text2.split())) / len(set(text1.split()) | set(text2.split()))</code>
  • Persamaan Fonetik:
    • Pengekodan metafon: Membandingkan perwakilan fonetik.
<code class="language-python">features['metaphone'] = 1.0 if metaphone(text1) == metaphone(text2) else 0.0</code>
  • Persamaan Semantik:
    • Pembenaman BERT dijana dan persamaan kosinus dikira.
<code class="language-python">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()</code>
  • Persamaan Sintaksis:
    • TF-IDF mengvektorkan teks dan LSA digunakan menggunakan TruncatedSVD.
<code class="language-python">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]</code>
  • Ciri berasaskan perhatian:
    • Perhatian berbilang kepala memproses benam dan purata skor perhatian digunakan.
<code class="language-python">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()</code>
3. Gabungan Rangkaian Neural

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

<code class="language-python">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)</code>

Aplikasi Praktikal

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

<code class="language-python">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()
)</code>

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:
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