X-Git-Url: https://git.njae.me.uk/?a=blobdiff_plain;f=segment.py;h=ba3ddd7405a91a40c025fcd34b5eadfa7f8d0b11;hb=881e6da407d16c42b13458764f7531e8ba578f23;hp=08bc0aa84244bf222655defba7b4a0773f87ebcf;hpb=a5bada5fbdbfa67a1f4c301c5e14897c268bc0a5;p=cipher-tools.git diff --git a/segment.py b/segment.py index 08bc0aa..ba3ddd7 100644 --- a/segment.py +++ b/segment.py @@ -1,28 +1,15 @@ -# import re, string, random, glob, operator, heapq -import string -import collections -from math import log10 -import itertools +import language_models import sys +from functools import lru_cache sys.setrecursionlimit(1000000) -def memo(f): - "Memoize function f." - table = {} - def fmemo(*args): - if args not in table: - table[args] = f(*args) - return table[args] - fmemo.memo = table - return fmemo - -@memo +@lru_cache() def segment(text): """Return a list of words that is the best segmentation of text. """ if not text: return [] candidates = ([first]+segment(rest) for first,rest in splits(text)) - return max(candidates, key=Pwords) + return max(candidates, key=language_models.Pwords) def splits(text, L=20): """Return a list of all possible (first, rest) pairs, len(first)<=L. @@ -30,35 +17,3 @@ def splits(text, L=20): return [(text[:i+1], text[i+1:]) for i in range(min(len(text), L))] -def Pwords(words): - """The Naive Bayes log probability of a sequence of words. - """ - return sum(Pw[w] for w in words) - -class Pdist(dict): - """A probability distribution estimated from counts in datafile. - Values are stored and returned as log probabilities. - """ - def __init__(self, data=[], estimate_of_missing=None): - data1, data2 = itertools.tee(data) - self.total = sum([int(d[1]) for d in data1]) - for key, count in data2: - self[key] = log10(int(count) / self.total) - self.estimate_of_missing = estimate_of_missing or (lambda k, N: 1./N) - def __missing__(self, key): - return self.estimate_of_missing(key, self.total) - -def datafile(name, sep='\t'): - """Read key,value pairs from file. - """ - with open(name, 'r') as f: - for line in f: - yield line.split(sep) - -def avoid_long_words(key, N): - """Estimate the probability of an unknown word. - """ - return -log10((N * 10**(len(key) - 2))) - -Pw = Pdist(datafile('count_1w.txt'), avoid_long_words) -