Effizientes Aufteilen von zusammenhängendem Text in eine Wortliste
Die Frage stellt eine Herausforderung dar: Entwickeln Sie bei einer gegebenen Textzeichenfolge ohne Leerzeichen einen Algorithmus zum Extrahieren einzelne Wörter.
Ein naiver Ansatz würde iterativ das längstmögliche Wort identifizieren und entfernen. Allerdings kann sich diese Strategie in realen Szenarien als ineffizient erweisen.
Ein probabilistischer Ansatz
Um diese Einschränkungen zu überwinden, integriert ein probabilistisches Modell Worthäufigkeiten in den Algorithmus. Das Gesetz von Zipf nähert die Wahrscheinlichkeit eines Wortes als umgekehrt proportional zu seinem Rang in der Worthäufigkeit an.
Mit diesem Modell können wir eine Kostenfunktion für jeden möglichen Wortumbruch als negative logarithmische Wahrscheinlichkeit des gesamten Satzes definieren, wenn überhaupt Pause gemacht werden sollte. Mithilfe dynamischer Programmierung wird der Wortumbruch mit den niedrigsten Gesamtkosten ermittelt.
Implementierung
Der unten bereitgestellte Python-Code implementiert diesen Algorithmus:
<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>
Mit diesem Code:
<code class="python">s = 'thumbgreenappleactiveassignmentweeklymetaphor' print(infer_spaces(s))</code>
Erzeugt:
thumb green apple active assignment weekly metaphor
Optimierungen
Für weitere Effizienz kann daraus ein Suffixbaum erstellt werden die Wortliste, um den Suchraum zu verkleinern. Das Aufteilen der Eingabezeichenfolge in kleinere Abschnitte kann auch den Speicherverbrauch reduzieren.
Fazit
Durch die Modellierung der Worthäufigkeit und die Verwendung dynamischer Programmierung erhalten wir einen effizienten Algorithmus zum Aufteilen zusammenhängenden Textes in einzelne Wörter und liefert genaue Ergebnisse für reale Texte.
Das obige ist der detaillierte Inhalt vonWie können wir zusammenhängenden Text mithilfe eines probabilistischen Ansatzes effizient in eine Wortliste aufteilen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!