Maison  >  Article  >  développement back-end  >  Comment Apache Spark peut-il être utilisé pour une correspondance efficace de chaînes avec du texte sujet aux erreurs à l'aide de transformateurs d'apprentissage automatique ?

Comment Apache Spark peut-il être utilisé pour une correspondance efficace de chaînes avec du texte sujet aux erreurs à l'aide de transformateurs d'apprentissage automatique ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-03 02:27:29845parcourir

How can Apache Spark be used for efficient string matching with error-prone text using machine learning transformers?

Correspondance efficace des chaînes dans Apache Spark pour les textes sujets aux erreurs

Contexte :

La correspondance des chaînes est cruciale lors de la vérification du texte extraits d’images ou d’autres sources. Cependant, les outils OCR introduisent souvent des erreurs, ce qui rend la correspondance exacte des chaînes peu fiable. Cela soulève la nécessité d'un algorithme efficace pour comparer les chaînes extraites à un ensemble de données, même en présence d'erreurs.

Approche :

Lorsque l'utilisation de Spark pour cette tâche peut ne soit pas idéal, nous présentons une approche qui combine plusieurs transformateurs d'apprentissage automatique :

  1. Tokenizer : divise la chaîne en jetons pour gérer les erreurs telles que le remplacement de caractères.
  2. NGram : Crée des n-grammes (par exemple, 3 grammes) pour tenir compte des caractères manquants ou corrompus.
  3. Vectorizer : Convertit les n-grammes en vecteurs numériques, permettant pour les calculs de distance.
  4. LSH (Locality-Sensitive Hashing) : Effectue une recherche approximative du voisin le plus proche sur les vecteurs.

Mise en œuvre :

<code class="scala">import org.apache.spark.ml.feature.{RegexTokenizer, NGram, HashingTF, MinHashLSH, MinHashLSHModel}

val tokenizer = new RegexTokenizer()
val ngram = new NGram().setN(3)
val vectorizer = new HashingTF()
val lsh = new MinHashLSH()

val pipeline = new Pipeline()
val model = pipeline.fit(db)

val dbHashed = model.transform(db)
val queryHashed = model.transform(query)

model.stages.last.asInstanceOf[MinHashLSHModel]
  .approxSimilarityJoin(dbHashed, queryHashed, 0.75).show</code>

Cette approche exploite LSH pour identifier efficacement les chaînes similaires, même avec des erreurs. Le seuil de 0,75 peut être ajusté en fonction du niveau de similarité souhaité.

Mise en œuvre de Pyspark :

<code class="python">from pyspark.ml import Pipeline
from pyspark.ml.feature import RegexTokenizer, NGram, HashingTF, MinHashLSH

model = Pipeline(stages=[
    RegexTokenizer(pattern="", inputCol="text", outputCol="tokens", minTokenLength=1),
    NGram(n=3, inputCol="tokens", outputCol="ngrams"),
    HashingTF(inputCol="ngrams", outputCol="vectors"),
    MinHashLSH(inputCol="vectors", outputCol="lsh")
]).fit(db)

db_hashed = model.transform(db)
query_hashed = model.transform(query)

model.stages[-1].approxSimilarityJoin(db_hashed, query_hashed, 0.75).show()</code>

Ressources associées :

  • [Optimiser le travail Spark qui doit calculer la similarité de chaque entrée et générer les N principaux éléments similaires pour chacun](https://stackoverflow.com/questions/53917468/optimize-spark-job-that- doit-calculer-chaque-à-chaque-entrée-similarité-et-sortie)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn