Gegeben sei eine Textzeichenfolge, die aus aneinandergereihten Wörtern ohne Leerzeichen besteht:
Input: "tableapplechairtablecupboard..."
Wie können wir diesen Text effizient in eine Liste einzelner Wörter aufteilen?
Output: ["table", "apple", "chair", "table", ["cupboard", ["cup", "board"]], ...]
Ein einfacher Ansatz besteht darin, iterativ das längstmögliche Wort im Text zu finden. Dies kann jedoch zu suboptimalen Ergebnissen führen.
Stattdessen können wir die relative Häufigkeit von Wörtern in der Sprache ausnutzen, um die Genauigkeit zu verbessern:
Dynamischer Programmieransatz:
<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>
Dieser Algorithmus ist in der Lage, Text präzise in eine Liste von Wörtern zu segmentieren, sogar in das Fehlen von Leerzeichen.
Beispiel:
Input: "tableapplechairtablecupboard..." Output: ["table", "apple", "chair", "table", ["cupboard", ["cup", "board"]], ...]
Optimierungen:
Das obige ist der detaillierte Inhalt vonWie können wir eine Textfolge aus aneinandergereihten Wörtern ohne Leerzeichen effizient in einzelne Wörter aufteilen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!