web-dev-qa-db-fra.com

Python - Comment intuitionner Word à partir d'un texte abrégé en utilisant la PNL?

Je travaillais récemment sur un ensemble de données qui utilisait des abréviations pour divers mots. Par exemple,

wtrbtl = water bottle
bwlingbl = bowling ball
bsktball = basketball

Il ne semble pas y avoir de cohérence en termes de convention utilisée, c'est-à-dire qu'ils utilisent parfois des voyelles parfois pas. J'essaie de construire un objet de mappage comme celui ci-dessus pour les abréviations et leurs mots correspondants sans corpus complet ni liste complète de termes (c'est-à-dire que des abréviations pourraient être introduites qui ne sont pas explicitement connues). Par souci de simplicité, disons qu'il est limité aux choses que vous trouverez dans une salle de sport, mais cela pourrait être n'importe quoi.

Fondamentalement, si vous ne regardez que le côté gauche des exemples, quel type de modèle pourrait faire le même traitement que notre cerveau en termes de relier chaque abréviation à l'étiquette de texte intégral correspondante.

Mes idées ont cessé de prendre la première et la dernière lettre et de les trouver dans un dictionnaire. Attribuez ensuite des probabilités a priori en fonction du contexte. Mais comme il existe un grand nombre de morphèmes sans marqueur indiquant la fin de Word, je ne vois pas comment il est possible de les diviser.

ACTUALISÉ:

J'ai également eu l'idée de combiner quelques algorithmes métriques de chaîne comme un algorithme d'évaluation de correspondance pour déterminer un ensemble de termes associés, puis calculer la distance de Levenshtein entre chaque mot de l'ensemble jusqu'à l'abréviation cible. Cependant, je suis toujours dans le noir en ce qui concerne les abréviations pour les mots qui ne figurent pas dans un dictionnaire maître. Fondamentalement, inférer la construction de Word - un modèle Naive Bayes pourrait aider, mais je crains que toute erreur de précision causée par l'utilisation des algorithmes ci-dessus invalide tout processus de formation de modèle.

Toute aide est appréciée, car je suis vraiment coincé sur celui-ci.

27
Dan Temkin

Si vous ne trouvez pas un dictionnaire exhaustif, vous pouvez créer (ou télécharger) un modèle de langage probabiliste, pour générer et évaluer des candidats de phrase pour vous. Il peut s'agir d'un modèle de caractères n-gramme ou d'un réseau neuronal.

Pour vos abréviations, vous pouvez construire un "modèle de bruit" qui prédit la probabilité d'omissions de caractères. Il peut apprendre d'un corpus (vous devez l'étiqueter manuellement ou semi-manuellement) que les consonnes sont manquées moins fréquemment que les voyelles.

Ayant un modèle de langage complexe et un modèle de bruit simple, vous pouvez les combiner en utilisant l'approche par canal bruyant (voir par exemple l'article de Jurafsky = pour plus de détails), pour suggérer des phrases candidates.

Mise à jour . Je me suis enthousiasmé par ce problème et j'ai implémenté cet algorithme:

  • modèle de langage (caractère de 5 grammes formé sur le texte du Seigneur des Anneaux)
  • modèle de bruit (probabilité que chaque symbole soit abrégé)
  • algorithme de recherche de faisceau, pour une suggestion de phrase candidate.

Ma solution est implémentée dans ce Python notebook . Avec les modèles entraînés, il a une interface comme noisy_channel('bsktball', language_model, error_model), qui, en passant, renvoie {'basket ball': 33.5, 'basket bally': 36.0}. Les valeurs du dictionnaire sont des scores des suggestions (les plus basses, les meilleures).

Avec d'autres exemples, cela fonctionne moins bien: pour 'wtrbtl', il renvoie {'water but all': 23.7, 'water but ill': 24.5, 'water but lay': 24.8, 'water but let': 26.0, 'water but lie': 25.9, 'water but look': 26.6}.

Pour 'bwlingbl', cela donne {'bwling belia': 32.3, 'bwling bell': 33.6, 'bwling below': 32.1, 'bwling belt': 32.5, 'bwling black': 31.4, 'bwling bling': 32.9, 'bwling blow': 32.7, 'bwling blue': 30.7}. Cependant, lors de la formation sur un corpus approprié (par exemple, des magazines sportifs et des blogs; peut-être avec un suréchantillonnage des noms), et peut-être avec une largeur de recherche de faisceau plus généreuse, ce modèle fournira des suggestions plus pertinentes.

20
David Dale

J'ai donc examiné un problème similaire et j'ai trouvé un package fantastique appelé PyEnchant . Si vous utilisez le correcteur orthographique intégré, vous pouvez obtenir des suggestions Word, ce qui serait une solution agréable et simple. Cependant il ne suggérera que des mots simples (pour autant que je sache), et donc la situation que vous avez:

wtrbtl = water bottle

Ne fonctionnera pas.

Voici du code:

import enchant

wordDict = enchant.Dict("en_US")

inputWords = ['wtrbtl','bwlingbl','bsktball']
for Word in inputWords:
    print wordDict.suggest(Word)

La sortie est:

['rebuttal', 'tribute']
['bowling', 'blinding', 'blinking', 'bumbling', 'alienable', 'Nibelung']
['basketball', 'fastball', 'spitball', 'softball', 'executable', 'basketry']

Peut-être que si vous savez quel type d'abréviations il y a, vous pouvez séparer la chaîne en deux mots, par ex.

'wtrbtl' -> ['wtr', 'btl']

Il y a aussi le kit de traitement du langage naturel ( NLTK ), qui est incroyable, et vous pouvez l'utiliser en combinaison avec le code ci-dessus en examinant la fréquence de chaque suggestion Par exemple, Word.

Bonne chance!

14
Robbie

Une option consiste à remonter dans le temps et à calculer l'équivalent Soundex Algorithm .

Soundex supprime toutes les voyelles, gère les erreurs de prononciation courantes et les orthographes croquantes. L'algorithme est simpliste et se faisait à la main. L'inconvénient est qu'il n'y a pas de Word spécial dérivant ou arrêtant le support au travail.

7
Charles Merriam

... abréviations pour les mots ne figurant pas dans un dictionnaire maître.

Donc, vous cherchez un modèle PNL qui peut proposer des mots anglais valides, sans les avoir déjà vus?

Il est probablement plus facile de trouver un dictionnaire Word plus exhaustif, ou peut-être de mapper chaque mot du dictionnaire existant avec des extensions courantes telles que +"es" ou Word[:-1] + "ies".

4
Melvin