takes a string and truncates to standard form for data matching.
	Based on the spec at OpenRefine
	https://github.com/OpenRefine/OpenRefine/wiki/Clustering-In-Depth#fingerprint
	- remove leading and trailing whitespace
	- change all characters to their lowercase representation
	- remove all punctuation and control characters
	- split the string into whitespace-separated tokens
	- sort the tokens and remove duplicates
	- join the tokens back together
	- normalize extended western characters to their ASCII representation (for example "gödel" → "godel")

def fingerprint(txt):
	"""
	takes a string and truncates to standard form for data matching.
	Based on the spec at OpenRefine
	https://github.com/OpenRefine/OpenRefine/wiki/Clustering-In-Depth#fingerprint
	- remove leading and trailing whitespace
	- change all characters to their lowercase representation
	- remove all punctuation and control characters
	- split the string into whitespace-separated tokens
	- sort the tokens and remove duplicates
	- join the tokens back together
	- normalize extended western characters to their ASCII representation (for example "gödel" → "godel")

	"""
	raw_text = txt.upper() #.strip(' ').replace('\n','')
	tokens = sorted(list(set(raw_text.split(' '))))
	#print('tokens = ', tokens)

	res = ''.join([strip_nonalpha(t) for t in tokens])
	return res