Maison > Article > développement back-end > Comment pouvons-nous diviser efficacement un texte contigu en une liste de mots en utilisant une approche probabiliste ?
Diviser efficacement un texte contigu en une liste de mots
La question pose un défi : étant donné une chaîne de texte sans espaces, concevez un algorithme pour extraire mots individuels.
Une approche naïve identifierait et supprimerait de manière itérative le mot le plus long possible. Cependant, cette stratégie peut s'avérer inefficace dans des scénarios du monde réel.
Une approche probabiliste
Pour surmonter ces limitations, un modèle probabiliste intègre des fréquences de mots dans l'algorithme. La loi de Zipf estime la probabilité d'un mot comme étant inversement proportionnelle à son rang dans la fréquence des mots.
En utilisant ce modèle, nous pouvons définir une fonction de coût pour chaque saut de mot possible comme la probabilité logarithmique négative de la phrase entière si cela une pause devait être faite. La programmation dynamique est utilisée pour trouver le mot break avec le coût total le plus bas.
Mise en œuvre
Le code Python fourni ci-dessous implémente cet algorithme :
<code class="python">from math import log # Build a cost dictionary based on Zipf's law words = open("words-by-frequency.txt").read().split() maxword = max(len(x) for x in words) wordcost = dict((k, log((i+1)*log(len(words)))) for i,k in enumerate(words)) def infer_spaces(s): cost = [0] for i in range(1,len(s)+1): candidates = enumerate(reversed(cost[max(0, i-maxword):i])) c,k = min((c + wordcost.get(s[i-k-1:i], 9e999), k+1) for k,c in candidates) cost.append(c) out = [] i = len(s) while i>0: c,k = best_match(i) assert c == cost[i] out.append(s[i-k:i]) i -= k return " ".join(reversed(out))</code>
Utilisation de ce code :
<code class="python">s = 'thumbgreenappleactiveassignmentweeklymetaphor' print(infer_spaces(s))</code>
Produit :
thumb green apple active assignment weekly metaphor
Optimisations
Pour plus d'efficacité, un arbre de suffixes peut être construit à partir de la liste de mots pour réduire l’espace de recherche. Diviser la chaîne d'entrée en morceaux plus petits peut également réduire l'utilisation de la mémoire.
Conclusion
En modélisant la fréquence des mots et en utilisant la programmation dynamique, nous obtenons un algorithme efficace pour diviser le texte contigu. en mots individuels, offrant des résultats précis pour un texte du monde réel.
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!