Maison > développement back-end > Tutoriel Python > Comment pouvons-nous diviser efficacement un texte contigu en une liste de mots en utilisant une approche probabiliste ?

Comment pouvons-nous diviser efficacement un texte contigu en une liste de mots en utilisant une approche probabiliste ?

Susan Sarandon
Libérer: 2024-11-04 10:55:30
original
1074 Les gens l'ont consulté

How can we efficiently split contiguous text into a word list using a probabilistic approach?

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>
Copier après la connexion

Utilisation de ce code :

<code class="python">s = 'thumbgreenappleactiveassignmentweeklymetaphor'
print(infer_spaces(s))</code>
Copier après la connexion

Produit :

thumb green apple active assignment weekly metaphor
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal