Home > Article > Backend Development > How can we efficiently split contiguous text into a word list using a probabilistic approach?
Efficiently Splitting Contiguous Text into a Word List
The question poses a challenge: given a text string without spaces, devise an algorithm to extract individual words.
A naive approach would iteratively identify and remove the longest possible word. However, this strategy may prove inefficient in real-world scenarios.
A Probabilistic Approach
To overcome these limitations, a probabilistic model incorporates word frequencies into the algorithm. Zipf's law approximates the probability of a word as inversely proportional to its rank in word frequency.
Using this model, we can define a cost function for each possible word break as the negative log probability of the entire sentence if that break were to be made. Dynamic programming is employed to find the word break with the lowest total cost.
Implementation
The Python code provided below implements this algorithm:
<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>
Using this code:
<code class="python">s = 'thumbgreenappleactiveassignmentweeklymetaphor' print(infer_spaces(s))</code>
Produces:
thumb green apple active assignment weekly metaphor
Optimizations
For further efficiency, a suffix tree can be constructed from the word list to reduce the search space. Splitting the input string into smaller chunks can also reduce memory usage.
Conclusion
By modeling word frequency and using dynamic programming, we obtain an efficient algorithm for splitting contiguous text into individual words, offering accurate results for real-world text.
The above is the detailed content of How can we efficiently split contiguous text into a word list using a probabilistic approach?. For more information, please follow other related articles on the PHP Chinese website!