ホームページ > バックエンド開発 > Python チュートリアル > ハイブリッド類似性アルゴリズム

ハイブリッド類似性アルゴリズム

Linda Hamilton
リリース: 2025-01-21 22:17:09
オリジナル
430 人が閲覧しました

HybridSimilarity Algorithm

HybridSimilarity アルゴリズムの詳細

この記事では、テキストのペア間の類似性を評価するために設計された洗練されたニューラル ネットワークである HybridSimilarity アルゴリズムについて説明します。 このハイブリッド モデルは、語彙、音声、意味、構文の比較を巧みに統合して、包括的な類似性スコアを取得します。

<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>
ログイン後にコピー
ログイン後にコピー

コアコンポーネント

HybridSimilarity モデルは、次の主要コンポーネントに依存しています。

  • 文トランスフォーマー: セマンティック埋め込み生成に事前トレーニング済みトランスフォーマー モデルを利用します。
  • レーベンシュタイン距離: 文字レベルの編集に基づいて語彙の類似性を計算します。
  • Metaphone: 音声の類似性を決定します。
  • TF-IDF および Truncated SVD: 構文の類似性について潜在意味分析 (LSA) を適用します。
  • PyTorch: アテンション メカニズムと完全に接続されたレイヤーを備えたカスタム ニューラル ネットワークを構築するためのフレームワークを提供します。

詳細な内訳

1.モデルのセットアップ

HybridSimilarity クラスは、nn.Module を拡張し、次のように初期化します。

  • BERT ベースの文埋め込みモデル (all-MiniLM-L6-v2)。
  • TF-IDF ベクタライザー
  • 多頭注意メカニズム
  • 特徴を集約し、最終的な類似性スコアを生成するための完全に接続されたネットワーク
<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.特徴抽出

_extract_features メソッドは、いくつかの類似性特徴を計算します。

  • 語彙の類似性:
    • レーベンシュタイン比: あるテキストを別のテキストに変換するための編集 (挿入、削除、置換) の数を定量化します。
    • Jaccard インデックス: 両方のテキスト内の固有の単語の重複を測定します。
<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>
ログイン後にコピー
  • 音声の類似性:
    • Metaphone エンコーディング: 音声表現を比較します。
<code class="language-python">features['metaphone'] = 1.0 if metaphone(text1) == metaphone(text2) else 0.0</code>
ログイン後にコピー
  • 意味上の類似性:
    • BERT 埋め込みが生成され、コサイン類似度が計算されます。
<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>
ログイン後にコピー
  • 構文の類似性:
    • TF-IDF はテキストをベクトル化し、LSA は 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>
ログイン後にコピー
  • アテンションベースの機能:
    • マルチヘッド アテンションは埋め込みを処理し、平均アテンション スコアが使用されます。
<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.ニューラルネットワークフュージョン

抽出された特徴は結合され、完全に接続されたニューラル ネットワークに入力されます。このネットワークは類似性スコア (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>
ログイン後にコピー
ログイン後にコピー

実際の応用

similarity_coefficient 関数はモデルを初期化し、2 つの入力テキスト間の類似性を計算します。

<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>
ログイン後にコピー
ログイン後にコピー

これは、類似性を表す 0 から 1 までの浮動小数点数を返します。

結論

HybridSimilarity アルゴリズムは、テキスト比較のさまざまな側面を統合することにより、テキストの類似性に対する堅牢なアプローチを提供します。 語彙、音声、意味、構文解析を組み合わせることで、テキストの類似性をより包括的かつ微妙に理解できるようになり、重複検出、テキスト クラスタリング、情報検索などのさまざまなアプリケーションに適しています。

以上がハイブリッド類似性アルゴリズムの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート