Étant donné une chaîne de texte composée de mots concaténés sans espaces :
Input: "tableapplechairtablecupboard..."
Comment pouvons-nous diviser efficacement ce texte en une liste de mots individuels ?
Output: ["table", "apple", "chair", "table", ["cupboard", ["cup", "board"]], ...]
Une approche simple consiste à trouver de manière itérative le mot le plus long possible dans le texte. Cependant, cela peut conduire à des résultats sous-optimaux.
Au lieu de cela, nous pouvons exploiter la fréquence relative des mots dans la langue pour améliorer la précision :
Approche de programmation dynamique :
<code class="python">from math import log wordcost = {} # Dictionary of word costs using Zipf's law maxword = max(len(word) for word in wordcost) 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((wordcost.get(s[i - k - 1:i], 9e999) + c, 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>
Cet algorithme est capable de segmenter avec précision le texte en une liste de mots, même dans l'absence d'espaces.
Exemple :
Input: "tableapplechairtablecupboard..." Output: ["table", "apple", "chair", "table", ["cupboard", ["cup", "board"]], ...]
Optimisations :
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!