haspirater

detect aspirated 'h' in French words
git clone https://a3nm.net/git/haspirater/
Log | Files | Refs | README

commit af91885d48d5b1243df1fafc638ed0ebffbe92cc
parent 862c23e7de7de8edc7dcba6fc44347eaa2f1bbfb
Author: Antoine Amarilli <a3nm@a3nm.net>
Date:   Fri,  1 Feb 2013 16:48:21 +0100

Support for ambiguous forms such as 'hélas'

Diffstat:
additions | 2++
haspirater.json | 2+-
haspirater.py | 8+++++---
majoritytrie.py | 13+++++++++----
4 files changed, 17 insertions(+), 8 deletions(-)

diff --git a/additions b/additions @@ -28,3 +28,5 @@ 1 hadopi 0 hellénisme 0 hiatus +0 hélas +1 hélas diff --git a/haspirater.json b/haspirater.json @@ -1 +1 @@ -["0", {"a": ["1", {"b": ["0", {"a": ["1", {}], "o": ["1", {}]}], "d": ["1", {"o": ["1", {"p": ["1", {"i": ["1", {"s": ["0", {}]}]}]}], "r": ["0", {}]}], "l": ["1", {"e": ["1", {"i": ["0", {}]}], "i": ["1", {"o": ["0", {}]}], "\u00e8": ["1", {"n": ["0", {}]}], "l": ["1", {"a": ["1", {"l": ["0", {}]}], "u": ["0", {}]}]}], "r": ["1", {"m": ["0", {}]}], "v": ["0", {"a": ["1", {}], "e": ["0", {" ": ["1", {}], "l": ["0", {"e": ["0", {"r": ["1", {}]}], "\u00e9": ["0", {"e": ["0", {" ": ["1", {}]}]}]}], "n": ["1", {}], "s": ["1", {}], "r": ["1", {}], "u": ["1", {}]}], "i": ["1", {}], "r": ["1", {}], "u": ["1", {}]}], "\u00ff": ["0", {}]}], " ": ["1", {}], "\u00e2": ["1", {}], "e": ["0", {"a": ["1", {"u": ["1", {"t": ["0", {}]}]}], "i": ["1", {}], "m": ["1", {}], "l": ["0", {"l": ["0", {"e": ["1", {"s": ["0", {}]}], "o": ["1", {}]}]}], "n": ["1", {}], "p": ["1", {}], "s": ["1", {}], "r": ["0", {"c": ["1", {"u": ["0", {}]}], "m": ["0", {"i": ["0", {"t": ["1", {"a": ["0", {}]}]}]}], "n": ["1", {}], "p": ["1", {}], "s": ["1", {}], "t": ["1", {}]}], "u": ["0", {"s": ["1", {}], "r": ["0", {"t": ["1", {}]}], "l": ["1", {}], "/": ["1", {}]}], "t": ["1", {}]}], "i": ["0", {"a": ["1", {"t": ["1", {"u": ["0", {}]}]}], " ": ["1", {}], "c": ["1", {}], "b": ["0", {"o": ["1", {}]}], "e": ["1", {"r": ["0", {}]}], "d": ["1", {}], "g": ["1", {}], "f": ["1", {}], "\u00e9": ["1", {}], "h": ["1", {}], "l": ["1", {"a": ["0", {"i": ["1", {}]}], "d": ["1", {"e": ["1", {"s": ["0", {}]}]}]}], "n": ["1", {"d": ["1", {"o": ["0", {}]}]}], "p": ["0", {"p": ["0", {"i": ["1", {}]}], "h": ["1", {}], " ": ["1", {}]}], "s": ["0", {"s": ["1", {}]}], "r": ["1", {"o": ["1", {"n": ["0", {}]}]}], "t": ["1", {}]}], "\u00e8": ["1", {"b": ["0", {}]}], "\u00ea": ["1", {}], "l": ["1", {}], "o": ["0", {" ": ["1", {}], "c": ["1", {}], "b": ["1", {}], "d": ["1", {}], "g": ["1", {}], "h": ["1", {}], "m": ["0", {"a": ["1", {}], " ": ["1", {}], "e": ["1", {}]}], "l": ["1", {"o": ["0", {}]}], "o": ["1", {}], "n": ["0", {" ": ["1", {}], "d": ["1", {}], "g": ["1", {}], "n": ["0", {"i": ["1", {}]}], "s": ["1", {}], "t": ["1", {}]}], "q": ["1", {}], "p": ["1", {}], "s": ["0", {"a": ["1", {}]}], "r": ["0", {"d": ["1", {}], "i": ["0", {"o": ["1", {}]}], "m": ["1", {"o": ["0", {}]}], "n": ["1", {}], "s": ["1", {}]}], "u": ["1", {}], "t": ["1", {}], "w": ["1", {}], "y": ["1", {}]}], "\u00e9": ["0", {"b": ["0", {"\u00e9": ["0", {"c": ["1", {}]}]}], "l": ["0", {"i": ["0", {"p": ["1", {}]}], "a": ["1", {"s": ["0", {}]}], "e": ["1", {}], "\u00e9": ["1", {}], "\u00e8": ["1", {}]}], "q": ["1", {}], "r": ["1", {"i": ["0", {"s": ["1", {}]}], "\u00e9": ["0", {}], "o": ["1", {"\u00ef": ["0", {}]}]}]}], "\u00e1": ["1", {}], "u": ["1", {"d": ["0", {}], "i": ["1", {"l": ["0", {}], "s": ["0", {}]}], "m": ["0", {"a": ["0", {"i": ["0", {" ": ["1", {}], "s": ["1", {}], "e": ["1", {}], "t": ["1", {}]}], " ": ["1", {}], "g": ["1", {}], "n": ["0", {"t": ["1", {}]}]}], " ": ["1", {}], "b": ["0", {"l": ["0", {"e": ["0", {"s": ["1", {}]}]}], "o": ["1", {}]}], "e": ["0", {" ": ["1", {}], "m": ["1", {}], "n": ["1", {}], "r": ["1", {}], "u": ["0", {"x": ["1", {}]}], "z": ["1", {}]}], "i": ["0", {"o": ["1", {}]}], "\u00e9": ["1", {}], "\u00e8": ["1", {}], "o": ["1", {}], "p": ["1", {}]}], "\u00ee": ["0", {}]}], "\u00f4": ["0", {"l": ["1", {}]}], "y": ["0", {"a": ["1", {}]}]}] +[["0"], {"a": [["1"], {"b": [["0"], {"a": [["1"], {}], "o": [["1"], {}]}], "d": [["1"], {"o": [["1", "0"], {"p": [["1", "0"], {"i": [["1", "0"], {" ": [["1"], {}], "s": [["0"], {}]}]}]}], "r": [["0"], {}]}], "l": [["1"], {"e": [["1"], {"i": [["0"], {}]}], "i": [["1", "0"], {"b": [["1"], {}], "o": [["0"], {}]}], "\u00e8": [["1"], {"n": [["0"], {}]}], "l": [["1"], {"a": [["1"], {"l": [["0"], {}]}], "u": [["0"], {}]}]}], "r": [["1"], {"m": [["0"], {}]}], "v": [["0"], {"a": [["1"], {}], "e": [["0"], {" ": [["1"], {}], "l": [["0"], {"e": [["0"], {"r": [["1", "0"], {}]}], "\u00e9": [["0"], {"e": [["0"], {" ": [["1", "0"], {}]}]}]}], "n": [["1"], {}], "s": [["1"], {}], "r": [["1"], {}], "u": [["1"], {}]}], "i": [["1"], {}], "r": [["1"], {}], "u": [["1"], {}]}], "\u00ff": [["0"], {}]}], " ": [["1", "0"], {}], "\u00e2": [["1"], {}], "e": [["0"], {"a": [["1"], {"u": [["1"], {"t": [["0"], {}]}]}], "i": [["1"], {}], "m": [["1"], {}], "l": [["0"], {"l": [["0"], {"e": [["0"], {"b": [["1"], {}]}], "o": [["1"], {}]}]}], "n": [["1"], {}], "p": [["1"], {}], "s": [["1"], {}], "r": [["0"], {"c": [["1"], {"u": [["0"], {}]}], "m": [["0"], {"i": [["0"], {"t": [["0"], {"i": [["1"], {}]}]}]}], "n": [["1"], {}], "p": [["1"], {}], "s": [["1"], {}], "t": [["1"], {}]}], "u": [["0"], {"s": [["1"], {}], "r": [["0"], {"t": [["1"], {}]}], "l": [["1"], {}], "/": [["1"], {}]}], "t": [["1"], {}]}], "i": [["0"], {"a": [["1", "0"], {"t": [["1", "0"], {"a": [["1"], {}], "u": [["0"], {}]}]}], " ": [["1"], {}], "c": [["1"], {}], "b": [["0"], {"o": [["1"], {}]}], "e": [["1"], {"r": [["0"], {" ": [["1", "0"], {}]}]}], "d": [["1"], {}], "g": [["1"], {}], "f": [["1"], {}], "\u00e9": [["1"], {}], "h": [["1"], {}], "l": [["1", "0"], {"a": [["0"], {"i": [["1"], {}]}], "b": [["1"], {}], "e": [["1"], {}], "d": [["1", "0"], {"e": [["1", "0"], {"s": [["0"], {}], "g": [["1"], {}]}]}], "o": [["1"], {}]}], "n": [["1"], {"d": [["1", "0"], {"i": [["1"], {}], "o": [["0"], {}]}]}], "p": [["0"], {"p": [["0"], {"i": [["1"], {}]}], "h": [["1"], {}], " ": [["1"], {}]}], "s": [["0"], {"s": [["1"], {}]}], "r": [["1"], {"o": [["1"], {"n": [["0"], {}]}]}], "t": [["1"], {}]}], "\u00e8": [["1"], {"b": [["0"], {}]}], "\u00ea": [["1"], {}], "l": [["1"], {}], "o": [["0"], {" ": [["1"], {}], "c": [["1"], {}], "b": [["1"], {}], "d": [["1"], {}], "g": [["1"], {}], "h": [["1"], {}], "m": [["0"], {"a": [["1"], {}], " ": [["1"], {}], "e": [["1"], {}]}], "l": [["1"], {"o": [["0"], {}]}], "o": [["1"], {}], "n": [["0"], {" ": [["1"], {}], "d": [["1"], {}], "g": [["1"], {}], "n": [["0"], {"i": [["1"], {}]}], "s": [["1"], {}], "t": [["1"], {}]}], "q": [["1"], {}], "p": [["1"], {}], "s": [["0"], {"a": [["1"], {}]}], "r": [["0"], {"d": [["1"], {}], "i": [["0"], {"o": [["1"], {}]}], "m": [["1", "0"], {"i": [["1"], {}], "o": [["0"], {}]}], "n": [["1"], {}], "s": [["1"], {}]}], "u": [["1"], {}], "t": [["1"], {}], "w": [["1"], {}], "y": [["1"], {}]}], "\u00e9": [["0"], {"b": [["0"], {"\u00e9": [["0"], {"c": [["1"], {}]}]}], "l": [["0"], {"i": [["0"], {"p": [["1"], {}]}], "a": [["1"], {"s": [["0"], {" ": [["1", "0"], {}]}]}], "e": [["1"], {}], "\u00e9": [["1"], {}], "\u00e8": [["1"], {}]}], "q": [["1"], {}], "r": [["1"], {"i": [["0"], {"s": [["1"], {}]}], "\u00e9": [["0"], {}], "o": [["1"], {"\u00ef": [["0"], {}]}]}]}], "\u00e1": [["1"], {}], "u": [["1"], {"d": [["0"], {}], "i": [["1"], {"l": [["0"], {}], "s": [["0"], {}]}], "m": [["0"], {"a": [["0"], {"i": [["0"], {" ": [["1"], {}], "s": [["1"], {}], "e": [["1"], {}], "t": [["1"], {}]}], " ": [["1"], {}], "g": [["1"], {}], "n": [["0"], {"t": [["1"], {}]}]}], " ": [["1"], {}], "b": [["0"], {"l": [["0"], {"e": [["0"], {" ": [["1", "0"], {}], "s": [["1", "0"], {}]}]}], "o": [["1"], {}]}], "e": [["0"], {" ": [["1"], {}], "m": [["1"], {}], "n": [["1"], {}], "r": [["1"], {}], "u": [["0"], {"x": [["1"], {}]}], "z": [["1"], {}]}], "i": [["0"], {"o": [["1"], {}]}], "\u00e9": [["1"], {}], "\u00e8": [["1"], {}], "o": [["1"], {}], "p": [["1"], {}]}], "\u00ee": [["0"], {}]}], "\u00f4": [["0"], {"l": [["1"], {}]}], "y": [["0"], {"a": [["1"], {}]}]}] diff --git a/haspirater.py b/haspirater.py @@ -21,16 +21,18 @@ def lookup(key): """Return True iff key starts with an aspirated 'h'""" if key == '' or key[0] != 'h': raise ValueError - return do_lookup(trie, key[1:] + ' ') == '1' + return list(map((lambda x: x == "1"), do_lookup(trie, key[1:] + ' '))) def wrap_lookup(line): line = line.lower().lstrip().rstrip() try: result = lookup(line) - if result: + if True in result and not False in result: print("%s: aspirated" % line) - else: + elif False in result and not True in result: print("%s: not aspirated" % line) + else: + print("%s: ambiguous" % line) except ValueError: print("%s: no leading 'h'" % line) diff --git a/majoritytrie.py b/majoritytrie.py @@ -9,12 +9,17 @@ import sys trie = json.load(sys.stdin) def get_majority(d): - """What is the most probable value?""" - return max(d, key=d.get) + """What are the most probable values?""" + mx = max(d.values()) + return [k for k in d.keys() if d[k] == mx] def majority(trie): - """Keep only the most probable value at each node""" - trie[0] = get_majority(trie[0]) + """Keep only the most probable values at each node""" + if len(trie[1].keys()) == 0: + # keep all options at leaf nodes + trie[0] = list(trie[0].keys()) + else: + trie[0] = get_majority(trie[0]) useless = [] for child in trie[1].keys(): majority(trie[1][child])