Skip to content

Instantly share code, notes, and snippets.

@ngocbd
Created April 4, 2016 14:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ngocbd/5465e51be6161fe32665de7af3486496 to your computer and use it in GitHub Desktop.
Save ngocbd/5465e51be6161fe32665de7af3486496 to your computer and use it in GitHub Desktop.
import zlib
import base64
import functools
import math
def memo(f):
table = {}
def fmemo(*args):
if args not in table:
table[args] = f(*args)
return table[args]
fmemo.memo = table
return fmemo
s="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"
s=zlib.decompress(base64.b64decode(s))
s=s.split("\n")
class OneGramDist(dict):
def __init__(self):
self.gramCount = 0
for line in s:
row = line.split("\t")
if len(row) < 2: break
word=row[0]
count=row[1]
self[word] = int(count)
self.gramCount += self[word]
def __call__(self, word):
if word in self:
return float(self[word]) / self.gramCount
else:
return 1.0 / (self.gramCount * 10**(len(word) - 2))
def wordSeqFitness(words):
return functools.reduce(lambda x,y: x+y,
(math.log10(singleWordProb(w)) for w in words))
def splitPairs(word):
return [(word[:i+1], word[i+1:]) for i in range(len(word))]
@memo
def segment(word):
if not word: return []
allSegmentations = [[first] + segment(rest)
for (first, rest) in splitPairs(word)]
return max(allSegmentations, key = wordSeqFitness)
singleWordProb = OneGramDist()
'''This function is used to normalise the hashtag
'''
def normalise(word):
import re
word = re.sub('[^A-Za-z0-9]+', '', word)
if(word[0] =='#'):
word = word[1:]
return word.lower()
N = int(raw_input())
for line in range(N):
print " ".join(segment(raw_input()))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment