Solved some ciphers with simulated annealing search
[cipher-tools.git] / segment.py
index e4b0d8ba3d70654650756a131f4d5dc7800e166e..ba3ddd7405a91a40c025fcd34b5eadfa7f8d0b11 100644 (file)
@@ -1,25 +1,15 @@
-# import re, string, random, glob, operator, heapq
-import string
-import collections
-from math import log10
+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(rem) for first,rem in splits(text))
-    return max(candidates, key=Pwords)
+    candidates = ([first]+segment(rest) for first,rest in splits(text))
+    return max(candidates, key=language_models.Pwords)
 
 def splits(text, L=20):
     """Return a list of all possible (first, rest) pairs, len(first)<=L.
@@ -27,38 +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):
-        self.total = sum([int(d[1]) for d in data])
-        for key, count in data:
-            self[key] = log10(int(count) / self.total)
-        self.estimate_of_missing = estimate_of_missing or (lambda k, N: 1./N)
-    def __call__(self, key): 
-        if key in self: 
-            return self[key]  
-        else: 
-            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)))
-
-N = 1024908267229 ## Number of tokens
-
-Pw  = Pdist(datafile('count_1w.txt'), avoid_long_words)