Merge nerdy into Nazca
authorvincent.michel@logilab.fr
Tue, 22 Oct 2013 15:56:01 +0200
changeset 344 2bc47c2b1c0f
parent 343 ccd7e8632d19 (current diff)
parent 321 1056d63f8db9 (diff)
child 363 73f8afbe485d
Merge nerdy into Nazca
.hgtags
--- a/.hgtags	Tue Oct 22 15:53:25 2013 +0200
+++ b/.hgtags	Tue Oct 22 15:56:01 2013 +0200
@@ -1,3 +1,16 @@
 909e2284d79fe73ed5954f7a52729325e88e355c python-nerdy-centos-version-0.1.0-1
 909e2284d79fe73ed5954f7a52729325e88e355c python-nerdy-debian-version-0.1.0-1
 909e2284d79fe73ed5954f7a52729325e88e355c python-nerdy-version-0.1.0
+4e2afdca3f0c60639adf83af6ebb4be7e6168807 python-nazca-0.1.0
+fe3556bda079c8be7ac03041ae7767938959ec73 nazca-version-0.1.0
+3506af3682097d80936290bfe9c58a2096bde96f nazca-debian-version-0.1.0-1
+59a15b1886285720d47ff03d1dab7a091659776b nazca-version-0.2.0
+5ac1afdeaf6b46d556d20c3dc631edfea964f9be nazca-debian-version-0.2.0-1
+458190cbe7d4009ec622b5d003cf3eb6bb53d4d3 nazca-version-0.2.1
+087ed60a535ac854b95377cc5546c8becf6ac7a3 nazca-debian-version-0.2.1-1
+67bb53fb1ed3cf3161094cb84a5f5ff6fd55d8c0 nazca-debian-version-0.2.2
+7c9e886ace8d45a36d348edb07e6d80d6e28f00c nazca-version-0.2.2
+60f374787ab87e3c29e0e56ae1f36c7159a60953 nazca-version-0.2.3
+ab1349da29e7a3dd6fe128cdabf6ddb0d4ef9626 azca-debian-version-0.2.3
+70ad2405791cd6ee94ce23d6993d4da240980251 nazca-version-0.3.0
+c00139801d7d858589f0bf0afbe6a270c25696b7 nazca-version-0.3.0
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MANIFEST.in	Tue Oct 22 15:56:01 2013 +0200
@@ -0,0 +1,4 @@
+recursive-include . *.py
+recursive-include debian *
+include *.rst
+recursive-include test/data *
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/__pkginfo__.py	Tue Oct 22 15:56:01 2013 +0200
@@ -0,0 +1,41 @@
+# pylint: disable-msg=W0622
+# copyright 2004-2012 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of rql.
+#
+# rql is free software: you can redistribute it and/or modify it under the
+# terms of the GNU Lesser General Public License as published by the Free
+# Software Foundation, either version 2.1 of the License, or (at your option)
+# any later version.
+#
+# rql is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+# A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with rql. If not, see <http://www.gnu.org/licenses/>.
+"""Nazca packaging information."""
+__docformat__ = "restructuredtext en"
+import sys
+
+distname = 'nazca'
+modname = 'nazca'
+
+numversion = (0, 3, 0)
+version = '.'.join([str(num) for num in numversion])
+
+license = 'LGPL' # 2.1 or later
+description = "Python library for data alignment"
+web = "https://www.logilab.org/project/nazca"
+author = "Logilab"
+author_email = "contact@logilab.fr"
+
+
+from os.path import join
+scripts = [join('bin', 'pytest')]
+include_dirs = [join('test', 'data')]
+
+if sys.version_info < (2, 7):
+    install_requires = ['unittest2 >= 0.5.1']
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/aligner.py	Tue Oct 22 15:56:01 2013 +0200
@@ -0,0 +1,324 @@
+# -*- coding:utf-8 -*-
+# copyright 2012 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr -- mailto:contact@logilab.fr
+#
+# This program is free software: you can redistribute it and/or modify it under
+# the terms of the GNU Lesser General Public License as published by the Free
+# Software Foundation, either version 2.1 of the License, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+import time
+import logging
+from collections import defaultdict
+
+from scipy import zeros
+from scipy.sparse import lil_matrix
+
+from nazca.dataio import parsefile
+
+
+###############################################################################
+### UTILITY FUNCTIONS #########################################################
+###############################################################################
+def iter_aligned_pairs(refset, targetset, global_mat, global_matched, unique=True):
+    """ Return the aligned pairs
+    """
+    if unique:
+        for refid in global_matched:
+            bestid, _ = sorted(global_matched[refid], key=lambda x:x[1])[0]
+            ref_record = refset[refid]
+            target_record = targetset[bestid]
+            distance = global_mat[refid, bestid] if global_mat is not None else None
+            yield (ref_record[0], refid), (target_record[0], bestid), distance
+    else:
+        for refid in global_matched:
+            for targetid, _ in global_matched[refid]:
+                ref_record = refset[refid]
+                target_record = targetset[targetid]
+                distance = global_mat[refid, targetid] if global_mat is not None else None
+                yield (ref_record[0], refid), (target_record[0], targetid), distance
+
+
+###############################################################################
+### BASE ALIGNER OBJECT #######################################################
+###############################################################################
+class BaseAligner(object):
+
+    def __init__(self, threshold, processings, normalize_matrix=False):
+        self.threshold = threshold
+        self.processings = processings
+        self.normalize_matrix = normalize_matrix
+        self.ref_normalizer = None
+        self.target_normalizer = None
+        self.target_normalizer = None
+        self.blocking = None
+        self.alignments_done = 0
+        self.pairs_found = 0
+        self.nb_comparisons = 0
+        self.nb_blocks = 0
+        self.refset_size = None
+        self.targetset_size = None
+        self.time = None
+        self.logger = logging.getLogger('nazca.aligner')
+
+    def register_ref_normalizer(self, normalizer):
+        """ Register normalizers to be applied
+        before alignment """
+        self.ref_normalizer = normalizer
+
+    def register_target_normalizer(self, normalizer):
+        """ Register normalizers to be applied
+        before alignment """
+        self.target_normalizer = normalizer
+
+    def register_blocking(self, blocking):
+        self.blocking = blocking
+
+    def apply_normalization(self, dataset, normalizer):
+        if normalizer:
+            return normalizer.normalize_dataset(dataset)
+        return dataset
+
+    def compute_distance_matrix(self, refset, targetset,
+                                ref_indexes, target_indexes):
+        """ Compute and return the global alignment matrix.
+        For each `processing` a `Distancematrix` is built, then all the
+        matrices are summed with their own weighting and the result is the global
+        alignment matrix, which is returned.
+        """
+        distmatrix = zeros((len(ref_indexes), len(target_indexes)), dtype='float32')
+        for processing in self.processings:
+            distmatrix += processing.cdist(refset, targetset,
+                                          ref_indexes, target_indexes)
+        return distmatrix
+
+    def threshold_matched(self, distmatrix):
+        """ Return the matched elements within a dictionnary,
+        each key being the indice from X, and the corresponding
+        values being a list of couple (indice from Y, distance)
+        """
+        match = defaultdict(list)
+        if self.normalize_matrix:
+            distmatrix /= distmatrix.max()
+        ind = (distmatrix <= self.threshold).nonzero()
+        indrow = ind[0].tolist()
+        indcol = ind[1].tolist()
+        for (i, j) in zip(indrow, indcol):
+            match[i].append((j, distmatrix[i, j]))
+        return match
+
+    def _get_match(self, refset, targetset, ref_indexes=None, target_indexes=None):
+        # Build items
+        items = []
+        ref_indexes = ref_indexes or xrange(len(refset))
+        target_indexes = target_indexes or xrange(len(targetset))
+        # Apply alignments
+        mat = self.compute_distance_matrix(refset, targetset,
+                                           ref_indexes=ref_indexes,
+                                           target_indexes=target_indexes)
+        matched = self.threshold_matched(mat)
+        # Reapply matched to global indexes
+        new_matched = {}
+        for k, values in matched.iteritems():
+            new_matched[ref_indexes[k]] = [(target_indexes[i], d) for i, d in values]
+        return mat, new_matched
+
+    def align(self, refset, targetset, get_matrix=True):
+        """ Perform the alignment on the referenceset
+        and the targetset
+        """
+        start_time = time.time()
+        refset = self.apply_normalization(refset, self.ref_normalizer)
+        targetset = self.apply_normalization(targetset, self.target_normalizer)
+        self.refset_size = len(refset)
+        self.targetset_size = len(targetset)
+        # If no blocking
+        if not self.blocking:
+            return self._get_match(refset, targetset)
+        # Blocking == conquer_and_divide
+        global_matched = {}
+        global_mat = lil_matrix((len(refset), len(targetset)))
+        self.blocking.fit(refset, targetset)
+        for refblock, targetblock in self.blocking.iter_blocks():
+            self.nb_blocks += 1
+            ref_index = [r[0] for r in refblock]
+            target_index = [r[0] for r in targetblock]
+            self.nb_comparisons += len(ref_index)*len(target_index)
+            _, matched = self._get_match(refset, targetset, ref_index, target_index)
+            for k, values in matched.iteritems():
+                subdict = global_matched.setdefault(k, set())
+                for v, d in values:
+                    subdict.add((v, d))
+                    self.alignments_done += 1
+                    if get_matrix:
+                        # XXX avoid issue in sparse matrix
+                        global_mat[k, v] = d or 10**(-10)
+        self.time = time.time() - start_time
+        return global_mat, global_matched
+
+    def get_aligned_pairs(self, refset, targetset, unique=True):
+        """ Get the pairs of aligned elements
+        """
+        global_mat, global_matched = self.align(refset, targetset, get_matrix=False)
+        for pair in iter_aligned_pairs(refset, targetset, global_mat, global_matched, unique):
+            self.pairs_found += 1
+            yield pair
+        self.log_infos()
+
+    def align_from_files(self, reffile, targetfile,
+                         ref_indexes=None, target_indexes=None,
+                         ref_encoding=None, target_encoding=None,
+                         ref_separator='\t', target_separator='\t',
+                         get_matrix=True):
+        """ Align data from files
+
+        Parameters
+        ----------
+
+        reffile: name of the reference file
+
+        targetfile: name of the target file
+
+        ref_encoding: if given (e.g. 'utf-8' or 'latin-1'), it will
+                      be used to read the files.
+
+        target_encoding: if given (e.g. 'utf-8' or 'latin-1'), it will
+                         be used to read the files.
+
+        ref_separator: separator of the reference file
+
+        target_separator: separator of the target file
+        """
+        refset = parsefile(reffile, indexes=ref_indexes,
+                           encoding=ref_encoding, delimiter=ref_separator)
+        targetset = parsefile(targetfile, indexes=target_indexes,
+                              encoding=target_encoding, delimiter=target_separator)
+        return self.align(refset, targetset, get_matrix=get_matrix)
+
+    def get_aligned_pairs_from_files(self, reffile, targetfile,
+                         ref_indexes=None, target_indexes=None,
+                         ref_encoding=None, target_encoding=None,
+                         ref_separator='\t', target_separator='\t',
+                         unique=True):
+        """ Get the pairs of aligned elements
+        """
+        refset = parsefile(reffile, indexes=ref_indexes,
+                           encoding=ref_encoding, delimiter=ref_separator)
+        targetset = parsefile(targetfile, indexes=target_indexes,
+                              encoding=target_encoding, delimiter=target_separator)
+        global_mat, global_matched = self.align(refset, targetset, get_matrix=False)
+        for pair in iter_aligned_pairs(refset, targetset, global_mat, global_matched, unique):
+            yield pair
+
+    def log_infos(self):
+        """ Display some info on the aligner process
+        """
+        self.logger.info('Computation time : %s' % self.time)
+        self.logger.info('Size reference set : %s' % self.refset_size)
+        self.logger.info('Size target set : %s' % self.targetset_size)
+        self.logger.info('Comparisons done : %s' % self.nb_comparisons)
+        self.logger.info('Alignments done : %s' % self.alignments_done)
+        self.logger.info('Pairs found : %s' % self.pairs_found)
+        self.logger.info('Ratio reference set/alignments done : %s'
+                         % (self.alignments_done/float(self.refset_size)))
+        self.logger.info('Ratio target set/alignments done : %s'
+                         % (self.alignments_done/float(self.targetset_size)))
+        self.logger.info('Ratio reference set/pairs found : %s'
+                         % (self.pairs_found/float(self.refset_size)))
+        self.logger.info('Ratio target set/pairs found : %s'
+                         % (self.pairs_found/float(self.targetset_size)))
+        self.logger.info('Maximum comparisons : %s'
+                         % (self.refset_size * self.targetset_size))
+        self.logger.info('Number of blocks : %s' % self.nb_blocks)
+        if self.nb_blocks:
+            self.logger.info('Ratio comparisons/block : %s'
+                             % (float(self.nb_comparisons)/self.nb_blocks))
+        self.logger.info('Blocking reduction : %s'
+                         % (self.nb_comparisons/float(self.refset_size * self.targetset_size)))
+
+
+###############################################################################
+### PIPELINE ALIGNER OBJECT ##################################################
+###############################################################################
+class PipelineAligner(object):
+    """ This pipeline will perform iterative alignments, removing each time
+    the aligned results from the previous aligner.
+    """
+
+    def __init__(self, aligners):
+        self.aligners = aligners
+        self.pairs = {}
+        self.nb_comparisons = 0
+        self.nb_blocks = 0
+        self.alignments_done = 0
+        self.pairs_found = 0
+        self.refset_size = None
+        self.targetset_size = None
+        self.time = None
+        self.logger = logging.getLogger('nazca.aligner')
+
+    def get_aligned_pairs(self, refset, targetset, unique=True):
+        """ Get the pairs of aligned elements
+        """
+        start_time = time.time()
+        ref_index = range(len(refset))
+        target_index = range(len(targetset))
+        self.refset_size = len(refset)
+        self.targetset_size = len(targetset)
+        global_matched = {}
+        global_mat = lil_matrix((len(refset), len(targetset)))
+        seen_refset = set()
+        # Iteration over aligners
+        for ind_aligner, aligner in enumerate(self.aligners):
+            # Perform alignment
+            _refset = [refset[i] for i in ref_index]
+            _targetset = [targetset[i] for i in target_index]
+            for pair in aligner.get_aligned_pairs(_refset, _targetset, unique):
+                self.pairs_found += 1
+                pair = ((pair[0][0], ref_index[pair[0][1]]),
+                        (pair[1][0], target_index[pair[1][1]]))
+                yield pair
+                seen_refset.add(pair[0][1])
+            # Store stats
+            self.nb_blocks += aligner.nb_blocks
+            self.nb_comparisons += aligner.nb_comparisons
+            # Update indexes if necessary
+            # For now, we remove all the reference set that are already matched
+            if ind_aligner < len(self.aligners) - 1:
+                # There are other aligners after this one
+                ref_index = [i for i in ref_index if i not in seen_refset]
+        self.time = time.time() - start_time
+        self.log_infos()
+
+    def log_infos(self):
+        """ Display some info on the aligner process
+        """
+        self.logger.info('Computation time : %s' % self.time)
+        self.logger.info('Size reference set : %s' % self.refset_size)
+        self.logger.info('Size target set : %s' % self.targetset_size)
+        self.logger.info('Comparisons done : %s' % self.nb_comparisons)
+        self.logger.info('Alignments done : %s' % self.alignments_done)
+        self.logger.info('Pairs found : %s' % self.pairs_found)
+        self.logger.info('Ratio reference set/alignments done : %s'
+                         % (self.alignments_done/float(self.refset_size)))
+        self.logger.info('Ratio target set/alignments done : %s'
+                         % (self.alignments_done/float(self.targetset_size)))
+        self.logger.info('Ratio reference set/pairs found : %s'
+                         % (self.pairs_found/float(self.refset_size)))
+        self.logger.info('Ratio target set/pairs found : %s'
+                         % (self.pairs_found/float(self.targetset_size)))
+        self.logger.info('Maximum comparisons : %s'
+                         % (self.refset_size * self.targetset_size))
+        self.logger.info('Number of blocks : %s' % self.nb_blocks)
+        if self.nb_blocks:
+            self.logger.info('Ratio comparisons/block : %s'
+                             % (float(self.nb_comparisons)/self.nb_blocks))
+        self.logger.info('Blocking reduction : %s'
+                         % (self.nb_comparisons/float(self.refset_size * self.targetset_size)))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/blocking.py	Tue Oct 22 15:56:01 2013 +0200
@@ -0,0 +1,666 @@
+# -*- coding:utf-8 -*-
+# copyright 2012 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr -- mailto:contact@logilab.fr
+#
+# This program is free software: you can redistribute it and/or modify it under
+# the terms of the GNU Lesser General Public License as published by the Free
+# Software Foundation, either version 2.1 of the License, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+""" Blocking techniques.
+
+This module implements a set of blocking techniques used to split
+datasets in smaller subsets that will be aligned in more details.
+
+Additional information:
+
+   P. Christen, Data Matching, Data-Centric Systems and Applications,
+
+
+"""
+from functools import partial
+import warnings
+
+from scipy.spatial import KDTree
+
+from nazca.minhashing import Minlsh
+from nazca.distances import soundexcode
+
+
+###############################################################################
+### GENERAL BLOCKING ##########################################################
+###############################################################################
+class BaseBlocking(object):
+    """ An abstract general blocking object that exposes
+    the API that should be common to all blockings object
+    """
+    def __init__(self, ref_attr_index, target_attr_index):
+        """ Build the blocking object
+
+        Parameters
+        ----------
+
+        ref_attr_index: index of the attribute of interest in a record
+                        for the reference dataset
+                        (i.e. attribute to be used for key computation)
+
+        target_attr_index: index of the attribute of interest in a record
+                           for the target dataset
+                           (i.e. attribute to be used for key computation)
+        """
+        self.ref_attr_index = ref_attr_index
+        self.target_attr_index = target_attr_index
+        self.refids = None
+        self.targetids = None
+        self.is_fitted = False
+
+    def _fit(self, refset, targetset):
+        raise NotImplementedError
+
+    def _iter_blocks(self):
+        """ Internal iteration function over blocks
+        """
+        raise NotImplementedError
+
+    def _cleanup(self):
+        """ Internal cleanup blocking for further use (e.g. in pipeline)
+        """
+        raise NotImplementedError
+
+    def fit(self, refset, targetset):
+        """ Fit the blocking technique on the reference and target datasets
+
+        Parameters
+        ----------
+        refset: a dataset (list of records)
+
+        targetset: a dataset (list of records)
+        """
+        self._fit(refset, targetset)
+        # Keep ids for blocks building
+        self.refids = [(i, r[0]) for i, r in enumerate(refset)]
+        self.targetids = [(i, r[0]) for i, r in enumerate(targetset)]
+        self.is_fitted = True
+
+    def iter_blocks(self):
+        """ Iterator over the different possible blocks.
+
+        Returns
+        -------
+
+        (block1, block2): The blocks are always (reference_block, target_block)
+                          and contains the pair (index, id) of the record in the
+                          corresponding dataset.
+        """
+        assert self.is_fitted
+        return self._iter_blocks()
+
+    def iter_indice_blocks(self):
+        """ Iterator over the different possible blocks.
+
+        Returns
+        -------
+
+        (block1, block2): The blocks are always (reference_block, target_block)
+                          and contains the indexes of the record in the
+                          corresponding dataset.
+        """
+        assert self.is_fitted
+        for block1, block2 in self._iter_blocks():
+            yield [r[0] for r in block1], [r[0] for r in block2]
+
+    def iter_id_blocks(self):
+        """ Iterator over the different possible blocks.
+
+        Returns
+        -------
+
+        (block1, block2): The blocks are always (reference_block, target_block)
+                          and contains the ids of the record in the
+                          corresponding dataset.
+        """
+        assert self.is_fitted
+        for block1, block2 in self._iter_blocks():
+            yield [r[1] for r in block1], [r[1] for r in block2]
+
+    def iter_pairs(self):
+        """ Iterator over the different possible pairs.
+
+        Returns
+        -------
+
+        (pair1, pari2): The pairs are always ((ind_reference, id_reference),
+                                              (ind_target, id_target))
+                        and are the ids of the record in the corresponding dataset.
+        """
+        assert self.is_fitted
+        for block1, block2 in self.iter_blocks():
+            for val1 in block1:
+                for val2 in block2:
+                    yield val1, val2
+
+    def iter_indice_pairs(self):
+        """ Iterator over the different possible pairs.
+
+        Returns
+        -------
+
+        (pair1, pari2): The pairs are always (ind_reference, ind_target)
+                        and are the ids of the record in the corresponding dataset.
+        """
+        assert self.is_fitted
+        for block1, block2 in self.iter_indice_blocks():
+            for val1 in block1:
+                for val2 in block2:
+                    yield val1, val2
+
+    def iter_id_pairs(self):
+        """ Iterator over the different possible pairs.
+
+        Returns
+        -------
+
+        (pair1, pari2): The pairs are always (id_reference, id_target)
+                        and are the ids of the record in the corresponding dataset.
+        """
+        assert self.is_fitted
+        for block1, block2 in self.iter_id_blocks():
+            for val1 in block1:
+                for val2 in block2:
+                    yield val1, val2
+
+    def cleanup(self):
+        """ Cleanup blocking for further use (e.g. in pipeline)
+        """
+        self.is_fitted = True
+        self._cleanup()
+
+
+###############################################################################
+### KEY BLOCKING ##############################################################
+###############################################################################
+class KeyBlocking(BaseBlocking):
+    """ This blocking technique is based on a a blocking criteria
+    (or blocking key), that will be used to divide the datasets.
+
+    The main idea here is:
+
+    1 - to create an index of f(x) for each x in the reference set.
+
+    2 - to create an index of f(y) for each y in the target set.
+
+    3 - to iterate on each distinct value of f(x) and to return
+        the identifiers of the records of the both sets for this value.
+    """
+
+    def __init__(self, ref_attr_index, target_attr_index, callback, ignore_none=False):
+        super(KeyBlocking, self).__init__(ref_attr_index, target_attr_index)
+        self.callback = callback
+        self.ignore_none = ignore_none
+        self.reference_index = {}
+        self.target_index = {}
+
+    def _fit(self, refset, targetset):
+        """ Fit a dataset in an index using the callback
+        """
+        for ind, rec in enumerate(refset):
+            key = self.callback(rec[self.ref_attr_index])
+            if not key and self.ignore_none:
+                continue
+            self.reference_index.setdefault(key, []).append((ind, rec[0]))
+        for ind, rec in enumerate(targetset):
+            key = self.callback(rec[self.target_attr_index])
+            if not key and self.ignore_none:
+                continue
+            self.target_index.setdefault(key, []).append((ind, rec[0]))
+
+    def _iter_blocks(self):
+        """ Iterator over the different possible blocks.
+
+        Returns
+        -------
+
+        (block1, block2): The blocks are always (reference_block, target_block)
+                          and containts the indexes of the record in the
+                          corresponding dataset.
+        """
+        for key, block1 in self.reference_index.iteritems():
+            block2 = self.target_index.get(key)
+            if block1 and block2:
+                yield (block1, block2)
+
+    def _cleanup(self):
+        """ Cleanup blocking for further use (e.g. in pipeline)
+        """
+        self.reference_index = {}
+        self.target_index = {}
+
+
+class SoundexBlocking(KeyBlocking):
+
+    def __init__(self, ref_attr_index, target_attr_index, language='french',):
+        super(SoundexBlocking, self).__init__(ref_attr_index, target_attr_index,
+                                              partial(soundexcode, language=language))
+
+
+###############################################################################
+### BIGRAM BLOCKING ###########################################################
+###############################################################################
+class NGramBlocking(BaseBlocking):
+    """ This blocking technique is based on a a n-gram key.
+    """
+
+    def __init__(self, ref_attr_index, target_attr_index, ngram_size=2, depth=2):
+        super(NGramBlocking, self).__init__(ref_attr_index, target_attr_index)
+        self.ngram_size = ngram_size
+        self.depth = depth
+        self.reference_index = {}
+        self.target_index = {}
+
+    def _fit_dataset(self, dataset, cur_index, attr_index):
+        """ Fit a dataset
+        """
+        for ind, r in enumerate(dataset):
+            cur_dict = cur_index
+            text = r[attr_index]
+            for i in range(self.depth):
+                ngram = text[i*self.ngram_size:(i+1)*self.ngram_size]
+                if i < self.depth - 1:
+                    cur_dict = cur_dict.setdefault(ngram, {})
+            cur_dict.setdefault(ngram, []).append((ind, r[0]))
+
+    def _fit(self, refset, targetset):
+        """ Fit the two sets (reference set and target set)
+        """
+        self._fit_dataset(refset, self.reference_index, self.ref_attr_index)
+        self._fit_dataset(targetset, self.target_index, self.target_attr_index)
+
+    def _iter_dict(self, ref_cur_dict, target_cur_dict):
+        """ Iterative function used to create blocks from dicts
+        """
+        for key, sub_dict in ref_cur_dict.iteritems():
+            if key in target_cur_dict:
+                if isinstance(sub_dict, dict):
+                    # There is another dict layer
+                    for block1, block2 in self._iter_dict(sub_dict, target_cur_dict[key]):
+                        yield block1, block2
+                else:
+                    # This is a list
+                    yield sub_dict, target_cur_dict[key]
+
+    def _iter_blocks(self):
+        """ Iterator over the different possible blocks.
+
+        Returns
+        -------
+
+        (block1, block2): The blocks are always (reference_block, target_block)
+                          and containts the indexes of the record in the
+                          corresponding dataset.
+        """
+        for block1, block2 in self._iter_dict(self.reference_index, self.target_index):
+            if block1 and block2:
+                yield block1, block2
+
+    def _cleanup(self):
+        """ Cleanup blocking for further use (e.g. in pipeline)
+        """
+        self.reference_index = {}
+        self.target_index = {}
+
+
+###############################################################################
+### SORTKEY BLOCKING ##########################################################
+###############################################################################
+class SortedNeighborhoodBlocking(BaseBlocking):
+    """ This blocking technique is based on a a sorting blocking criteria
+    (or blocking key), that will be used to divide the datasets.
+    """
+
+    def __init__(self, ref_attr_index, target_attr_index, key_func=lambda x: x, window_width=20):
+        super(SortedNeighborhoodBlocking, self).__init__(ref_attr_index, target_attr_index)
+        self.key_func = key_func
+        self.window_width = window_width
+        self.sorted_dataset = None
+
+    def _fit(self, refset, targetset):
+        """ Fit a dataset in an index using the callback
+        """
+        self.sorted_dataset = [((ind, r[0]), r[self.ref_attr_index], 0)
+                               for ind, r in enumerate(refset)]
+        self.sorted_dataset.extend([((ind, r[0]), r[self.target_attr_index], 1)
+                                    for ind, r in enumerate(targetset)])
+        self.sorted_dataset.sort(key=lambda x: self.key_func(x[1]))
+
+    def _iter_blocks(self):
+        """ Iterator over the different possible blocks.
+        """
+        for ind, (rid, record, dset) in enumerate(self.sorted_dataset):
+            # Only keep reference set record
+            if dset == 1:
+                continue
+            block1 = [rid,]
+            minind = (ind - self.window_width)
+            minind = minind if minind >=0 else 0
+            maxind = (ind + self.window_width + 1)
+            block2 = [ri for ri, re, d in self.sorted_dataset[minind:maxind]
+                      if d == 1]
+            if block1 and block2:
+                yield (block1, block2)
+
+    def _cleanup(self):
+        """ Cleanup blocking for further use (e.g. in pipeline)
+        """
+        self.sorted_dataset = None
+
+
+###############################################################################
+### MERGE BLOCKING ############################################################
+###############################################################################
+class MergeBlocking(BaseBlocking):
+    """ This blocking technique keep only one appearance of one given values,
+    and removes all the other records having this value.
+    The merge is based on a score function
+
+    E.g.
+      ('http://fr.wikipedia.org/wiki/Paris_%28Texas%29', 'Paris', 25898)
+      ('http://fr.wikipedia.org/wiki/Paris', 'Paris', 12223100)
+
+    could be (with a score function based on the population (third value):
+
+      ('http://fr.wikipedia.org/wiki/Paris', 'Paris', 12223100)
+
+    !!! WARNING !!! This is only done on ONE set (the one with a non null attr index)
+    """
+
+    def __init__(self, ref_attr_index, target_attr_index, score_func):
+        super(MergeBlocking, self).__init__(ref_attr_index, target_attr_index)
+        self.score_func = score_func
+        self.merged_dataset = None
+        self.other_dataset = None
+        if ref_attr_index is None and target_attr_index is None:
+            raise ValueError('At least one of ref_attr_index or target_attr_index '
+                             'should not be None')
+
+    def _fit(self, refset, targetset):
+        """ Fit a dataset in an index using the callback
+        """
+        if self.ref_attr_index is not None:
+            # Merge refset
+            self.merged_dataset = self._merge_dataset(refset, self.ref_attr_index)
+            self.other_dataset = [(ind, r[0]) for ind, r in enumerate(targetset)]
+        else:
+            # Merge targetset
+            self.merged_dataset = self._merge_dataset(targetset, self.target_attr_index)
+            self.other_dataset = [(ind, r[0]) for ind, r in enumerate(refset)]
+
+    def _merge_dataset(self, dataset, attr_index):
+        """ Merge a dataset
+        """
+        merged_dataset_dict = {}
+        for ind, record in enumerate(dataset):
+            score = self.score_func(record)
+            if record[attr_index] not in merged_dataset_dict:
+                # Create new entry
+                merged_dataset_dict[record[attr_index]] = (ind, record, score)
+            elif (record[attr_index] in merged_dataset_dict
+                  and merged_dataset_dict[record[attr_index]][2] < score):
+                # Change current score
+                merged_dataset_dict[record[attr_index]] = (ind, record, score)
+        return [(ind, r[0]) for ind, r, score in merged_dataset_dict.itervalues()]
+
+    def _iter_blocks(self):
+        """ Iterator over the different possible blocks.
+        """
+        if self.ref_attr_index is not None:
+            yield self.merged_dataset, self.other_dataset
+        else:
+            # self.target_attr_index is not None
+            yield self.other_dataset, self.merged_dataset
+
+    def _cleanup(self):
+        """ Cleanup blocking for further use (e.g. in pipeline)
+        """
+        self.merged_dataset = None
+        self.other_dataset = None
+
+
+###############################################################################
+### CLUSTERING-BASED BLOCKINGS ################################################
+###############################################################################
+class KmeansBlocking(BaseBlocking):
+    """ A blocking technique based on Kmeans
+    """
+
+    def __init__(self, ref_attr_index, target_attr_index, n_clusters=None):
+        super(KmeansBlocking, self).__init__(ref_attr_index, target_attr_index)
+        self.n_clusters = n_clusters
+        self.kmeans = None
+        self.predicted = None
+        from sklearn import cluster
+        self.cluster_class = cluster.KMeans
+
+    def _fit(self, refset, targetset):
+        """ Fit the reference dataset.
+        """
+        # If an element is None (missing), use instead the identity element.
+        # The identity element is defined as the 0-vector
+        idelement = tuple([0 for _ in xrange(len(refset[0][self.ref_attr_index]))])
+        # We assume here that there are at least 2 elements in the refset
+        n_clusters = self.n_clusters or (len(refset)/10 or len(refset)/2)
+        kmeans =  self.cluster_class(n_clusters=n_clusters)
+        kmeans.fit([elt[self.ref_attr_index] or idelement for elt in refset])
+        self.kmeans = kmeans
+        # Predict on targetset
+        self.predicted = self.kmeans.predict([elt[self.target_attr_index]
+                                              or idelement for elt in targetset])
+
+    def _iter_blocks(self):
+        """ Iterator over the different possible blocks.
+
+        Returns
+        -------
+
+        (block1, block2): The blocks are always (reference_block, target_block)
+                          and containts the indexes of the record in the
+                          corresponding dataset.
+        """
+        neighbours = [[[], []] for _ in xrange(self.kmeans.n_clusters)]
+        for ind, li in enumerate(self.predicted):
+            neighbours[li][1].append(self.targetids[ind])
+        for ind, li in enumerate(self.kmeans.labels_):
+            neighbours[li][0].append(self.refids[ind])
+        for block1, block2 in neighbours:
+            if len(block1) and len(block2):
+                yield block1, block2
+
+    def _cleanup(self):
+        """ Cleanup blocking for further use (e.g. in pipeline)
+        """
+        self.kmeans = None
+        self.predicted = None
+
+
+###############################################################################
+### KDTREE BLOCKINGS ##########################################################
+###############################################################################
+class KdTreeBlocking(BaseBlocking):
+    """ A blocking technique based on KdTree
+    """
+    def __init__(self, ref_attr_index, target_attr_index, threshold=0.1):
+        super(KdTreeBlocking, self).__init__(ref_attr_index, target_attr_index)
+        self.threshold = threshold
+        self.reftree = None
+        self.targettree = None
+        self.nb_elements = None
+
+    def _fit(self, refset, targetset):
+        """ Fit the blocking
+        """
+        firstelement = refset[0][self.ref_attr_index]
+        self.nb_elements = len(refset)
+        idsize = len(firstelement) if isinstance(firstelement, (tuple, list)) else 1
+        idelement = (0,) * idsize
+        # KDTree is expecting a two-dimensional array
+        if idsize == 1:
+            self.reftree  = KDTree([(elt[self.ref_attr_index],) or idelement for elt in refset])
+            self.targettree = KDTree([(elt[self.target_attr_index],) or idelement for elt in targetset])
+        else:
+            self.reftree = KDTree([elt[self.ref_attr_index] or idelement for elt in refset])
+            self.targettree = KDTree([elt[self.target_attr_index] or idelement for elt in targetset])
+
+    def _iter_blocks(self):
+        """ Iterator over the different possible blocks.
+
+        Returns
+        -------
+
+        (block1, block2): The blocks are always (reference_block, target_block)
+                          and containts the indexes of the record in the
+                          corresponding dataset.
+        """
+        extraneighbours = self.reftree.query_ball_tree(self.targettree, self.threshold)
+        neighbours = []
+        for ind in xrange(self.nb_elements):
+            if not extraneighbours[ind]:
+                continue
+            _ref = [self.refids[ind],]
+            _target = [self.targetids[v] for v in extraneighbours[ind]]
+            neighbours.append((_ref, _target))
+        for block1, block2 in neighbours:
+            if len(block1) and len(block2):
+                yield block1, block2
+
+    def _cleanup(self):
+        """ Cleanup blocking for further use (e.g. in pipeline)
+        """
+        self.reftree = None
+        self.targettree = None
+        self.nb_elements = None
+
+
+###############################################################################
+### MINHASHING BLOCKINGS ######################################################
+###############################################################################
+class MinHashingBlocking(BaseBlocking):
+    """ A blocking technique based on MinHashing
+    """
+    def __init__(self, ref_attr_index, target_attr_index,
+                 threshold=0.1, kwordsgram=1, siglen=200):
+        super(MinHashingBlocking, self).__init__(ref_attr_index, target_attr_index)
+        self.threshold = threshold
+        self.kwordsgram = kwordsgram
+        self.siglen = siglen
+        self.minhasher = Minlsh()
+        self.nb_elements = None
+
+    def _fit(self, refset, targetset):
+        """ Find the blocking using minhashing
+        """
+        # If an element is None (missing), use instead the identity element.
+        idelement = ''
+        self.minhasher.train([elt[self.ref_attr_index] or idelement for elt in refset] +
+                        [elt[self.target_attr_index] or idelement for elt in targetset],
+                        self.kwordsgram, self.siglen)
+        self.nb_elements = len(refset)
+
+    def _iter_blocks(self):
+        """ Iterator over the different possible blocks.
+
+        Returns
+        -------
+
+        (block1, block2): The blocks are always (reference_block, target_block)
+                          and containts the indexes of the record in the
+                          corresponding dataset.
+        """
+        rawneighbours = self.minhasher.predict(self.threshold)
+        neighbours = []
+        for data in rawneighbours:
+            neighbours.append([[], []])
+            for i in data:
+                if i >= self.nb_elements:
+                    neighbours[-1][1].append(self.targetids[i - self.nb_elements])
+                else:
+                    neighbours[-1][0].append(self.refids[i])
+            if len(neighbours[-1][0]) == 0 or len(neighbours[-1][1]) == 0:
+                neighbours.pop()
+        for block1, block2 in neighbours:
+            if len(block1) and len(block2):
+                yield block1, block2
+
+    def _cleanup(self):
+        """ Cleanup blocking for further use (e.g. in pipeline)
+        """
+        self.minhasher = Minlsh()
+        self.nb_elements = None
+
+
+###############################################################################
+### BLOCKING PIPELINE #########################################################
+###############################################################################
+class PipelineBlocking(BaseBlocking):
+    """ Pipeline multiple blocking techniques
+    """
+
+    def __init__(self, blockings, collect_stats=False):
+        """ Build the blocking object
+
+        Parameters
+        ----------
+
+        blockings: ordered list of blocking objects
+        """
+        self.blockings = blockings
+        self.stored_blocks = []
+        self.collect_stats = collect_stats
+        self.stats = {}
+
+    def _fit(self, refset, targetset):
+        """ Internal fit of the pipeline """
+        self._recursive_fit(refset, targetset, range(len(refset)), range(len(targetset)), 0)
+
+    def _recursive_fit(self, refset, targetset, ref_index, target_index, ind):
+        """ Recursive fit of the blockings.
+        Blocks are stored in the stored_blocks attribute.
+        """
+        if ind < len(self.blockings) - 1:
+            # There are other blockings after this one
+            blocking = self.blockings[ind]
+            blocking.cleanup()
+            blocking.fit([refset[i] for i in ref_index],
+                         [targetset[i] for i in target_index])
+            for block1, block2 in blocking.iter_indice_blocks():
+                ind_block1 = [ref_index[i] for i in block1]
+                ind_block2 = [target_index[i] for i in block2]
+                if self.collect_stats:
+                    self.stats.setdefault(ind, []).append((len(block1), len(block2)))
+                self._recursive_fit(refset, targetset, ind_block1, ind_block2, ind+1)
+        else:
+            # This is the final blocking
+            blocking = self.blockings[ind]
+            blocking.cleanup()
+            blocking.fit([refset[i] for i in ref_index],
+                         [targetset[i] for i in target_index])
+            for block1, block2 in blocking.iter_blocks():
+                ind_block1 = [(ref_index[i], _id) for i, _id in block1]
+                ind_block2 = [(target_index[i], _id) for i, _id in block2]
+                if self.collect_stats:
+                    self.stats.setdefault(ind, []).append((len(block1), len(block2)))
+                self.stored_blocks.append((ind_block1, ind_block2))
+
+    def _iter_blocks(self):
+        """ Internal iteration function over blocks
+        """
+        for block1, block2 in self.stored_blocks:
+            if block1 and block2:
+                yield block1, block2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dataio.py	Tue Oct 22 15:56:01 2013 +0200
@@ -0,0 +1,224 @@
+# -*- coding:utf-8 -*-
+# copyright 2012 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr -- mailto:contact@logilab.fr
+#
+# This program is free software: you can redistribute it and/or modify it under
+# the terms of the GNU Lesser General Public License as published by the Free
+# Software Foundation, either version 2.1 of the License, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+
+from os.path import exists as fileexists
+from os import path as osp
+
+import csv
+import urllib
+
+try:
+    from SPARQLWrapper import SPARQLWrapper, JSON
+    SPARQL_ENABLED = True
+except ImportError:
+    SPARQL_ENABLED = False
+
+
+###############################################################################
+### UTILITY FUNCTIONS #########################################################
+###############################################################################
+def autocast(data, encoding=None):
+    """ Try to convert data into a specific type
+    in (int, float, str)
+    """
+    try:
+        return int(data)
+    except ValueError:
+        try:
+            return float(data.replace(',', '.'))
+        except ValueError:
+            data = data.strip()
+            if encoding:
+                return data.decode(encoding)
+            return data
+
+
+###############################################################################
+### RQL FUNCTIONS #############################################################
+###############################################################################
+def rqlquery(host, rql, indexes=None, formatopt=None):
+    """ Run the rql query on the given cubicweb host
+    """
+
+    if host.endswith('/'):
+        host = host[:-1]
+
+    indexes = indexes or []
+    filehandle = urllib.urlopen('%(host)s/view?'
+                                'rql=%(rql)s&vid=csvexport'
+                                % {'rql': rql, 'host': host})
+    filehandle.readline()#Skip the first line
+    return parsefile(filehandle, delimiter=';', indexes=indexes,
+                     formatopt=formatopt);
+
+
+###############################################################################
+### SPARQL FUNCTIONS ##########################################################
+###############################################################################
+def sparqlquery(endpoint, query, indexes=None, autocaste_data=True):
+    """ Run the sparql query on the given endpoint, and wrap the items in the
+    indexes form. If indexes is empty, keep raw output"""
+
+    if not SPARQL_ENABLED:
+        raise ImportError("You have to install SPARQLWrapper and JSON modules to"
+                          "used this function")
+
+    sparql = SPARQLWrapper(endpoint)
+    sparql.setQuery(query)
+    sparql.setReturnFormat(JSON)
+    rawresults = sparql.query().convert()
+    labels = rawresults['head']['vars']
+    results = []
+    indexes = indexes or []
+    if autocaste_data:
+        transform = autocast
+    else:
+        def transform(*args): return args
+    for raw in rawresults["results"]["bindings"]:
+        data = []
+        if not indexes:
+            data = [transform(raw[label]['value']) for label in labels]
+        else:
+            for il, ind in enumerate(indexes):
+                if isinstance(ind, tuple):
+                    data.append(tuple([transform(raw[labels[i]]['value']) for i in ind]))
+                else:
+                    data.append(transform(raw[labels[il]]['value']))
+        results.append(data)
+    return results
+
+
+###############################################################################
+### FILE FUNCTIONS ############################################################
+###############################################################################
+def parsefile(filename, indexes=None, nbmax=None, delimiter='\t',
+              encoding='utf-8', field_size_limit=None, formatopt=None):
+    """ Parse the file (read ``nbmax`` line at maximum if given). Each
+        line is splitted according ``delimiter`` and only ``indexes`` are kept
+
+        eg : The file is :
+                1, house, 12, 19, apple
+                2, horse, 21.9, 19, stramberry
+                3, flower, 23, 2.17, cherry
+
+            >>> data = parsefile('myfile', [0, (2, 3), 4, 1], delimiter=',')
+            data = [[1, (12, 19), u'apple', u'house'],
+                    [2, (21.9, 19), u'stramberry', u'horse'],
+                    [3, (23, 2.17), u'cherry', u'flower']]
+
+            By default, all cells are "autocast" (thanks to the
+            ``autocast()`` function), but you can overpass it thanks to the
+            ``formatopt`` dictionnary. Each key is the index to work on, and the
+            value is the function to call. See the following example:
+
+            >>> data = parsefile('myfile', [0, (2, 3), 4, 1], delimiter=',',
+            >>>                  formatopt={2:lambda x:x.decode('utf-8')})
+            data = [[1, (u'12', 19), u'apple', u'house'],
+                    [2, (u'21.9', 19), u'stramberry', u'horse'],
+                    [3, (u'23', 2.17), u'cherry', u'flower']]
+
+    """
+    def formatedoutput(filename):
+        if field_size_limit:
+            csv.field_size_limit(field_size_limit)
+
+        if isinstance(filename, basestring):
+            csvfile = open(filename, 'r')
+        else:
+            csvfile = filename
+        reader = csv.reader(csvfile, delimiter=delimiter)
+        for row in reader:
+            yield [cell.strip() for cell in row]
+        csvfile.close()
+
+
+
+    result = []
+    indexes = indexes or []
+    formatopt = formatopt or {}
+    for ind, row in enumerate(formatedoutput(filename)):
+        row = [formatopt.get(i, lambda x: autocast(x, encoding))(cell)
+               for i, cell in enumerate(row)]
+        data = []
+        if nbmax and ind > nbmax:
+            break
+        if not indexes:
+            data = row
+        else:
+            for ind in indexes:
+                if isinstance(ind, tuple):
+                    data.append(tuple([row[i] for i in ind]))
+                    if '' in data[-1]:
+                        data[-1] = None
+                elif row[ind]:
+                    data.append(row[ind])
+                else:
+                    data.append(None)
+
+        result.append(data)
+    return result
+
+def write_results(matched, alignset, targetset, resultfile):
+    """ Given a matched dictionnay, an alignset and a targetset to the
+        resultfile
+    """
+    openmode = 'a' if fileexists(resultfile) else 'w'
+    with open(resultfile, openmode) as fobj:
+        if openmode == 'w':
+            fobj.write('aligned;targetted;distance\n')
+        for aligned in matched:
+            for target, dist in matched[aligned]:
+                alignid = alignset[aligned][0]
+                targetid = targetset[target][0]
+                fobj.write('%s;%s;%s\n' %
+                    (alignid.encode('utf-8') if isinstance(alignid, basestring)
+                                             else alignid,
+                     targetid.encode('utf-8') if isinstance(targetid, basestring)
+                                              else targetid,
+                     dist
+                     ))
+
+def split_file(filename, outputdir, nblines=60000):
+    """ Split `filename` into smaller files of ``nblines`` lines. Files are
+        written into `outputdir`.
+
+        Return the list of files
+    """
+    NEW = object()
+
+    def readlines(fobj, nblines):
+        """ yield all lines of the file, and
+        at split-file boundaries, yield a NEW marker
+        """
+        for index, line in enumerate(fobj):
+            if index and index % nblines == 0:
+                yield NEW
+            yield line
+
+    count = 0
+    with open(filename, 'rb') as fobj:
+        outfile = open(osp.join(outputdir, '%s' % count), 'wb')
+        for line in readlines(fobj, nblines):
+            if line is NEW:
+                outfile.close()
+                count += 1
+                outfile = open(osp.join(outputdir, '%s' % count), 'wb')
+                continue
+            outfile.write(line)
+        outfile.close()
+        count += 1
+    return map(str, xrange(count))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debian/changelog	Tue Oct 22 15:56:01 2013 +0200
@@ -0,0 +1,35 @@
+nazca (0.3.0-1) unstable; urgency=low
+
+  * Refactor the API, add standard blocking technics
+
+ -- Vincent michel <Vincent.Michel@logilab.fr>  Tue, 08 Oct 2013 15:35:18 +0200
+
+nazca (0.2.0-3) unstable; urgency=low
+
+  * Make temporal optional depending on dateutil import.
+
+ -- Vincent michel <Vincent.Michel@logilab.fr>  Thu, 25 Apr 2013 16:09:03 +0200
+
+nazca (0.2.0-2) unstable; urgency=low
+
+  * Make dateutil optional.
+
+ -- Vincent michel <vmic@crater2.logilab.fr>  Wed, 24 Apr 2013 10:13:42 +0200
+
+nazca (0.2.0-1.1) unstable; urgency=low
+
+  * Fix python packaging and bad distance choice in align_iterative
+
+ -- Vincent michel <vmic@crater1.logilab.fr>  Tue, 23 Apr 2013 17:02:40 +0200
+
+nazca (0.2.0-1) unstable; urgency=low
+
+  * Bug fixes, add split files utility, update doc.
+
+ -- Vincent Michel <vincent.michel@logilab.fr>  Thu, 04 Apr 2013 18:21:05 +0200
+
+nazca (0.1.0-1) unstable; urgency=low
+
+  * initial release
+
+ -- Vincent Michel <vincent.michel@logilab.fr>  Mon, 17 Dec 2012 13:37:10 +0100
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debian/compat	Tue Oct 22 15:56:01 2013 +0200
@@ -0,0 +1,1 @@
+7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debian/control	Tue Oct 22 15:56:01 2013 +0200
@@ -0,0 +1,12 @@
+Source: nazca
+Section: web
+Priority: optional
+Maintainer: LOGILAB S.A. (Paris, FRANCE) <contact@logilab.fr>
+Build-Depends: debhelper (>= 7), python (>=2.5), python-support
+Standards-Version: 3.9.3
+XS-Python-Version: >= 2.5
+
+Package: nazca
+Architecture: all
+Depends: ${python:Depends}
+Description: Python library for data alignment..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debian/copyright	Tue Oct 22 15:56:01 2013 +0200
@@ -0,0 +1,8 @@
+Upstream Author:
+
+  LOGILAB S.A. (Paris, FRANCE) <contact@logilab.fr>
+
+Copyright:
+
+Copyright (c) 2012 LOGILAB S.A. (Paris, FRANCE).
+http://www.logilab.fr -- mailto:contact@logilab.fr
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debian/rules	Tue Oct 22 15:56:01 2013 +0200
@@ -0,0 +1,55 @@
+#!/usr/bin/make -f
+# Sample debian/rules that uses debhelper.
+# GNU copyright 1997 to 1999 by Joey Hess.
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+build: build-arch build-indep
+build-arch:
+	# Nothing to do
+build-indep: build-stamp
+build-stamp:
+	dh_testdir
+	NO_SETUPTOOLS=1 python setup.py -q build
+	touch build-stamp
+
+clean:
+	dh_testdir
+	dh_testroot
+	rm -f build-stamp configure-stamp
+	rm -rf build
+	find . -name "*.pyc" | xargs rm -f
+	dh_clean
+
+install: build
+	dh_testdir
+	dh_testroot
+	dh_clean -k
+	dh_installdirs -i
+	NO_SETUPTOOLS=1 python setup.py -q install --no-compile --prefix=debian/nazca/usr/
+
+
+# Build architecture-independent files here.
+binary-indep: build install
+	dh_testdir
+	dh_testroot
+	dh_install -i
+	dh_installchangelogs -i
+	dh_installexamples -i
+	dh_installdocs -i
+	dh_installman -i
+	dh_pysupport -i
+	dh_link -i
+	dh_compress -i -X.py -X.ini -X.xml -Xtest
+	dh_fixperms -i
+	dh_installdeb -i
+	dh_gencontrol -i
+	dh_md5sums -i
+	dh_builddeb -i
+
+
+# Build architecture-dependent files here.
+binary-arch:
+
+binary: binary-indep
+.PHONY: build clean binary-arch binary-indep binary
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demo.py	Tue Oct 22 15:56:01 2013 +0200
@@ -0,0 +1,197 @@
+#!/usr/bin/python
+#-*- coding:utf-8 -*-
+
+from os import path
+
+import urllib
+
+import nazca.distances as ald
+import nazca.normalize as aln
+from nazca.aligner import align, subalign, findneighbours, alignall
+from nazca.dataio import parsefile, sparqlquery, write_results
+
+DEMODIR = path.dirname(__file__)
+
+def dpath(filename):
+    return path.join(DEMODIR, 'demo', filename)
+
+def remove_after(string, sub):
+    try:
+        return string[:string.lower().index(sub)].strip()
+    except ValueError:
+        return string
+
+def parserql(host, rql):
+    filehandle = urllib.urlopen('%(host)sview?'
+                                'rql=%(rql)s&vid=csvexport'
+                                % {'rql': rql, 'host': host})
+    filehandle.readline()
+    rset = [[e.decode('utf-8') for e in line.strip().split(';')]
+            for line in filehandle]
+    return rset
+
+def demo_0():
+    # prixgoncourt is the list of Goncourt Prize, extracted
+    # from wikipedia
+
+    #We try to align Goncourt winers onto dbpedia results
+
+    query = """
+       SELECT ?writer, ?name WHERE {
+          ?writer  <http://purl.org/dc/terms/subject> <http://dbpedia.org/resource/Category:French_novelists>.
+          ?writer rdfs:label ?name.
+          FILTER(lang(?name) = 'fr')
+       }
+    """
+
+    print "Sending query to dbpedia"
+    targetset = sparqlquery('http://dbpedia.org/sparql', query)
+    print "Reading the prixgoncourt file"
+    alignset = parsefile(dpath('prixgoncourt'), indexes=[1, 1])
+
+    tr_name = {'normalization': [lambda x:remove_after(x, '('),
+                                 aln.simplify],
+               'metric': ald.levenshtein
+              }
+
+    processings = {1: tr_name}
+
+    print "Alignment started"
+    align(alignset, targetset, 0.4, processings,
+          dpath('demo0_results'))
+
+    print "Done, see the resuls in %s" % dpath('demo0_results')
+
+def demo_1():
+    # FR.txt is an extract of geonames, where locations have been sorted by name
+    # frenchbnf is an extract of french BNF's locations, sorted by name too
+
+    # For each line (ie location) we keep the identifier, the name and the
+    # position (longitude, latitude)
+    # ``nbmax`` is the number of locations to load
+
+    print "Parsing the input files"
+    targetset = parsefile(dpath('FR.txt'), indexes=[0, 1, (4, 5)],
+                          nbmax=2000)
+    alignset = parsefile(dpath('frenchbnf'),
+                         indexes=[0, 2, (14, 12)], nbmax=1000)
+
+
+    # Let's define the processings to apply on the location's name
+    tr_name = {'normalization': [aln.simplify], # Simply all the names (remove
+                                              #   punctuation, lower case, etc)
+               'metric': ald.levenshtein,       # Use the levenshtein distance
+               'weighting': 1                 # Use 1 a name-distance matrix
+                                              #   weighting coefficient
+              }
+    tr_geo = {'normalization': [],              # No normalization needed
+              'metric': ald.geographical,         # Use the geographical distance
+              'metric_params': {'units': 'km'},# Arguments given the
+                                                #   distance function. Here,
+                                                #   the unit to use
+              'weighting': 1
+             }
+
+    processings = {1: tr_name, 2: tr_geo}
+
+    print "Alignment started"
+    align(alignset,           # The dataset to align
+          targetset,          # The target dataset
+          0.4,                # The maximal distance
+                              #   threshold
+          processings,         # The list of processings to
+                              #   apply.
+          dpath('demo1_results'))
+                              # Filename of the output
+                              #   result file
+    # the ``align()`` function return two items
+    # 0. the computed distance matrix
+    # 1. a boolean, True if at least one alignment has been done, False
+    #    otherwise
+    print "Done, see the results in %s" % dpath('demo1_results')
+
+def demo_2():
+    targetset = parsefile(dpath('FR.txt'), indexes=[0, 1, (4, 5)],
+                          formatopt={1:lambda x:x.decode('utf-8')})
+    alignset = parsefile(dpath('frenchbnf'), indexes=[0, 2, (14, 12)],
+                         formatopt={2:lambda x:x.decode('utf-8')}, nbmax=30000)
+
+    print "Finding neighbours"
+    neighbours = findneighbours(alignset, targetset, indexes=(2, 2),
+                               mode='minibatch')
+
+    # Let's define the processings to apply on the location's name
+    tr_name = {'normalization': [aln.simplify], # Simply all the names (remove
+                                              #   punctuation, lower case, etc)
+               'metric': ald.levenshtein,     # Use the levenshtein distance
+               'weighting': 1                 # Use 1 a name-distance matrix
+                                              #   weighting coefficient
+              }
+
+    processings = {1: tr_name}
+    print "Start computation"
+    for ind, (alignid, targetid) in enumerate(neighbours):
+        print '%3d' % ind, len(alignid), 'x', len(targetid)
+        _, matched = subalign(alignset,   # The dataset to align
+                              targetset,  # The target dataset
+                              alignid,
+                              targetid,
+                              0.3,
+                              processings)
+        write_results(matched, alignset, targetset, dpath('demo2_results'))
+    print "Done, see the results in %s" % dpath('demo2_results')
+
+def demo_3():
+    print "Parsing files"
+    alignset = parserql(host='http://demo.cubicweb.org/elections/',
+                        rql='Any E, N WHERE X is Commune, X eid E, X label N')
+    targetset = parsefile(dpath('FR.txt'), indexes=[0, 1])
+    print '%s×%s' % (len(alignset), len(targetset))
+
+    tr_name = {'normalization': [aln.simplify],
+               'metric': 'levenshtein'
+              }
+
+    print "Alignment started"
+    results = alignall(alignset, targetset, 0.75, processings={1: tr_name},
+                       indexes=(1,1), mode='minhashing', kwordsgram=1, siglen=200,
+                       uniq=True)
+    dicresults = dict([(a, b) for (a, b) in results])
+
+    print "Done, writing output"
+
+    with open(dpath('demo3_results'), 'w') as fout:
+        for line in alignset:
+            sent = u'http://demo.cubicweb.org/elections/commune/%s;'\
+                   u'http://www.geonames.org/%s\n' \
+                   % (line[0], dicresults.get(line[0], 'not_found'))
+            fout.write(sent.encode('utf-8'))
+
+    print "See the results in %s" % dpath('demo3_results')
+
+if __name__ == '__main__':
+    import sys
+    from time import time
+    runall = (len(sys.argv) == 1)
+
+    t = time()
+    if runall or '0' in sys.argv:
+        print "Running demo_0"
+        demo_0()
+
+    if runall or '1' in sys.argv:
+        print "Running demo_1"
+        demo_1()
+
+    if runall or '2' in sys.argv:
+        print "Running demo_2"
+        ## Same as demo_1, but in a more efficient way, using a method to find
+        ## neighbours
+        demo_2()
+
+    if runall or '3' in sys.argv:
+        print "Running demo_3"
+        demo_3()
+
+    print "Demo terminated"
+    print "Took %d min" % ((time() - t)/60.)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/distances.py	Tue Oct 22 15:56:01 2013 +0200
@@ -0,0 +1,456 @@
+# -*- coding:utf-8 -*-
+# copyright 2012 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr -- mailto:contact@logilab.fr
+#
+# This program is free software: you can redistribute it and/or modify it under
+# the terms of the GNU Lesser General Public License as published by the Free
+# Software Foundation, either version 2.1 of the License, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+
+from functools import partial
+from math import cos, sqrt, pi #Needed for geographical distance
+try:
+    from dateutil import parser as dateparser
+    DATEUTIL_ENABLED = True
+except ImportError:
+    DATEUTIL_ENABLED = False
+from scipy import matrix, empty
+
+from nazca.normalize import tokenize
+
+
+###############################################################################
+### UTILITY FUNCTIONS #########################################################
+###############################################################################
+def cdist(distance_callback, refset, targetset, matrix_normalized=False,
+          ref_indexes=None, target_indexes=None):
+    """ Compute the metric matrix, given two datasets and a metric
+
+    Parameters
+    ----------
+    refset: a dataset (list of records)
+
+    targetset: a dataset (list of records)
+
+    Returns
+    -------
+
+    A distance matrix, of shape (len(refset), len(targetset))
+    with the distance of each element in it.
+    """
+    ref_indexes = ref_indexes or xrange(len(refset))
+    target_indexes = target_indexes or xrange(len(targetset))
+    distmatrix = empty((len(ref_indexes), len(target_indexes)), dtype='float32')
+    size = distmatrix.shape
+    for i, iref in enumerate(ref_indexes):
+        for j, jref in enumerate(target_indexes):
+            d = 1
+            if refset[iref] and targetset[jref]:
+                d = distance_callback(refset[iref], targetset[jref])
+                if matrix_normalized:
+                    d = 1 - (1.0/(1.0 + d))
+            distmatrix[i, j] = d
+    return distmatrix
+
+def _handlespaces(stra, strb, distance, tokenizer=None, **kwargs):
+    """ Compute the matrix of distances between all tokens of stra and strb
+        (with function ``distance``). Extra args are given to the distance
+        function
+
+        The distance returned is defined as the max of the min of each rows of
+        each distance matrix, see the example above :
+
+                 |  Victor |  Hugo                  Victor | Jean | Hugo
+         Victor  |     0   |    5           Victor |  0    |  6   |  5
+          Jean   |     6   |    4           Hugo   |  5    |  4   |  0
+          Hugo   |     5   |    0
+
+                 --> 4                                --> 0
+
+        Return 4
+    """
+
+    if ' ' not in stra:
+        stra += ' '
+    if ' ' not in strb:
+        strb += ' '
+
+    toka = tokenize(stra, tokenizer)
+    tokb = tokenize(strb, tokenizer)
+    # If not same number of tokens, complete the smallest list with empty strings
+    if len(toka) != len(tokb):
+        mint = toka if len(toka)<len(tokb) else tokb
+        maxt = toka if len(toka)>len(tokb) else tokb
+        mint.extend(['' for i in range(len(maxt)-len(mint))])
+
+    listmatrix = []
+    for i in xrange(len(toka)):
+        listmatrix.append([distance(toka[i], tokb[j], **kwargs) for j in xrange(len(tokb))])
+    m = matrix(listmatrix)
+    minlist = [m[i,:].min() for i in xrange(m.shape[0])]
+    minlist.extend([m[:,i].min() for i in xrange(m.shape[1])])
+    return max(minlist)
+
+
+###############################################################################
+### NUMERICAL DISTANCES #######################################################
+###############################################################################
+def euclidean(a, b):
+    """ Simple euclidian distance
+    """
+    try:
+        return abs(a - b)
+    except TypeError:
+        #a and b may be strings
+        return abs(float(a) - float(b))
+
+
+###############################################################################
+### STRING DISTANCES ##########################################################
+###############################################################################
+def levenshtein(stra, strb, tokenizer=None):
+    """ Compute the Levenshtein distance between stra and strb.
+
+    The Levenshtein distance is defined as the minimal cost to transform stra
+    into strb, where 3 operators are allowed :
+        - Replace one character of stra into a character of strb
+        - Add one character of strb into stra
+        - Remove one character of strb
+
+        If spaces are found in stra or strb, this method returns
+            _handlespaces(stra, strb, levenshtein)
+    """
+    if ' ' in stra or ' ' in strb:
+        return _handlespaces(stra, strb, levenshtein, tokenizer)
+
+    lenb = len(strb)
+    onerowago = None
+    thisrow = range(1, lenb + 1) + [0]
+    for x in xrange(len(stra)):
+        onerowago, thisrow = thisrow, [0]*lenb + [x+1]
+        for y in xrange(lenb):
+            delcost = onerowago[y] + 1
+            addcost = thisrow[y - 1] + 1
+            subcost = onerowago[y - 1] + (stra[x] != strb[y])
+            thisrow[y] = min(delcost, addcost, subcost)
+    return thisrow[lenb - 1]
+
+def soundexcode(word, language='french'):
+    """ Return the Soundex code of the word ``word``
+        For more information about soundex code see wiki_
+
+        ``language`` can be 'french' or 'english'
+
+        .:: wiki_ : https://en.wikipedia.org/wiki/Soundex
+
+        If spaces are found in stra or strb, this method returns
+            _handlespaces(stra, strb), soundex, language=language)
+    """
+
+    vowels = 'AEHIOUWY'
+    if language.lower() == 'french' :
+        consonnantscode = {'B': '1', 'P': '1',
+                           'C': '2', 'K': '2', 'Q': '2',
+                           'D': '3', 'T': '3',
+                           'L': '4',
+                           'M': '5', 'N': '5',
+                           'R': '6',
+                           'G': '7', 'J': '7',
+                           'X': '8', 'Z': '8', 'S': '8',
+                           'F': '9', 'V': '9'
+                          }
+    elif language.lower() == 'english':
+        consonnantscode = {'B': '1', 'F': '1', 'P': '1', 'V': '1',
+                           'C': '2', 'G': '2', 'J': '2', 'K': '2',
+                           'Q': '2', 'S': '2', 'X': '2', 'Z': '2',
+                           'D': '3', 'T': '3',
+                           'L': '4',
+                           'M': '5', 'N': '5',
+                           'R': '6'
+                          }
+    else:
+        raise NotImplementedError('Soundex code is not supported (yet ?) for'
+                                  'this language (%s). '
+                                  'Supported languages are french and english' % language)
+    word = word.strip().upper()
+    code = word[0]
+    #After this ``for`` code is
+    # the first letter of ``word`` followed by all the consonnants of word,
+    # where from consecutive consonnants, only the first is kept,
+    # and from two identical consonnants separated by a W or a H, only the first
+    # is kept too.
+    for i in xrange(1, len(word)):
+        if word[i] in vowels:
+            continue
+        if word[i - 1] not in vowels and \
+           consonnantscode[word[i]] == consonnantscode.get(code[-1], ''):
+            continue
+        if i + 2 < len(word) and word[i + 1] in 'WH' and \
+           consonnantscode[word[i]] == consonnantscode.get(word[i + 2], ''):
+            continue
+        code += word[i]
+        if len(code) > 4:
+            break
+
+    #Replace according to the codes
+    code = code[0] + ''.join([consonnantscode[c] for c in code[1:]])
+    ###First four letters, completed by zeros
+    return code[:4] + '0'*(4 - len(code))
+
+def soundex(stra, strb, language='french', tokenizer=None):
+    """ Return the 1/0 distance between the soundex code of stra and strb.
+        0 means they have the same code, 1 they don't
+    """
+    if ' ' in stra or ' ' in strb:
+        return _handlespaces(stra, strb, soundex, tokenizer=tokenizer, language=language)
+
+    return 0 if (soundexcode(stra, language) == soundexcode(strb, language)) \
+             else 1
+
+def jaccard(stra, strb, tokenizer=None):
+    """ Return the jaccard distance between stra and strb, condering the tokens
+        set of stra and strb. If no tokenizer is given, it use if
+        alignement.normalize.tokenize's default one.
+
+        J(A, B) = (A \cap B)/(A \cup B)
+        d(A, B) = 1 - J(A, B)
+    """
+    seta = set(tokenize(stra, tokenizer))
+    setb = set(tokenize(strb, tokenizer))
+    return generic_jaccard(seta, setb)
+
+def generic_jaccard(seta, setb):
+    """ Return the jaccard distance between two sets A and B.
+
+        J(A, B) = (A \cap B)/(A \cup B)
+        d(A, B) = 1 - J(A, B)
+    """
+    return 1.0 - 1.0*len(seta.intersection(setb))/len(seta.union(setb))
+
+
+###############################################################################
+### TEMPORAL DISTANCES ########################################################
+###############################################################################
+if DATEUTIL_ENABLED:
+    class FrenchParserInfo(dateparser.parserinfo):
+        """ Inherit of the dateutil.parser.parserinfo and translate the english
+            dependant variables into french.
+        """
+
+        HMS = [(u'h', u'heure', u'heures'),
+               (u'm', u'minute', u'minutes'),
+                    (u's', u'seconde', u'seconde'),]
+        JUMP = [u' ', u'.', u',', u';', u'-', u'/', u"'",
+               u'a', u'le', u'et', u'er']
+        MONTHS = [(u'Jan', u'Janvier'), (u'Fev', u'Fevrier'),
+                  (u'Mar', u'Mars'), (u'Avr', u'Avril'), (u'Mai', u'Mai'),
+                  (u'Jun', u'Juin'), (u'Jui', u'Juillet'),
+                  (u'Aou', u'Aout'), (u'Sep', u'Septembre'),
+                  (u'Oct', u'Octobre'), (u'Nov', u'Novembre'),
+                  (u'Dec', u'Decembre')]
+        PERTAIN = [u'de']
+        WEEKDAYS = [(u'Lun', u'Lundi'),
+                    (u'Mar', u'Mardi'),
+                    (u'Mer', u'Mercredi'),
+                    (u'Jeu', u'Jeudi'),
+                    (u'Ven', u'Vendredi'),
+                    (u'Sam', u'Samedi'),
+                    (u'Dim', u'Dimanche')]
+
+    def temporal(stra, strb, granularity=u'days', parserinfo=FrenchParserInfo,
+                 dayfirst=True, yearfirst=False):
+        """ Return the distance between two strings (read as dates).
+
+            ``granularity`` can be either ``days`` or ``months`` or ``years``
+            (be careful to the plural form !)
+            ``language`` can be either french or english
+
+            ``dayfirst`` and ``yearfirst`` are used in case of ambiguity, for
+            instance 09/09/09, by default it assumes it's day/month/year
+
+            Neither stra nor strb can have accent. Clean it before.
+        """
+
+        datea = dateparser.parse(stra, parserinfo=parserinfo(dayfirst,
+                                 yearfirst), fuzzy=True)
+        dateb = dateparser.parse(strb, parserinfo=parserinfo(dayfirst,
+                                 yearfirst), fuzzy=True)
+        diff = datea - dateb
+        if granularity.lower() == 'years':
+            return abs(diff.days/365.25)
+        if granularity.lower() == 'months':
+            return abs(diff.days/30.5)
+        return abs(diff.days)
+
+
+###############################################################################
+### GEOGRAPHICAL DISTANCES ####################################################
+###############################################################################
+def geographical(pointa, pointb, in_radians=False, planet_radius=6371009,
+                 units='m'):
+    """ Return the geographical distance between two points.
+
+        Both points must be tuples (latitude, longitude)
+
+        - in_radians is True, if latitude and longitude are in radians, false
+          otherwise
+        - planetRadius is the planet's radius in meters. By default, it's the
+          Earth'one.
+
+        - `units` can be 'm' (meters) or 'km' (kilometers)
+    """
+    pointa = (float(pointa[0]), float(pointa[1]))
+    pointb = (float(pointb[0]), float(pointb[1]))
+
+    difflat = pointa[0] - pointb[0]
+    difflong = pointa[1] - pointb[1]
+    meanlat = (pointa[0] + pointb[0])/2.0
+
+    if not in_radians:
+        difflat *= pi/180.0
+        difflong *= pi/180.0
+        meanlat *= pi/180.0
+
+    coef = 1. if units == 'm' else 0.001
+    return coef*planet_radius*sqrt(difflat**2 + (cos(meanlat)*difflong)**2)
+
+
+###############################################################################
+### BASE PROCESSING ############################################################
+###############################################################################
+class BaseProcessing(object):
+    """ A processing object used to provide an abstraction over the different
+    distance functions, and help building Nazca process. """
+
+    def __init__(self, ref_attr_index=None, target_attr_index=None,
+                 distance_callback=euclidean, weight=1, matrix_normalized=False):
+        """ Initiate the BaseProcessing
+
+        Parameters
+        ----------
+
+        ref_attr_index: index of the attribute of interest in a record
+                        for the reference dataset
+                        (i.e. attribute to be used for key computation)
+
+        target_attr_index: index of the attribute of interest in a record
+                           for the target dataset
+                           (i.e. attribute to be used for key computation)
+
+        distance_callback: distance callback. Default is euclidean distance.
+
+        weight: weight of the processing in a global distance matrix
+
+        matrix_normalized: Boolean. If matrix_normalized is True,
+                           the distance between two points is changed to
+                           a value between 0 (equal) and 1 (totaly different).
+                           To avoid useless computation and scale
+                           problems the following “normalization” is done:
+                                d = 1 - 1/(1 + d(x, y))
+
+        """
+        self.ref_attr_index = ref_attr_index
+        self.target_attr_index = target_attr_index
+        self.distance_callback = distance_callback
+        self.weight = weight
+        self.matrix_normalized = matrix_normalized
+
+    def distance(self, reference_record, target_record):
+        """ Compute the distance between two records
+
+        Parameters
+        ----------
+        reference_record: a record (tuple/list of values) of the reference dataset.
+
+        target_record: a record (tuple/list of values) of the target dataset.
+
+        """
+        refrecord = (reference_record[self.ref_attr_index] if self.ref_attr_index
+                     else reference_record)
+        targetrecord = (target_record[self.target_attr_index] if self.target_attr_index
+                        else target_record)
+        return self.distance_callback(refrecord, targetrecord)
+
+    def cdist(self, refset, targetset, ref_indexes=None, target_indexes=None):
+        """ Compute the metric matrix, given two datasets and a metric
+
+        Parameters
+        ----------
+        refset: a dataset (list of records)
+
+        targetset: a dataset (list of records)
+
+        Returns
+        -------
+
+        A distance matrix, of shape (len(refset), len(targetset))
+        with the distance of each element in it.
+        """
+        return cdist(self.distance, refset, targetset,
+                     matrix_normalized=self.matrix_normalized,
+                     ref_indexes=ref_indexes, target_indexes=target_indexes)
+
+    def pdist(self, dataset):
+        """ Compute the upper triangular matrix in a way similar
+        to scipy.spatial.metric
+
+        Parameters
+        ----------
+        dataset: a dataset (list of records)
+
+        Returns
+        -------
+
+        The values of the upper triangular distance matrix
+        (of shape (len(dataset), len(dataset)) with the distance of each element in it.
+        The values are sorted as row 1, row2, ...
+        """
+        values = []
+        for i in xrange(len(dataset)):
+            for j in xrange(i+1, len(dataset)):
+                d = 1
+                if dataset[i] and dataset[j]:
+                    d = self.distance(dataset[i], dataset[j])
+                    if self.matrix_normalized:
+                        d = 1 - (1.0/(1.0 + d))
+                values.append(d)
+        return values
+
+
+###############################################################################
+### CONCRETE PROCESSINGS #######################################################
+###############################################################################
+class LevenshteinProcessing(BaseProcessing):
+    """ A processing based on the levenshtein distance.
+    """
+
+    def __init__(self, ref_attr_index=None, target_attr_index=None,
+                 tokenizer=None, weight=1, matrix_normalized=False):
+        distance_callback = partial(levenshtein,
+                                    tokenizer=tokenizer)
+        super(LevenshteinProcessing, self).__init__(ref_attr_index,
+                                                   target_attr_index,
+                                                   distance_callback,
+                                                   weight,matrix_normalized)
+
+
+class GeographicalProcessing(BaseProcessing):
+    """ A processing based on the geographical distance.
+    """
+
+    def __init__(self, ref_attr_index=None, target_attr_index=None,
+                 in_radians=False, planet_radius=6371009, units='m', weight=1, matrix_normalized=False):
+        distance_callback = partial(geographical, in_radians=in_radians,
+                                    planet_radius=planet_radius, units=units)
+        super(GeographicalProcessing, self).__init__(ref_attr_index,
+                                                    target_attr_index,
+                                                    distance_callback,
+                                                    weight,matrix_normalized)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc.rst	Tue Oct 22 15:56:01 2013 +0200
@@ -0,0 +1,412 @@
+
+===========================================================
+ NAZCA - Python library for practical semantics datamining
+===========================================================
+
+Nazca is a Python library to help you enhance and mine your data,
+with a strong focus on semantics information.
+
+In particular, it helps you:
+
+ * interact with SPARQL endpoints and reference databases.
+
+ * align your data (`record linkage`), i.e. link data from
+   your database to data in other databases.
+
+
+Record linkage
+==============
+
+Record linkage (or alignment) is the task that constists in linking together data from two different
+sets, based on some distances between attributes.
+
+For instance, you have a list of cities, described by their name
+and their country and you would like to
+find their URI on dbpedia to have more information about them, as the longitude and
+the latitude for example. If you have two or three cities, it can be done with
+bare hands, but it could not if there are hundreds or thousands cities.
+This library provides you all the stuff we need to do it.
+
+
+
+Introduction
+~~~~~~~~~~~~
+
+The record linkage process is divided into three main steps:
+
+1. Gather and format the data we want to align.
+   In this step, we define two sets called the `referenceset` and the
+   `targetset`. The `referenceset` contains our data, and the
+   `targetset` contains the data on which we would like to make the links.
+
+2. Compute the similarity between the items gathered.  We compute a distance
+   matrix between the two sets according to a given distance.
+
+3. Find the items having a high similarity thanks to the distance matrix.
+
+
+
+Simple case
+~~~~~~~~~~~
+
+1. Let's define `referenceset` and `targetset` as simple python lists.
+
+.. sourcecode:: python
+
+    referenceset = ['Victor Hugo', 'Albert Camus']
+    targetset = ['Albert Camus', 'Guillaume Apollinaire', 'Victor Hugo']
+
+2. Now, we have to compute the similarity between each items. For that purpose, the
+   `Levenshtein distance <http://en.wikipedia.org/wiki/Levenshtein_distance>`_
+   [#]_, which is well accurate to compute the distance between few words, is used.
+   Such a function is provided in the `nazca.distances` module.
+
+   The next step is to compute the distance matrix according to the Levenshtein
+   distance. The result is given in the following tables.
+
+
+   +--------------+--------------+-----------------------+-------------+
+   |              | Albert Camus | Guillaume Apollinaire | Victor Hugo |
+   +==============+==============+=======================+=============+
+   | Victor Hugo  | 6            | 9                     | 0           |
+   +--------------+--------------+-----------------------+-------------+
+   | Albert Camus | 0            | 8                     | 6           |
+   +--------------+--------------+-----------------------+-------------+
+
+.. [#] Also called the *edit distance*, because the distance between two words
+       is equal to the number of single-character edits required to change one
+       word into the other.
+
+
+3. The alignment process is ended by reading the matrix and saying items having a
+   value inferior to a given threshold are identical.
+
+
+A more complex one
+------------------
+
+The previous case was simple, because we had only one *attribute* to align (the
+name), but it is frequent to have a lot of *attributes* to align, such as the name
+and the birth date and the birth city. The steps remains the same, except that
+three distance matrices will be computed, and *items* will be represented as
+nested lists. See the following example:
+
+.. sourcecode:: python
+
+    >>> referenceset = [['Paul Dupont', '14-08-1991', 'Paris'],
+		['Jacques Dupuis', '06-01-1999', 'Bressuire'],
+		['Michel Edouard', '18-04-1881', 'Nantes']]
+    >>> targetset = [['Dupond Paul', '14/08/1991', 'Paris'],
+		['Edouard Michel', '18/04/1881', 'Nantes'],
+                ['Dupuis Jacques ', '06/01/1999', 'Bressuire'],
+                ['Dupont Paul', '01-12-2012', 'Paris']]
+
+
+In such a case, two distance functions are used, the Levenshtein one for the
+name and the city and a temporal one for the birth date [#]_.
+
+.. [#] Provided in the `nazca.distances` module.
+
+
+The :func:`cdist` function of `nazca.distances` enables us to compute those
+matrices :
+
+.. sourcecode:: python
+
+    >>> from nazca.distances import levenshtein, cdist
+    >>> cdist(levenshtein,[a[0] for a in referenceset],
+    >>>       [t[0] for t in targetset], matrix_normalized=False)
+    array([[ 1.,  6.,  5.,  0.],
+           [ 5.,  6.,  0.,  5.],
+           [ 6.,  0.,  6.,  6.]], dtype=float32)
+
++----------------+-------------+----------------+----------------+-------------+
+|                | Dupond Paul | Edouard Michel | Dupuis Jacques | Dupont Paul |
++================+=============+================+================+=============+
+| Paul Dupont    | 1           | 6              | 5              | 0           |
++----------------+-------------+----------------+----------------+-------------+
+| Jacques Dupuis | 5           | 6              | 0              | 5           |
++----------------+-------------+----------------+----------------+-------------+
+| Edouard Michel | 6           | 0              | 6              | 6           |
++----------------+-------------+----------------+----------------+-------------+
+
+.. sourcecode:: python
+
+    >>> from nazca.distances import temporal
+    >>> cdist(temporal, [a[1] for a in referenceset], [t[1] for t in targetset],
+    >>>       matrix_normalized=False)
+    array([[     0.,  40294.,   2702.,   7780.],
+           [  2702.,  42996.,      0.,   5078.],
+           [ 40294.,      0.,  42996.,  48074.]], dtype=float32)
+
++------------+------------+------------+------------+------------+
+|            | 14/08/1991 | 18/04/1881 | 06/01/1999 | 01-12-2012 |
++============+============+============+============+============+
+| 14-08-1991 | 0          | 40294      | 2702       | 7780       |
++------------+------------+------------+------------+------------+
+| 06-01-1999 | 2702       | 42996      | 0          | 5078       |
++------------+------------+------------+------------+------------+
+| 18-04-1881 | 40294      | 0          | 42996      | 48074      |
++------------+------------+------------+------------+------------+
+
+.. sourcecode:: python
+
+    >>> cdist(levenshtein, [a[2] for a in referenceset], [t[2] for t in targetset],
+    >>>       matrix_normalized=False)
+    array([[ 0.,  4.,  8.,  0.],
+           [ 8.,  9.,  0.,  8.],
+           [ 4.,  0.,  9.,  4.]], dtype=float32)
+
++-----------+-------+--------+-----------+-------+
+|           | Paris | Nantes | Bressuire | Paris |
++===========+=======+========+===========+=======+
+| Paris     | 0     | 4      | 8         | 0     |
++-----------+-------+--------+-----------+-------+
+| Bressuire | 8     | 9      | 0         | 8     |
++-----------+-------+--------+-----------+-------+
+| Nantes    | 4     | 0      | 9         | 4     |
++-----------+-------+--------+-----------+-------+
+
+
+The next step is gathering those three matrices into a global one, called the
+`global alignment matrix`. Thus we have :
+
++---+-------+-------+-------+-------+
+|   | 0     | 1     | 2     | 3     |
++===+=======+=======+=======+=======+
+| 0 | 1     | 40304 | 2715  | 7780  |
++---+-------+-------+-------+-------+
+| 1 | 2715  | 43011 | 0     | 5091  |
++---+-------+-------+-------+-------+
+| 2 | 40304 | 0     | 43011 | 48084 |
++---+-------+-------+-------+-------+
+
+Allowing some misspelling mistakes (for example *Dupont* and *Dupond* are very
+close), the matching threshold can be set to 1 or 2. Thus we can see that the
+item 0 in our `referenceset` is the same that the item 0 in the `targetset`, the
+1 in the `referenceset` and the 2 of the `targetset` too : the links can be
+done !
+
+It's important to notice that even if the item 0 of the `referenceset` and the 3
+of the `targetset` have the same name and the same birthplace they are
+unlikely identical because of their very different birth date.
+
+
+You may have noticed that working with matrices as I did for the example is a
+little bit boring. The good news is that this module makes all this job for you. You
+just have to give the sets and distance functions and that's all. An other good
+news is this module comes with the needed functions to build the sets !
+
+
+Real applications
+~~~~~~~~~~~~~~~~~
+
+
+The Goncourt prize
+------------------
+
+On wikipedia, we can find the `Goncourt prize winners
+<http://fr.wikipedia.org/wiki/Prix_Goncourt#Liste_des_laur.C3.A9ats>`_, and we
+would like to establish a link between the winners and their URI on dbpedia
+[#]_.
+
+.. [#] Let's imagine the *Goncourt prize winners* category does not exist in
+       dbpedia
+
+We simply copy/paste the winners list of wikipedia into a file and cleanup
+it a bit. So, the beginning of our file is :
+
+..
+
+    | 1903	John-Antoine Nau
+    | 1904	Léon Frapié
+    | 1905	Claude Farrère
+
+
+When using the high-level functions of this library, each item must have at
+least two elements: an *identifier* (the name, or the URI) and the *attribute* to
+compare.
+For now, the *identifier*
+
+ With the previous file, we will use the name (so the column number 1)
+as *identifier* (we don't have an *URI* here as identifier) and *attribute* to align.
+This is told to python thanks to the following code:
+
+.. sourcecode:: python
+
+   >>> import os.path as osp
+   >>> from nazca import examples
+   >>> filename = osp.join(osp.split(examples.__file__)[0], 'goncourt.csv')
+   >>> referenceset = parsefile(filename, delimiter='\t')
+
+So, the beginning of our `referenceset` is:
+
+.. sourcecode:: python
+
+    >>> referenceset[:3]
+    [[1903, u'John-Antoine Nau'],
+    [1904, u'L\xe9on Frapi\xe9'],
+    [1905, u'Claude Farr\xe8re']]
+
+
+Now, let's build the `targetset` thanks to a *sparql query* and the dbpedia
+end-point:
+
+.. sourcecode:: python
+
+   >>> from nazca.dataio import sparqlquery
+   >>> query = """SELECT ?writer, ?name WHERE {
+   ?writer  <http://purl.org/dc/terms/subject> <http://dbpedia.org/resource/Category:French_novelists>.
+   ?writer rdfs:label ?name.
+   FILTER(lang(?name) = 'fr')
+   } """
+   >>> targetset = sparqlquery('http://dbpedia.org/sparql', query, autocaste_data=False)
+
+Both functions return nested lists as presented before.
+
+
+Now, we have to define the distance function to be used for the alignment.
+This is done thanks to a the `BaseProcessing` class::
+
+.. sourcecode:: python
+
+   >>> from nazca.distances import BaseProcessing, levenshtein
+   >>> processing = BaseProcessing(ref_attr_index=1, target_attr_index=1, distance_callback=levenshtein)
+
+or (equivalent way)::
+
+.. sourcecode:: python
+
+   >>> from nazca.distances import LevenshteinProcessing
+   >>> processing = LevenshteinProcessing(ref_attr_index=1, target_attr_index=1)
+
+Now, we create an aligner (using the `BaseAligner` class):
+
+.. sourcecode:: python
+
+   >>> from nazca.aligner import BaseAligner
+   >>> aligner = BaseAligner(threshold=0, processings=(processing,))
+
+
+To limit the number of comparisons we may add a blocking technic:
+
+.. sourcecode:: python
+
+   >>> from nazca.blocking import SortedNeighborhoodBlocking
+   >>> aligner.register_blocking(SortedNeighborhoodBlocking(1, 1, window_width=4))
+
+
+
+We have the aligned pairs using the `get_aligned_pairs` method of the `BaseAligner`:
+
+.. sourcecode:: python
+
+   >>> for (r, ri), (t, ti), d in aligner.get_aligned_pairs(referenceset, targetset):
+   >>>    print 'Alignment of %s to %s (distance %s)' % (referenceset[ri], targetset[ti], d)
+
+
+
+It may be important to apply some pre-processing on the data to align. For
+instance, names can be written with lower or upper characters, with extra
+characters as punctuation or unwanted information in parenthesis and so on. That
+is why we provide some functions to ``normalize`` your data. The most useful may
+be the :func:`simplify` function (see the docstring for more information).
+
+.. sourcecode:: python
+
+
+   >>> from nazca.normalize import SimplifyNormalizer
+   >>> aligner.register_ref_normalizer(SimplifyNormalizer(attr_index=1))
+
+
+
+Cities alignment
+----------------
+
+The previous case with the ``Goncourt prize winners`` was pretty simply because
+the number of items was small, and the computation fast. But in a more real use
+case, the number of items to align may be huge (some thousands or millions…). Is
+such a case it's unthinkable to build the global alignment matrix because it
+would be too big and it would take (at least...) fews days to achieve the computation.
+So the idea is to make small groups of possible similar data to compute smaller
+matrices (i.e. a *divide and conquer* approach).
+For this purpose, we provide some functions to group/cluster data. We have
+functions to group text and numerical data.
+
+
+This is done by the following python code:
+
+.. sourcecode:: python
+
+   >>> from nazca.dataio import sparqlquery, rqlquery
+   >>> referenceset = sparqlquery('http://dbpedia.inria.fr/sparql',
+		'prefix db-owl: <http://dbpedia.org/ontology/>'
+		'prefix db-prop: <http://fr.dbpedia.org/property/>'
+                'select ?ville, ?name, ?long, ?lat where {'
+                ' ?ville db-owl:country <http://fr.dbpedia.org/resource/France> .'
+                ' ?ville rdf:type db-owl:PopulatedPlace .'
+                ' ?ville db-owl:populationTotal ?population .'
+                ' ?ville foaf:name ?name .'
+                ' ?ville db-prop:longitude ?long .'
+                ' ?ville db-prop:latitude ?lat .'
+                ' FILTER (?population > 1000)'
+                '}',
+                indexes=[0, 1, (2, 3)])
+   >>> targetset = rqlquery('http://demo.cubicweb.org/geonames',
+		'Any U, N, LONG, LAT WHERE X is Location, X name'
+		' N, X country C, C name "France", X longitude'
+		' LONG, X latitude LAT, X population > 1000, X'
+		' feature_class "P", X cwuri U',
+		indexes=[0, 1, (2, 3)])
+
+   >>> from nazca.distances import BaseProcessing, levenshtein
+   >>> processing = BaseProcessing(ref_attr_index=1, target_attr_index=1, distance_callback=levenshtein)
+
+   >>> from nazca.aligner import BaseAligner
+   >>> aligner = BaseAligner(threshold=0, processings=(processing,))
+
+   >>> from nazca.blocking import KdTreeBlocking
+   >>> aligner.register_blocking(KdTreeBlocking(2, 2))
+
+   >>> results = list(aligner.get_aligned_pairs(referenceset, targetset, unique=True))
+
+
+
+Let's explain the code. We have two files, containing a list of cities we want
+to align, the first column is the identifier, and the second is the name of the
+city and the last one is the location of the city (longitude and latitude), gathered
+into a single tuple.
+
+In this example, we want to build a *kdtree* on the couple (latitude, longitude)
+to divide our data into a few candidates. This clustering is coarse, and is only
+used to reduce the potential candidates without loosing any more refined
+possible matches.
+
+So, in the next step, we define the processings to apply, and we add a specific
+ kdtree_ blocking.
+
+Finally, `uniqe` ask to the function to return the best
+candidate (i.e.: the one having the shortest distance below the given threshold)
+
+The function output a generator yielding tuples where the first element is the
+identifier of the `referenceset` item and the second is the `targetset` one (It
+may take some time before yielding the first tuples, because all the computation
+must be done…)
+
+.. _kdtree: http://en.wikipedia.org/wiki/K-d_tree
+
+
+`Try <http://demo.cubicweb.org/nazca/view?vid=nazca>`_ it online !
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+We have also made a little application of Nazca, using `CubicWeb
+<http://www.cubicweb.org/>`_. This application provides a user interface for
+Nazca, helping you to choose what you want to align. You can use sparql or rql
+queries, as in the previous example, or import your own cvs file [#]_. Once you
+have choosen what you want to align, you can click the *Next step* button to
+customize the processings you want to apply, just as you did before in python !
+Once done, by clicking the *Next step*, you start the alignment process. Wait a
+little bit, and you can either download the results in a *csv* or *rdf* file, or
+directly see the results online choosing the *html* output.
+
+.. [#] Your csv file must be tab-separated for the moment…
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/goncourt.csv	Tue Oct 22 15:56:01 2013 +0200
@@ -0,0 +1,110 @@
+1903	John-Antoine Nau
+1904	Léon Frapié
+1905	Claude Farrère
+1906	Jérôme et Jean Tharaud
+1907	Émile Moselly
+1908	Francis de Miomandre
+1909	Marius-Ary Leblond
+1910	Louis Pergaud
+1911	Alphonse de Châteaubriant
+1912	André Savignon
+1913	Marc Elder
+1914	Adrien Bertrand
+1915	René Benjamin
+1916	Henri Barbusse
+1917	Henry Malherbe
+1918	Georges Duhamel
+1919	Marcel Proust
+1920	Ernest Pérochon
+1921	René Maran
+1922	Henri Béraud
+1923	Lucien Fabre
+1924	Thierry Sandre
+1925	Maurice Genevoix
+1926	Henri Deberly
+1927	Maurice Bedel
+1928	Maurice Constantin-Weyer
+1929	Marcel Arland
+1930	Henri Fauconnier
+1931	Jean Fayard
+1932	Guy Mazeline
+1933	André Malraux
+1934	Roger Vercel
+1935	Joseph Peyré
+1936	Maxence Van der Meersch
+1937	Charles Plisnier
+1938	Henri Troyat
+1939	Philippe Hériat
+1940	Francis Ambrière
+1941	Henri Pourrat
+1942	Marc Bernard
+1943	Marius Grout
+1944	Elsa Triolet
+1945	Jean-Louis Bory
+1946	Jean-Jacques Gautier
+1947	Jean-Louis Curtis
+1948	Maurice Druon
+1949	Robert Merle
+1950	Paul Colin
+1951	Julien Gracq
+1952	Béatrix Beck
+1953	Pierre Gascar
+1954	Simone de Beauvoir
+1955	Roger Ikor
+1956	Romain Gary
+1957	Roger Vailland
+1958	Francis Walder
+1959	André Schwarz-Bart
+1960	Vintila Horia
+1961	Jean Cau
+1962	Anna Langfus
+1963	Armand Lanoux
+1964	Georges Conchon
+1965	Jacques Borel
+1966	Edmonde Charles-Roux
+1967	André Pieyre de Mandiargues
+1968	Bernard Clavel
+1969	Félicien Marceau
+1970	Michel Tournier
+1971	Jacques Laurent
+1972	Jean Carrière
+1973	Jacques Chessex
+1974	Pascal Lainé
+1975	Émile Ajar (Romain Gary)
+1976	Patrick Grainville
+1977	Didier Decoin
+1978	Patrick Modiano
+1979	Antonine Maillet
+1980	Yves Navarre
+1981	Lucien Bodard
+1982	Dominique Fernandez
+1983	Frédérick Tristan
+1984	Marguerite Duras
+1985	Yann Queffélec
+1986	Michel Host
+1987	Tahar Ben Jelloun
+1988	Erik Orsenna
+1989	Jean Vautrin
+1990	Jean Rouaud
+1991	Pierre Combescot
+1992	Patrick Chamoiseau
+1993	Amin Maalouf
+1994	Didier van Cauwelaert
+1995	Andreï Makine
+1996	Pascale Roze
+1997	Patrick Rambaud
+1998	Paule Constant
+1999	Jean Echenoz
+2000	Jean-Jacques Schuhl
+2001	Jean-Christophe Rufin
+2002	Pascal Quignard
+2003	Jacques-Pierre Amette
+2004	Laurent Gaudé
+2005	François Weyergans
+2006	Jonathan Littell
+2007	Gilles Leroy
+2008	Atiq Rahimi
+2009	Marie NDiaye
+2010	Michel Houellebecq
+2011	Alexis Jenni
+2012	Jérôme Ferrari
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/minhashing.py	Tue Oct 22 15:56:01 2013 +0200
@@ -0,0 +1,184 @@
+# -*- coding:utf-8 -*-
+# copyright 2012 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr -- mailto:contact@logilab.fr
+#
+# This program is free software: you can redistribute it and/or modify it under
+# the terms of the GNU Lesser General Public License as published by the Free
+# Software Foundation, either version 2.1 of the License, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import cPickle
+
+from random import randint
+from collections import defaultdict
+
+import numpy as np
+from scipy.optimize import bisect
+
+from nazca.normalize import iter_wordgrams
+
+
+def randomhashfunction(zr):
+    """ Return a random hash function, mapping x in Z to ZR
+        h:x -> ax + b mod R
+
+    """
+    bound = max(zr - 1, 1)
+    a = randint(1, bound)
+    b = randint(1, bound)
+
+    def hashfunc(x):
+        return ((a*x + b)%zr)
+
+    return hashfunc
+
+
+class Minlsh(object):
+    """ Operate minhashing + locally-sensitive-hashing to find similar sentences
+    """
+
+    def __init__(self, verbose=False):
+        self._trained = False
+        self.sigmatrix = None
+        self._verbose = verbose
+
+    def train(self, sentences, k=2, siglen=200):
+        """ Train the minlsh on the given sentences.
+
+            - `k` is the length of the k-wordgrams used
+              (the lower k is, the faster is the training)
+            - `siglen` the length of the sentences signature
+
+        """
+
+        rows, shape = self._buildmatrixdocument(sentences, k)
+
+        if self._verbose: print "Training is done. Wait while signaturing"
+
+        self._computesignaturematrix(rows, shape, siglen)
+        self._trained = True
+
+
+    def _buildmatrixdocument(self, sentences, k):
+        """ Return a sparse matrix where :
+
+            - Each sentence is a column
+            - Each row is a element of the universal set
+
+            Each value (r, c) is set to 1 if the element at row r is in the
+            sentence c, 0 otherwise
+
+        """
+
+        rows, universe, sizeofuniverse = [], {}, 0
+        for nb, sent in enumerate(sentences):
+            row = []
+            for w in iter_wordgrams(sent, k):
+                row.append(universe.setdefault(w, sizeofuniverse))
+                if row[-1] == sizeofuniverse:
+                    sizeofuniverse += 1
+            rows.append(row)
+            if self._verbose and nb % 50000 == 0:
+                print nb
+
+        return rows, (len(rows), sizeofuniverse)
+
+    def _computesignaturematrix(self, rows, shape, siglen):
+        """ Return a matrix where each column is the signature the document
+            The signature is composed of `siglen` numbers
+
+            The more the documents have rows in commun, the closer they are.
+        """
+
+        nrows, ncols = shape
+        sig = np.empty((siglen, nrows))
+        #Generate the random hash functions
+        hashfunc = [randomhashfunction(ncols) for _ in xrange(siglen)]
+        #Compute hashing values just for once.
+        #Avoid multiple recomputations for the same column.
+        hashvalues = np.array([[hashfunc[i](r) for r in xrange(ncols)]
+                                for i in  xrange(siglen)])
+
+        docind = 0
+        while rows:
+            doc = rows.pop(0)
+            #Concatenate the needed rows.
+            tmp = np.dstack([hashvalues[:, r] for r in doc])
+            #Take the mininum of hashes
+            sig[:, docind] = np.min(tmp[0], 1)
+            docind += 1
+            if self._verbose and docind % 50000 == 0:
+                print (docind * 100) / nrows
+        self.sigmatrix = sig
+
+    def save(self, savefile):
+        """ Save the training into `savefile` for a future use """
+
+        if not self._trained:
+            print "Not trained, nothing to save"
+            return
+
+        with open(savefile, 'wb') as fobj:
+            pickler = cPickle.Pickler(fobj)
+            pickler.dump(self.sigmatrix)
+
+    def load(self, savefile):
+        """ Load a trained minhashing """
+
+        with open(savefile, 'rb') as fobj:
+            pickler = cPickle.Unpickler(fobj)
+            self.sigmatrix = pickler.load()
+
+        if self.sigmatrix is not None:
+            self._trained = True
+        else:
+            self._trained = False
+
+    def computebandsize(self, threshold, nbrows):
+        """ Compute the bandsize according to the threshold given """
+
+        ### t ~ (1/b)^(1/r), where t is the threshold, b the number of
+        ### bands, and r the number of rows per band. And nbrows (the length
+        ### of the matrix is nbrows = b*r, so t ~ (r/L)^(1/r). So, let's
+        ### find the root of f(x) = (x/L)^(1/r) - t.
+        def f(x):
+            y = pow(x/nbrows, 1. /x) - threshold
+            return y
+
+        ## Solve f(x) = 0, with x having values in [1, nbrows]
+        return int(bisect(f, 1, nbrows))
+
+    def predict(self, threshold):
+        """ Return a set of tuples of *possible* similar sentences
+        """
+        if not self._trained:
+            print "Train it before"
+            return
+
+        if not (0 < threshold <= 1):
+            print "Threshold must be in ]0 ; 1]"
+            return
+
+        sig = self.sigmatrix
+        # Treshold is a percent of similarity
+        # It should be inverted here (0 is closed, 1 is far)
+        threshold = 1 - threshold
+        bandsize = self.computebandsize(threshold, self.sigmatrix.shape[0])
+
+        buckets = defaultdict(set)
+        similars = set()
+        for r in xrange(0, sig.shape[0], bandsize):
+            buckets.clear()
+            for i in xrange(sig.shape[1]):
+                buckets[tuple(sig[r:r+bandsize, i])].add(i)
+            similars.update(set(tuple(v) for v in buckets.itervalues()
+                                         if len(v) > 1))
+        return similars
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/normalize.py	Tue Oct 22 15:56:01 2013 +0200
@@ -0,0 +1,418 @@
+# -*- coding:utf-8 -*-
+# copyright 2012 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr -- mailto:contact@logilab.fr
+#
+# This program is free software: you can redistribute it and/or modify it under
+# the terms of the GNU Lesser General Public License as published by the Free
+# Software Foundation, either version 2.1 of the License, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import re
+from string import punctuation
+from warnings import warn
+from unicodedata import normalize as _uninormalize
+from functools import partial
+
+
+FRENCH_STOPWORDS = set([u'alors', u'au', u'aux', u'aucuns', u'aussi', u'autre', u'avant',
+u'avec', u'avoir', u'bon', u'car', u'ce', u'cela', u'ces', u'ceux', u'chaque',
+u'ci', u'comme', u'comment', u'dans', u'de', u'des', u'du', u'dedans', u'dehors',
+u'depuis', u'deux', u'devrait', u'doit', u'donc', u'dos', u'droite', u'début',
+u'elle', u'elles', u'en', u'encore', u'essai', u'est', u'et', u'eu', u'eux', u'fait',
+u'faites', u'fois', u'font', u'force', u'haut', u'hors', u'ici', u'il', u'ils',
+u'je', u'juste', u'la', u'le', u'les', u'leur', u'lui', u'là', u'ma', u'maintenant',
+u'mais', u'me', u'mes', u'moi', u'moins', u'mon', u'mot', u'même', u'ne',
+u'ni', u'nommés', u'nos',
+u'notre', u'nous', u'nouveaux', u'on', u'ou', u'où', u'par', u'parce', u'parole',
+u'pas', u'personnes', u'peut', u'peu', u'pièce', u'plupart', u'pour',
+u'pourquoi', u'quand', u'que', u'quel', u'quelle', u'quelles', u'quels', u'qui',
+u'sa', u'sans', u'se', u'ses', u'seulement', u'si', u'sien', u'son', u'sont', u'sous',
+u'soyez', u'sujet', u'sur', u'ta', u'tandis', u'tellement', u'te', u'tels', u'tes', u'toi',
+u'ton', u'tous', u'tout', u'trop', u'très', u'tu', u'un', u'une', u'valeur', u'voie',
+u'voient', u'vont', u'vos', u'votre', u'vous', u'vu', u'ça', u'étaient', u'état',
+u'étions', u'été', u'être'])
+
+MANUAL_UNICODE_MAP = {
+    u'\xa1': u'!',    # INVERTED EXCLAMATION MARK
+    u'\u0142': u'l',  # LATIN SMALL LETTER L WITH STROKE
+    u'\u2044': u'/',  # FRACTION SLASH
+    u'\xc6': u'AE',   # LATIN CAPITAL LETTER AE
+    u'\xa9': u'(c)',  # COPYRIGHT SIGN
+    u'\xab': u'"',    # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+    u'\xe6': u'ae',   # LATIN SMALL LETTER AE
+    u'\xae': u'(r)',  # REGISTERED SIGN
+    u'\u0153': u'oe', # LATIN SMALL LIGATURE OE
+    u'\u0152': u'OE', # LATIN CAPITAL LIGATURE OE
+    u'\xd8': u'O',    # LATIN CAPITAL LETTER O WITH STROKE
+    u'\xf8': u'o',    # LATIN SMALL LETTER O WITH STROKE
+    u'\xbb': u'"',    # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+    u'\xdf': u'ss',   # LATIN SMALL LETTER SHARP S
+    }
+
+
+###############################################################################
+### NORMALIZE FUNCTIONS #######################################################
+###############################################################################
+def unormalize(ustring, ignorenonascii=None, substitute=None):
+    """replace diacritical characters with their corresponding ascii characters
+
+    Convert the unicode string to its long normalized form (unicode character
+    will be transform into several characters) and keep the first one only.
+    The normal form KD (NFKD) will apply the compatibility decomposition, i.e.
+    replace all compatibility characters with their equivalents.
+
+    :type substitute: str
+    :param substitute: replacement character to use if decomposition fails
+
+    :see: Another project about ASCII transliterations of Unicode text
+          http://pypi.python.org/pypi/Unidecode
+    """
+    # backward compatibility, ignorenonascii was a boolean
+    if ignorenonascii is not None:
+        warn("ignorenonascii is deprecated, use substitute named parameter instead",
+             DeprecationWarning, stacklevel=2)
+        if ignorenonascii:
+            substitute = ''
+    res = []
+    for letter in ustring[:]:
+        try:
+            replacement = MANUAL_UNICODE_MAP[letter]
+        except KeyError:
+            if isinstance(letter, unicode):
+                replacement = _uninormalize('NFKD', letter)[0]
+            else:
+                replacement = letter
+            if ord(replacement) >= 2 ** 7:
+                if substitute is None:
+                    raise ValueError("can't deal with non-ascii based characters")
+                replacement = substitute
+        res.append(replacement)
+    return u''.join(res)
+
+def lunormalize(sentence, ignorenonascii=None, substitute=None):
+    """ Normalize a sentence (ie remove accents, set to lower, etc) """
+    return unormalize(sentence, ignorenonascii, substitute).lower()
+
+def simplify(sentence, lemmas=None, remove_stopwords=True, stopwords=FRENCH_STOPWORDS):
+    """ Simply the given sentence
+        0) If remove_stopwords, then remove the stop words
+        1) If lemmas are given, the sentence is lemmatized
+        2) Set the sentence to lower case
+        3) Remove punctuation
+    """
+    if lemmas:
+        sentence = lemmatized(sentence, lemmas)
+    sentence = sentence.lower()
+    cleansent = ''.join([s if s not in punctuation
+                           else ' ' for s in sentence]).strip()
+    #comma followed by a space is replaced by two spaces, keep only one
+    cleansent = cleansent.replace('  ', ' ')
+
+    if not remove_stopwords:
+        return cleansent
+    else:
+        return ' '.join([w for w in cleansent.split(' ') if w not in stopwords])
+
+def tokenize(sentence, tokenizer=None, regexp=re.compile(r"[^\s]+")):
+    """ Tokenize a sentence.
+        Use ``tokenizer`` if given, else try to use the nltk WordPunctTokenizer,
+        in case of failure, it just split on spaces.
+
+        Anyway, tokenizer must have a ``tokenize()`` method
+    """
+    if tokenizer:
+        return tokenizer().tokenize(sentence)
+    # XXX Unicode, could not use WorkTokenizer.
+    # Instead split on whitespaces
+    chunks = []
+    for chunk in [t for t in regexp.findall(sentence) if t]:
+        # Deals with '
+        if "'" in chunk:
+            schunks = chunk.split("'")
+            chunks.extend([c+"'" for c in schunks[:-1]])
+            chunks.append(schunks[-1])
+        else:
+            chunks.append(chunk)
+    return chunks
+
+def iter_wordgrams(sentence, k):
+    """ Generator of k-wordgrams on the given sentence
+    """
+    words = sentence.split(' ')
+    #XXX Call tokenizer
+    for r in xrange(len(words)):
+        yield ' '.join(words[r:r + k])
+
+def loadlemmas(filename, encoding='utf-8'):
+    """ Return the default lemmas dictionnary
+    """
+    lemmas = {}
+    with open(filename) as fobj:
+        for line in fobj:
+            line = line.decode(encoding).strip().split('\t')
+            if len(line) == 2:
+                lemmas[line[0]] = line[1]
+    return lemmas
+
+def lemmatized(sentence, lemmas, tokenizer=None):
+    """ Return the lemmatized sentence
+    """
+    tokenized_sent = tokenize(sentence, tokenizer)
+    tokenized_sentformated = []
+    for w in tokenized_sent:
+        if w in ".,'" and len(tokenized_sentformated) > 0:
+            tokenized_sentformated[-1] += w
+        elif w not in punctuation:
+            tokenized_sentformated.append(w)
+    return u' '.join([lemmatized_word(w, lemmas) for w in tokenized_sentformated])
+
+def lemmatized_word(word, lemmas):
+    """ Return the lemmatized word
+    """
+    lemma = lemmas.get(word.lower(), word)
+    if '|' in lemma:
+        _words = lemma.split('|')
+        if word.lower() in _words:
+            lemma = word.lower()
+        else:
+            lemma = _words[0]
+    return lemma
+
+def roundstr(number, ndigits=0):
+    """Return an unicode string of ``number`` rounded to a given precision
+        in decimal digits (default 0 digits)
+
+        If ``number`` is not a float, this method casts it to a float. (An
+        exception may be raised if it's not possible)
+    """
+    return format(round(float(number), ndigits), '0.%df' % ndigits)
+
+def rgxformat(string, regexp, output):
+    """ Apply the regexp to the ``string`` and return a formatted string
+    according to ``output``
+
+    eg :
+        format(u'[Victor Hugo - 26 fev 1802 / 22 mai 1885]',
+               r'\[(?P<firstname>\w+) (?p<lastname>\w+) - '
+               r'(?P<birthdate>.*?) / (?<deathdate>.*?)\]',
+               u'%(lastname)s, %(firstname)s (%(birthdate)s -'
+               u'%(deathdate)s)')
+
+     would return u'Hugo, Victor (26 fev 1802 - 22 mai 1885)'
+     """
+
+    match = re.match(regexp, string)
+    return output % match.groupdict()
+
+
+###############################################################################
+### NORMALIZER OBJECTS ########################################################
+###############################################################################
+class BaseNormalizer(object):
+    """ A normalizer object used to provide an abstraction over the different
+    normalization functions, and help building Nazca process. """
+
+    def __init__(self, callback, attr_index=None):
+        """ Initiate the BaseNormalizer
+
+        Parameters
+        ----------
+        callback: normalization callback
+
+        attr_index: index of the attribute of interest in a record
+                    (i.e. attribute to be normalized).
+                    By default, 'attr_index' is None and the whole
+                    record is passed to the callback.
+                    If given, only the attr_index value of the record
+                    is passed to the the callback.
+                    Could be a list or an int
+        """
+        self.callback = callback
+        if attr_index:
+            self.attr_index = attr_index if isinstance(attr_index, (tuple, list)) else (attr_index,)
+        else:
+            self.attr_index = attr_index
+
+    def normalize(self, record):
+        """ Normalize a record
+
+        Parameters
+        ----------
+        record: a record (tuple/list of values).
+
+        Returns
+        -------
+
+        record: the normalized record.
+        """
+        if not self.attr_index:
+            return self.callback(record)
+        else:
+            for attr_ind in self.attr_index:
+                record = list(r if ind != attr_ind else self.callback(r)
+                               for ind, r in enumerate(record))
+            return record
+
+    def normalize_dataset(self, dataset, inplace=False):
+        """ Normalize a dataset
+
+        Parameters
+        ----------
+        dataset: a list of record (tuple/list of values).
+
+        inplace: Boolean. If True, normalize the dataset in place.
+
+        Returns
+        -------
+
+        record: the normalized dataset.
+        """
+        if not inplace:
+            dataset = [self.normalize(record) for record in dataset]
+        else:
+            # Change dataset in place
+            for ind, record in enumerate(dataset):
+                dataset[ind] = self.normalize(record)
+        return dataset
+
+
+class UnicodeNormalizer(BaseNormalizer):
+    """ Normalizer that unormalize the unicode
+    (i.e. replace accentuating characters by ASCII ones)
+    """
+    def __init__(self, attr_index=None, ignorenonascii=None, substitute=None):
+        callback = partial(lunormalize, ignorenonascii=ignorenonascii, substitute=substitute)
+        super(UnicodeNormalizer, self).__init__(callback, attr_index=attr_index)
+
+
+class SimplifyNormalizer(BaseNormalizer):
+    """ Normalizer that simplify a string
+        0) If remove_stopwords, then remove the stop words
+        1) If lemmas are given, the sentence is lemmatized
+        2) Set the sentence to lower case
+        3) Remove punctuation
+    """
+    def __init__(self, attr_index=None, lemmas=None, remove_stopwords=True):
+        callback = partial(simplify, lemmas=lemmas, remove_stopwords=remove_stopwords)
+        super(SimplifyNormalizer, self).__init__(callback, attr_index=attr_index)
+
+
+class TokenizerNormalizer(BaseNormalizer):
+    """ Normalizer that tokenize a string
+        Use ``tokenizer`` if given, else try to use the nltk WordPunctTokenizer,
+        in case of failure, it just split on spaces.
+        Anyway, tokenizer must have a ``tokenize()`` method
+    """
+    def __init__(self, attr_index=None, tokenizer=None, regexp=re.compile(r"[^\s]+")):
+        callback = partial(tokenize, tokenizer=tokenizer, regexp=regexp)
+        super(TokenizerNormalizer, self).__init__(callback, attr_index=attr_index)
+
+
+class LemmatizerNormalizer(BaseNormalizer):
+    """ Normalizer that lemmatize a string
+    """
+    def __init__(self, lemmas, attr_index=None, tokenizer=None):
+        callback = partial(lemmatized, lemmas=lemmas, tokenizer=tokenizer)
+        super(LemmatizerNormalizer, self).__init__(callback, attr_index=attr_index)
+
+
+class RoundNormalizer(BaseNormalizer):
+    """Normalizer that round a string
+    Return an unicode string of ``number`` rounded to a given precision
+    in decimal digits (default 0 digits)
+
+    If ``number`` is not a float, this method casts it to a float. (An
+    exception may be raised if it's not possible)
+    """
+    def __init__(self, attr_index=None, ndigits=0):
+        callback = partial(roundstr, ndigits=ndigits)
+        super(RoundNormalizer, self).__init__(callback, attr_index=attr_index)
+
+
+class RegexpNormalizer(BaseNormalizer):
+    """Normalizer that normalize a string based on a regexp
+
+     Apply the regexp to the ``string`` and return a formatted string
+    according to ``output``
+
+    eg :
+        format(u'[Victor Hugo - 26 fev 1802 / 22 mai 1885]',
+               r'\[(?P<firstname>\w+) (?p<lastname>\w+) - '
+               r'(?P<birthdate>.*?) / (?<deathdate>.*?)\]',
+               u'%(lastname)s, %(firstname)s (%(birthdate)s -'
+               u'%(deathdate)s)')
+
+     would return u'Hugo, Victor (26 fev 1802 - 22 mai 1885)'
+    """
+    def __init__(self, regexp, output, attr_index=None):
+        callback = partial(rgxformat, regexp=regexp, output=output)
+        super(RegexpNormalizer, self).__init__(callback, attr_index=attr_index)
+
+
+###############################################################################
+### JOIN NORMALIZER ###########################################################
+###############################################################################
+class JoinNormalizer(BaseNormalizer):
+    """Normalizer that join multiple fields in only one.
+    This new field will be put at the end of the new record.
+    """
+    def __init__(self, attr_indexes, join_car=', '):
+        self.attr_indexes = attr_indexes
+        self.join_car = join_car
+
+    def normalize(self, record):
+        """ Normalize a record
+
+        Parameters
+        ----------
+        record: a record (tuple/list of values).
+
+        Returns
+        -------
+
+        record: the normalized record.
+        """
+        _record = [r for ind, r in enumerate(record) if ind not in self.attr_indexes]
+        _record.append(self.join_car.join([r for ind, r in enumerate(record) if ind in self.attr_indexes]))
+        return _record
+
+
+###############################################################################
+### NORMALIZER PIPELINE #######################################################
+###############################################################################
+class NormalizerPipeline(BaseNormalizer):
+    """ Pipeline of Normalizers
+    """
+
+    def __init__(self, normalizers):
+        """ Initiate the NormalizerPipeline
+
+        Parameters
+        ----------
+        normalizers: list (ordered) of Normalizer
+        """
+        self.normalizers = normalizers
+
+    def normalize(self, record):
+        """ Normalize a record
+
+        Parameters
+        ----------
+        record: a record (tuple/list of values).
+
+        Returns
+        -------
+
+        record: the normalized record.
+        """
+        for normalizer in self.normalizers:
+            record = normalizer.normalize(record)
+        return record
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/old_api.py	Tue Oct 22 15:56:01 2013 +0200
@@ -0,0 +1,432 @@
+# -*- coding:utf-8 -*-
+#
+# copyright 2012 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr -- mailto:contact@logilab.fr
+#
+# This program is free software: you can redistribute it and/or modify it under
+# the terms of the GNU Lesser General Public License as published by the Free
+# Software Foundation, either version 2.1 of the License, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+
+from os import listdir
+import os.path as osp
+from shutil import rmtree
+from tempfile import mkdtemp
+import sys
+import warnings
+from functools import partial
+
+from scipy.sparse import lil_matrix
+
+from nazca.dataio import write_results, split_file, parsefile
+from nazca.normalize import BaseNormalizer, NormalizerPipeline
+from nazca.blocking import KmeansBlocking, KdTreeBlocking, MinHashingBlocking
+from nazca.distances import GeographicalProcessing
+from nazca.aligner import BaseAligner
+
+
+# Backward compatibility. Now, use the BaseAligner inside the functions.
+# Perhaps these functions may be removed later...
+
+
+###############################################################################
+### NORMALIZE FUNCTIONS #######################################################
+###############################################################################
+# Backward compatibility. Now, use the NormalizerPipeline inside the functions.
+# Perhaps these functions may be removed later...
+
+def normalize_set(rset, processings):
+    """ Apply all the normalization functions to the given rset """
+    warnings.warn(DeprecationWarning('This function will be removed '
+                                     'in the next release.'
+                                     'You should rather use the BaseNormalizer '
+                                     'object of the normalize module'))
+    normalizers = []
+    for ind, processing in processings.iteritems():
+        for normalizer in extract_normalization_from_treatment(processing, ind):
+            normalizers.append(normalizer)
+    # Create pipeline
+    pipeline = NormalizerPipeline(normalizers)
+    return pipeline.normalize_dataset(rset)
+
+def extract_normalization_from_treatment(processing, ind):
+    """ Extract normalization from processing.
+    This function is used for backward compatibility with
+    the old function-based API """
+    warnings.warn(DeprecationWarning('This function will be removed '
+                                     'in the next release.'
+                                     'You should rather use the BaseNormalizer '
+                                     'object of the normalize module'))
+    for f in processing.get('normalization', []):
+        farg = f.func_code.co_varnames #List of the arguments of f
+        # A kind of union between the arguments needed by f, and the
+        # provided ones
+        givenargs = dict((arg, processing['norm_params'][arg])
+                         for arg in farg if arg in processing.get('norm_params', []))
+        callback = f
+        if givenargs:
+            callback = partial(callback, **givenargs)
+        yield BaseNormalizer(callback=callback, attr_index=ind)
+
+def extract_treatment_from_treatment(processing, ind):
+    """ Extract Treatment object from processing dict.
+    This is only for backward compatibility with the old API.
+    """
+    if processing['metric'] == 'geographical':
+        return GeographicalProcessing(ind, ind,
+                                     matrix_normalized=processing.get('matrix_normalized', False),
+                                     **processing.get('metric_params', {}))
+
+
+###############################################################################
+### ALIGNER ###################################################################
+###############################################################################
+def align(alignset, targetset, threshold, processings=None, resultfile=None,
+          _applyNormalization=True):
+    """ Try to align the items of alignset onto targetset's ones
+
+        `alignset` and `targetset` are the sets to align. Each set contains
+        lists where the first column is the identifier of the item,
+        and the others are
+        the attributs to align. (Note that the order is important !) Both must
+        have the same number of columns.
+
+        `processings` is a dictionary of dictionaries.
+        Each key is the indice of the row, and each value is a dictionary
+        that contains the processings to do on the different attributs.
+        Each dictionary is built as the following:
+
+            processing = {'normalization': [f1, f2, f3],
+                         'norm_params': {'arg1': arg01, 'arg2': arg02},
+                         'metric': d1,
+                         'metric_params': {'arg1': arg11},
+                         'weighting': w,
+                         'matrix_normalize': True
+                        }
+
+            `normalization` is the list of functions called to normalize the
+            given attribut (in order). Each functions is called with `norm_params`
+            as arguments
+
+            Idem for `distance` and `distance_args`
+
+            `weighting` is the weighting for the current attribut in regard to
+            the others
+
+            `resultfile` (default is None). Write the matched elements in a file.
+
+        Return the distance matrix and the matched list.
+    """
+    warnings.warn(DeprecationWarning('This function will be removed in the next '
+                                     'release.'
+                                     ' You should rather use the BaseAligner '
+                                     'object of the aligner module'))
+    processings = processings or {}
+    # Get the normalizers
+    normalizers = []
+    for ind, processing in processings.iteritems():
+        for normalizer in extract_normalization_from_treatment(processing, ind):
+            normalizers.append(normalizer)
+    # Cleanup processings
+    for t in processings.itervalues():
+        if 'normalization' in t:
+            t.pop('normalization')
+        if 'norm_params' in t:
+            t.pop('norm_params')
+    # Build aligner
+    processings = [extract_treatment_from_treatment(t, ind) for ind, t in processings.iteritems()]
+    aligner = BaseAligner(threshold, processings)
+    aligner.register_ref_normalizer(normalizers)
+    aligner.register_target_normalizer(normalizers)
+    # Align
+    return aligner.align(alignset, targetset)
+
+def subalign(alignset, targetset, alignind, targetind, threshold,
+             processings=None, _applyNormalization=True):
+    """ Compute a subalignment for a list of indices of the alignset and
+    a list of indices for the targetset """
+    warnings.warn(DeprecationWarning('This function will be removed in the next '
+                                     'release.'
+                                     ' You should rather use the BaseAligner '
+                                     'object of the aligner module'))
+    mat, matched = align([alignset[i[0]] for i in alignind],
+                         [targetset[i[0]] for i in targetind], threshold,
+                         processings, _applyNormalization=_applyNormalization)
+    new_matched = {}
+    for k, values in matched.iteritems():
+        new_matched[alignind[k]] = [(targetind[i], d) for i, d in values]
+    return mat, new_matched
+
+def conquer_and_divide_alignment(alignset, targetset, threshold, processings=None,
+                                 indexes=(1,1), mode='kdtree', neighbours_threshold=0.1,
+                                 n_clusters=None, kwordsgram=1, siglen=200,
+                                 get_global_mat=True):
+    """ Full conquer and divide method for alignment.
+    Compute neighbours and merge the different subalignments.
+    """
+    warnings.warn(DeprecationWarning('This function will be removed in the next '
+                                     'release.'
+                                     ' You should rather use the BaseAligner '
+                                     'object of the aligner module'))
+    global_matched = {}
+    if get_global_mat:
+        global_mat = lil_matrix((len(alignset), len(targetset)))
+
+    processings = processings or {}
+    ralignset = normalize_set(alignset, processings)
+    rtargetset = normalize_set(targetset, processings)
+
+    for alignind, targetind in findneighbours(ralignset, rtargetset, indexes, mode,
+                                              neighbours_threshold, n_clusters,
+                                              kwordsgram, siglen):
+        _, matched = subalign(alignset, targetset, alignind, targetind,
+                                threshold, processings, _applyNormalization=False)
+        for k, values in matched.iteritems():
+            subdict = global_matched.setdefault(k, set())
+            for v, d in values:
+                subdict.add((v, d))
+                # XXX avoid issue in sparse matrix
+                if get_global_mat:
+                    global_mat[k[0], v[0]] = d or 10**(-10)
+    if get_global_mat:
+        return global_mat, global_matched
+    return global_matched
+
+def alignall(alignset, targetset, threshold, processings=None,
+             indexes=(1,1), mode='kdtree', neighbours_threshold=0.1,
+             n_clusters=None, kwordsgram=1, siglen=200, uniq=False):
+    warnings.warn(DeprecationWarning('This function will be removed in the next '
+                                     'release.'
+                                     ' You should rather use the BaseAligner '
+                                     'object of the aligner module'))
+    if not mode:
+        _, matched = align(alignset, targetset, threshold, processings,
+                           resultfile=None, _applyNormalization=True)
+    else:
+        matched = conquer_and_divide_alignment(alignset, targetset, threshold,
+                                               processings, indexes, mode,
+                                               neighbours_threshold, n_clusters,
+                                               kwordsgram, siglen,
+                                               get_global_mat=False)
+
+    if not uniq:
+        for alignid in matched:
+            for targetid, _ in matched[alignid]:
+                yield alignset[alignid[0]][0], targetset[targetid[0]][0]
+    else:
+        for alignid in matched:
+            bestid, _ = sorted(matched[alignid], key=lambda x:x[1])[0]
+            yield alignset[alignid[0]][0], targetset[bestid[0]][0]
+
+def alignall_iterative(alignfile, targetfile, alignformat, targetformat,
+                       threshold, size=10000, equality_threshold=0.01,
+                       processings=None, indexes=(1,1), mode='kdtree',
+                       neighbours_threshold=0.1, n_clusters=None, kwordsgram=1,
+                       siglen=200, cache=None):
+    """ This function helps you to align *huge* files.
+        It takes your csv files as arguments and split them into smaller ones
+        (files of `size` lines), and runs the alignment on those files.
+
+        `alignformat` and `targetformat` are keyworded arguments given to the
+        nazca.dataio.parsefile function.
+
+        This function returns its own cache. The cache is quite simply a
+        dictionary having align items' id as keys and tuples (target item's id,
+        distance) as value. This dictionary can be regiven to this function to
+        perform another alignment (with different parameters, or just to be
+        sure everything has been caught)
+
+        If the distance of an alignment is below `equality_threshold`, the
+        alignment is considered as perfect, and the corresponding item is
+        removed from the alignset (to speed up the computation).
+    """
+    warnings.warn(DeprecationWarning('This function will be removed in the next '
+                                     'release.'
+                                     ' You should rather use the BaseAligner '
+                                     'object of the aligner module'))
+    #Split the huge files into smaller ones
+    aligndir = mkdtemp()
+    targetdir = mkdtemp()
+    alignfiles = split_file(alignfile, aligndir, size)
+    targetfiles = split_file(targetfile, targetdir, size)
+
+    #Compute the number of iterations that must be done to achieve the alignement
+    nb_iterations = len(alignfiles) * len(targetfiles)
+    current_it = 0
+
+    cache = cache or {} #Contains the better known alignements
+    #Contains the id of perfectly aligned data
+    doneids = set(_id for _id, (_, dist) in cache.iteritems()
+                          if dist < equality_threshold)
+
+    try:
+        for alignfile in alignfiles:
+            alignset = [a for a in parsefile(osp.join(aligndir, alignfile), **alignformat)
+                        if a[0] not in doneids]
+            for targetfile in targetfiles:
+                targetset = parsefile(osp.join(targetdir, targetfile), **targetformat)
+                matched = conquer_and_divide_alignment(alignset, targetset,
+                                                       threshold,
+                                                       processings=processings,
+                                                       indexes=indexes,
+                                                       mode=mode,
+                                                       neighbours_threshold=neighbours_threshold,
+                                                       n_clusters=n_clusters,
+                                                       kwordsgram=kwordsgram,
+                                                       siglen=siglen,
+                                                       get_global_mat=False)
+                for alignid in matched:
+                    bestid, dist = sorted(matched[alignid], key=lambda x:x[1])[0]
+                    #Get the better known distance
+                    _, current_dist = cache.get(alignset[alignid[0]][0], (None, None))
+                    if current_dist is None or current_dist > dist:
+                        #If it's better, update the cache
+                        cache[alignset[alignid[0]][0]] = (targetset[bestid[0]][0], dist)
+                        if dist <= equality_threshold:
+                            #If perfect, stop trying to align this one
+                            doneids.add(alignset[alignid][0])
+
+                current_it += 1
+                sys.stdout.write('\r%0.2f%%' % (current_it * 100. /
+                                                nb_iterations))
+                sys.stdout.flush()
+                if doneids:
+                    alignset = [a for a in alignset if a[0] not in doneids]
+                if not alignset: #All items have been aligned
+                    #TODO Increment current_it.
+                    #The progress of the alignment process is computed with
+                    #`current_it`. If all items of `alignset` are aligned, we
+                    #stop the alignment process for this `alignset`. If
+                    #`current_it` isn’t incremented, the progress shown will be
+                    #false.
+                    break
+
+    finally:
+        rmtree(aligndir)
+        rmtree(targetdir)
+
+    return cache
+
+
+
+
+
+
+
+###############################################################################
+### CLUSTERING-BASED BLOCKINGS FUNCTIONS ######################################
+###############################################################################
+# Backward compatibility. Now, use the BlockingObject inside the functions.
+# Perhaps these functions may be removed later...
+def findneighbours_clustering(alignset, targetset, indexes=(1, 1),
+                              mode='kmeans', n_clusters=None):
+    """ Find the neigbhours using clustering (kmeans or minibatchkmeans)
+    """
+    warnings.warn(DeprecationWarning('This function will be removed in the next '
+                                     'release.'
+                                     ' You should rather use the KmeansBlocking '
+                                     'object of the blocking module'))
+    if mode == 'kmeans':
+        blocking = KmeansBlocking(ref_attr_index=indexes[0],
+                                  target_attr_index=indexes[1],
+                                  n_clusters=n_clusters)
+    elif mode == 'minibatch':
+        blocking = MiniBatchKmeansBlocking(ref_attr_index=indexes[0],
+                                           target_attr_index=indexes[1],
+                                           n_clusters=n_clusters)
+    else:
+        raise ValueError("Mode should be 'kmeans' or 'minibatch'")
+    # Fit blocking object
+    blocking.fit(alignset, targetset)
+    return list(blocking.iter_blocks())
+
+def findneighbours_kdtree(alignset, targetset, indexes=(1, 1), threshold=0.1):
+    """ Find the neigbhours using kdree
+    """
+    warnings.warn(DeprecationWarning('This function will be removed in the next '
+                                     'release.'
+                                     ' You should rather use the KdTreeBlocking '
+                                     'object of the blocking module'))
+    blocking = KdTreeBlocking(ref_attr_index=indexes[0],
+                              target_attr_index=indexes[1],
+                              threshold=threshold)
+    blocking.fit(alignset, targetset)
+    return list(blocking.iter_blocks())
+
+def findneighbours_minhashing(alignset, targetset, indexes=(1, 1), threshold=0.1,
+                              kwordsgram=1, siglen=200):
+    """ Find the neigbhours using minhashing
+    """
+    warnings.warn(DeprecationWarning('This function will be removed in the next '
+                                     'release.'
+                                     ' You should rather use the '
+                                     'MinHashingBlocking '
+                                     'object of the blocking module'))
+    blocking = MinHashingBlocking(ref_attr_index=indexes[0],
+                                  target_attr_index=indexes[1],
+                                  threshold=threshold, kwordsgram=kwordsgram,
+                                  siglen=siglen)
+    blocking.fit(alignset, targetset)
+    return list(blocking.iter_blocks())
+
+def findneighbours(alignset, targetset, indexes=(1, 1), mode='kdtree',
+                   neighbours_threshold=0.1, n_clusters=None, kwordsgram=1, siglen=200):
+    """ This function helps to find neighbours from items of alignset and
+        targetset. “Neighbours” are items that are “not so far”, ie having a
+        close label, are located in the same area etc.
+
+        This function handles two types of neighbouring : text and numeric.
+        For text value, you have to use the “minhashing” and for numeric, you
+        can choose from “kdtree“, “kdmeans“ and “minibatch”
+
+        The arguments to give are :
+            - `alignset` and `targetset` are the sets where neighbours have to
+              be found.
+            - `indexes` are the location of items to compare
+            - `mode` is the search type to use
+            - `neighbours_threshold` is the `mode` neighbours_threshold
+
+            - `n_clusters` is used for "kmeans" and "minibatch" methods, and it
+              is the number of clusters to use.
+
+            - `kwordsgram` and `siglen` are used for "minhashing". `kwordsgram`
+              is the length of wordsgrams to use, and `siglen` is the length of
+              the minhashing signature matrix.
+
+        return a list of lists, built as the following :
+            [
+                [[indexes_of_alignset_0], [indexes_of_targetset_0]],
+                [[indexes_of_alignset_1], [indexes_of_targetset_1]],
+                [[indexes_of_alignset_2], [indexes_of_targetset_2]],
+                [[indexes_of_alignset_3], [indexes_of_targetset_3]],
+                ...
+            ]
+    """
+    warnings.warn(DeprecationWarning('This function will be removed in the next '
+                                     'release.'
+                                     ' You should rather use the '
+                                     'BaseBlocking '
+                                     'objects of the blocking module'))
+    SEARCHERS = set(['kdtree', 'minhashing', 'kmeans', 'minibatch'])
+    mode = mode.lower()
+
+    if mode not in SEARCHERS:
+        raise NotImplementedError('Unknown mode given')
+    if mode == 'kdtree':
+        return findneighbours_kdtree(alignset, targetset, indexes, neighbours_threshold)
+    elif mode == 'minhashing':
+        return findneighbours_minhashing(alignset, targetset, indexes, neighbours_threshold,
+                                         kwordsgram, siglen)
+    elif mode in set(['kmeans', 'minibatch']):
+        try:
+            return findneighbours_clustering(alignset, targetset, indexes, mode, n_clusters)
+        except:
+            raise NotImplementedError('Scikit learn does not seem to be installed')
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/reference_data/countries.py	Tue Oct 22 15:56:01 2013 +0200
@@ -0,0 +1,994 @@
+
+# Countries list (ISO-3166)
+COUNTRIES = {'##': 'non renseign\xc3\xa9',
+             '..': 'non renseign\xc3\xa9',
+             'aa': 'aire g\xc3\xa9ographique ancienne',
+             'ad': 'Andorre',
+             'ae': '\xc3\x89mirats arabes unis',
+             'af': 'Afghanistan',
+             'ag': 'Antigua-et-Barbuda',
+             'ai': 'Anguilla',
+             'al': 'Albanie',
+             'am': 'Arm\xc3\xa9nie',
+             'an': 'Antilles n\xc3\xa9erlandaises',
+             'ao': 'Angola',
+             'aq': 'Antarctique',
+             'ar': 'Argentine',
+             'as': 'Samoa am\xc3\xa9ricaines',
+             'at': 'Autriche',
+             'au': 'Australie',
+             'aw': 'Aruba',
+             'ax': 'Aland (\xc3\xaeles)',
+             'az': 'Azerba\xc3\xafdjan',
+             'ba': 'Bosnie-Herz\xc3\xa9govine',
+             'bb': 'Barbade',
+             'bd': 'Bangladesh',
+             'be': 'Belgique',
+             'bf': 'Burkina',
+             'bg': 'Bulgarie',
+             'bh': 'Bahre\xc3\xafn',
+             'bi': 'Burundi',
+             'bj': 'B\xc3\xa9nin',
+             'bl': 'Saint-Barth\xc3\xa9lemy',
+             'bm': 'Bermudes',
+             'bn': 'Brun\xc3\xa9i',
+             'bo': 'Bolivie',
+             'bq': 'Bonaire, Saint-Eustache et Saba,Saba###Saint-Eustache',
+             'br': 'Br\xc3\xa9sil',
+             'bs': 'Bahamas',
+             'bt': 'Bhoutan',
+             'bv': 'Bouvet (\xc3\xaele)',
+             'bw': 'Botswana',
+             'by': 'Bi\xc3\xa9lorussie,B\xc3\xa9larus',
+             'bz': 'Belize',
+             'ca': 'Canada',
+             'cc': 'Cocos (\xc3\xaeles),Keeling (\xc3\xaeles)',
+             'cd': 'Congo (R\xc3\xa9publique d\xc3\xa9mocratique),Za\xc3\xafre',
+             'cf': 'Centrafrique,R\xc3\xa9publique centrafricaine',
+             'cg': 'Congo,Congo (R\xc3\xa9publique)',
+             'ch': 'Suisse,Conf\xc3\xa9d\xc3\xa9ration helv\xc3\xa9tique',
+             'ci': "C\xc3\xb4te d'Ivoire\n",
+             'ck': 'Cook (\xc3\xaeles)',
+             'cl': 'Chili',
+             'cm': 'Cameroun',
+             'cn': 'Chine,Chine (R\xc3\xa9publique populaire)',
+             'co': 'Colombie',
+             'cr': 'Costa Rica',
+             'cs': 'Serbie-et-Mont\xc3\xa9n\xc3\xa9gro',
+             'cu': 'Cuba',
+             'cv': 'Cap-Vert',
+             'cw': 'Cura\xc3\xa7ao',
+             'cx': 'Christmas (\xc3\xaele)',
+             'cy': 'Chypre',
+             'cz': 'R\xc3\xa9publique tch\xc3\xa8que,Tch\xc3\xa8que, R\xc3\xa9publique',
+             'dd': 'Allemagne (R\xc3\xa9publique d\xc3\xa9mocratique)',
+             'de': 'Allemagne,Allemagne (R\xc3\xa9publique f\xc3\xa9d\xc3\xa9rale)',
+             'dj': 'Djibouti',
+             'dk': 'Danemark',
+             'dm': 'Dominique',
+             'do': 'R\xc3\xa9publique dominicaine,Dominicaine, R\xc3\xa9publique',
+             'dz': 'Alg\xc3\xa9rie',
+             'ec': '\xc3\x89quateur',
+             'ee': 'Estonie',
+             'eg': '\xc3\x89gypte',
+             'eh': 'Sahara occidental',
+             'er': '\xc3\x89rythr\xc3\xa9e',
+             'es': 'Espagne',
+             'et': '\xc3\x89thiopie',
+             'fi': 'Finlande',
+             'fj': 'Fidji',
+             'fk': 'Malouines (\xc3\xaeles),Falkland (\xc3\xaeles)',
+             'fm': 'Micron\xc3\xa9sie,\xc3\x89tats f\xc3\xa9d\xc3\xa9r\xc3\xa9s de Micron\xc3\xa9sie',
+             'fo': 'F\xc3\xa9ro\xc3\xa9 (\xc3\xaeles)',
+             'fr': 'France',
+             'ga': 'Gabon',
+             'gb': 'Grande-Bretagne,Royaume-Uni',
+             'gd': 'Grenade',
+             'ge': 'G\xc3\xa9orgie',
+             'gf': 'Guyane fran\xc3\xa7aise',
+             'gg': 'Guernesey',
+             'gh': 'Ghana',
+             'gi': 'Gibraltar',
+             'gl': 'Groenland',
+             'gm': 'Gambie',
+             'gn': 'Guin\xc3\xa9e',
+             'gp': 'Guadeloupe',
+             'gq': 'Guin\xc3\xa9e \xc3\xa9quatoriale',
+             'gr': 'Gr\xc3\xa8ce',
+             'gs': 'G\xc3\xa9orgie du Sud et les \xc3\xaeles Sandwich du Sud',
+             'gt': 'Guatemala',
+             'gu': 'Guam',
+             'gw': 'Guin\xc3\xa9e-Bissau',
+             'gy': 'Guyana',
+             'hk': 'Hong Kong',
+             'hm': 'Heard (\xc3\xaele) et \xc3\xaeles McDonald',
+             'hn': 'Honduras',
+             'hr': 'Croatie',
+             'ht': 'Ha\xc3\xafti',
+             'hu': 'Hongrie',
+             'id': 'Indon\xc3\xa9sie',
+             'ie': 'Irlande',
+             'ii': 'intergouvernemental',
+             'il': 'Isra\xc3\xabl',
+             'im': '\xc3\x8ele de Man,Man, \xc3\x8ele de',
+             'in': 'Inde',
+             'io': "Territoire britannique de l'Oc\xc3\xa9an indien,Chagos (\xc3\xaeles)###Oc\xc3\xa9an indien, Territoire britannique de l'\n",
+             'iq': 'Irak',
+             'ir': 'Iran',
+             'is': 'Islande',
+             'it': 'Italie',
+             'je': 'Jersey',
+             'jm': 'Jama\xc3\xafque',
+             'jo': 'Jordanie',
+             'jp': 'Japon',
+             'ke': 'Kenya',
+             'kg': 'Kirghizistan',
+             'kh': 'Cambodge',
+             'ki': 'Kiribati',
+             'km': 'Comores',
+             'kn': 'Saint-Kitts-et-Nevis,Saint-Christophe-et-Nevis',
+             'ko': 'Kosovo',
+             'kp': 'Cor\xc3\xa9e (R\xc3\xa9publique populaire d\xc3\xa9mocratique),Cor\xc3\xa9e du Nord',
+             'kr': 'Cor\xc3\xa9e (R\xc3\xa9publique),Cor\xc3\xa9e du Sud',
+             'kw': 'Kowe\xc3\xaft',
+             'ky': 'Cayman,Ca\xc3\xafmanes, \xc3\x8eles###Ca\xc3\xafman (\xc3\xaeles)',
+             'kz': 'Kazakhstan',
+             'la': 'Laos',
+             'lb': 'Liban',
+             'lc': 'Sainte-Lucie',
+             'li': 'Liechtenstein',
+             'lk': 'Sri Lanka',
+             'lr': 'Liberia',
+             'ls': 'Lesotho',
+             'lt': 'Lituanie',
+             'lu': 'Luxembourg',
+             'lv': 'Lettonie',
+             'ly': 'Libye',
+             'ma': 'Maroc',
+             'mc': 'Monaco',
+             'md': 'Moldavie,Moldova, R\xc3\xa9publique de',
+             'me': 'Mont\xc3\xa9n\xc3\xa9gro',
+             'mf': 'Saint-Martin (partie fran\xc3\xa7aise)',
+             'mg': 'Madagascar',
+             'mh': 'Marshall (\xc3\xaeles)',
+             'mk': 'Mac\xc3\xa9doine (R\xc3\xa9publique)',
+             'ml': 'Mali',
+             'mm': 'Myanmar,Birmanie',
+             'mn': 'Mongolie',
+             'mo': 'Macao',
+             'mp': 'Mariannes du Nord (\xc3\xaeles)',
+             'mq': 'Martinique',
+             'mr': 'Mauritanie',
+             'ms': 'Montserrat',
+             'mt': 'Malte',
+             'mu': 'Maurice',
+             'mv': 'Maldives',
+             'mw': 'Malawi',
+             'mx': 'Mexique',
+             'my': 'Malaisie',
+             'mz': 'Mozambique',
+             'na': 'Namibie',
+             'nc': 'Nouvelle-Cal\xc3\xa9donie',
+             'ne': 'Niger',
+             'nf': 'Norfolk (\xc3\xaele)',
+             'ng': 'Nigeria',
+             'ni': 'Nicaragua',
+             'nl': 'Pays-Bas',
+             'no': 'Norv\xc3\xa8ge',
+             'np': 'N\xc3\xa9pal',
+             'nr': 'Nauru',
+             'nu': 'Niue',
+             'nz': 'Nouvelle-Z\xc3\xa9lande',
+             'om': 'Oman',
+             'oo': 'code non adapt\xc3\xa9',
+             'pa': 'Panama',
+             'pe': 'P\xc3\xa9rou',
+             'pf': 'Polyn\xc3\xa9sie fran\xc3\xa7aise',
+             'pg': 'Papouasie-Nouvelle-Guin\xc3\xa9e',
+             'ph': 'Philippines',
+             'pk': 'Pakistan',
+             'pl': 'Pologne',
+             'pm': 'Saint-Pierre-et-Miquelon',
+             'pn': 'Pitcairn',
+             'pr': 'Porto Rico',
+             'ps': 'Autorit\xc3\xa9 palestinienne,Palestine',
+             'pt': 'Portugal',
+             'pw': 'Palau,Palaos',
+             'py': 'Paraguay',
+             'qa': 'Qatar',
+             're': 'R\xc3\xa9union',
+             'ro': 'Roumanie',
+             'rs': 'Serbie',
+             'ru': 'Russie (F\xc3\xa9d\xc3\xa9ration),Russie',
+             'rw': 'Rwanda',
+             'sa': 'Arabie saoudite',
+             'sb': 'Salomon (\xc3\xaeles)',
+             'sc': 'Seychelles',
+             'sd': 'Soudan',
+             'se': 'Su\xc3\xa8de',
+             'sg': 'Singapour',
+             'sh': 'Sainte-H\xc3\xa9l\xc3\xa8ne,Ascension (\xc3\xaele)###Tristan da Cunha (\xc3\xaele)',
+             'si': 'Slov\xc3\xa9nie',
+             'sj': 'Svalbard et \xc3\xaele Jan Mayen',
+             'sk': 'Slovaquie',
+             'sl': 'Sierra Leone',
+             'sm': 'Saint-Marin',
+             'sn': 'S\xc3\xa9n\xc3\xa9gal',
+             'so': 'Somalie',
+             'sr': 'Suriname',
+             'ss': 'Soudan du Sud,Sud Soudan',
+             'st': 'Sao Tom\xc3\xa9-et-Principe',
+             'su': 'URSS',
+             'sv': 'El Salvador,Salvador',
+             'sx': 'Saint-Martin (partie n\xc3\xa9erlandaise),Sint Maarten',
+             'sy': 'Syrie',
+             'sz': 'Swaziland',
+             'tc': 'Turks et Ca\xc3\xafques (\xc3\xaeles)',
+             'td': 'Tchad',
+             'tf': 'Terres australes fran\xc3\xa7aises',
+             'tg': 'Togo',
+             'th': 'Tha\xc3\xaflande',
+             'tj': 'Tadjikistan',
+             'tk': 'Tokelau',
+             'tl': 'Timor oriental',
+             'tm': 'Turkm\xc3\xa9nistan',
+             'tn': 'Tunisie',
+             'to': 'Tonga',
+             'tr': 'Turquie',
+             'tt': 'Trinit\xc3\xa9-et-Tobago',
+             'tv': 'Tuvalu',
+             'tw': 'Ta\xc3\xafwan,Chine (R\xc3\xa9publique)',
+             'tz': 'Tanzanie',
+             'ua': 'Ukraine',
+             'ug': 'Ouganda',
+             'um': '\xc3\x8eles mineures \xc3\xa9loign\xc3\xa9es des \xc3\x89tats-Unis',
+             'us': '\xc3\x89tats-Unis',
+             'uy': 'Uruguay',
+             'uz': 'Ouzb\xc3\xa9kistan',
+             'va': 'Vatican,Saint-Si\xc3\xa8ge',
+             'vc': 'Saint-Vincent-et-les Grenadines',
+             've': 'Venezuela',
+             'vg': '\xc3\x8eles Vierges britanniques,Vierges (\xc3\xaeles) britanniques',
+             'vi': '\xc3\x8eles Vierges am\xc3\xa9ricaines,Vierges (\xc3\xaeles) am\xc3\xa9ricaines',
+             'vn': 'Viet Nam',
+             'vu': 'Vanuatu',
+             'wf': 'Wallis et Futuna (\xc3\xaeles)',
+             'ws': 'Samoa,Samoa occidentales',
+             'xc': 'Tch\xc3\xa9coslovaquie',
+             'xd': 'Allemagne avant 1945',
+             'xe': 'Europe,Union europ\xc3\xa9enne',
+             'xk': 'Cor\xc3\xa9e avant 1948',
+             'xn': 'Pays-Bas avant 1830,Belgique avant 1830',
+             'xx': 'inconnu',
+             'yd': 'Y\xc3\xa9men (R\xc3\xa9publique d\xc3\xa9mocratique populaire),Sud Y\xc3\xa9men',
+             'ye': 'Y\xc3\xa9men',
+             'yt': 'Mayotte',
+             'yu': 'Yougoslavie',
+             'yy': "ne s'applique pas\n",
+             'za': 'Afrique du Sud',
+             'zm': 'Zambie',
+             'zw': 'Zimbabwe',
+             'zz': 'multiple\n'}
+
+
+# REGIONS TO COUNTRIES MAPPING
+REGIONS_TO_COUNTRIES = {u'Abruzzes': u'Italie',
+                        u'Acha\xefe': u'Gr\xe8ce',
+                        u'Acre': u'Br\xe9sil',
+                        u'Afghanistan': u'Afghanistan',
+                        u'Afrique du Sud': u'Afrique du Sud',
+                        u'Aguascalientes': u'Mexique',
+                        u'Ain': u'France',
+                        u'Aisne': u'France',
+                        u'Alabama': u'\xc9tats-Unis',
+                        u'Alagoas': u'Br\xe9sil',
+                        u'Aland (\xeeles)': u'Aland (\xeeles)',
+                        u'Alaska': u'\xc9tats-Unis',
+                        u'Albanie': u'Albanie',
+                        u'Alberta': u'Canada',
+                        u'Alg\xe9rie': u'Alg\xe9rie',
+                        u'Allemagne': u'Allemagne',
+                        u'Allemagne (R\xe9publique d\xe9mocratique)': u'Allemagne (R\xe9publique d\xe9mocratique)',
+                        u'Allemagne avant 1945': u'Allemagne avant 1945',
+                        u'Allier': u'France',
+                        u'Alpes-Maritimes': u'France',
+                        u'Alpes-de-Haute-Provence': u'France',
+                        u'Alsace': u'France',
+                        u'Amapa': u'Br\xe9sil',
+                        u'Amazonas': u'Br\xe9sil',
+                        u'Andalousie': u'Espagne',
+                        u'Andorre': u'Andorre',
+                        u'Angola': u'Angola',
+                        u'Anguilla': u'Anguilla',
+                        u'Antarctique': u'Antarctique',
+                        u'Antigua-et-Barbuda': u'Antigua-et-Barbuda',
+                        u'Antilles n\xe9erlandaises': u'Antilles n\xe9erlandaises',
+                        u'Anvers': u'Belgique',
+                        u'Appenzell-Rhodes-Ext\xe9rieures': u'Suisse',
+                        u'Appenzell-Rhodes-Int\xe9rieures': u'Suisse',
+                        u'Aquitaine': u'France',
+                        u'Arabie saoudite': u'Arabie saoudite',
+                        u'Aragon': u'Espagne',
+                        u'Arcadie': u'Gr\xe8ce',
+                        u'Ardennes': u'France',
+                        u'Ard\xe8che': u'France',
+                        u'Argentine': u'Argentine',
+                        u'Argolide': u'Gr\xe8ce',
+                        u'Argovie': u'Suisse',
+                        u'Arizona': u'\xc9tats-Unis',
+                        u'Ari\xe8ge': u'France',
+                        u'Arkansas': u'\xc9tats-Unis',
+                        u'Arm\xe9nie': u'Arm\xe9nie',
+                        u'Aruba': u'Aruba',
+                        u'Asturies': u'Espagne',
+                        u'Ath\xe8nes et agglom\xe9ration': u'Gr\xe8ce',
+                        u'Attique': u'Gr\xe8ce',
+                        u'Aube': u'France',
+                        u'Aude': u'France',
+                        u'Australie': u'Australie',
+                        u'Australie-M\xe9ridionale': u'Australie',
+                        u'Australie-Occidentale': u'Australie',
+                        u'Autorit\xe9 palestinienne': u'Autorit\xe9 palestinienne',
+                        u'Autriche': u'Autriche',
+                        u'Auvergne': u'France',
+                        u'Aveyron': u'France',
+                        u'Azerba\xefdjan': u'Azerba\xefdjan',
+                        u'Bade-Wurtemberg': u'Allemagne',
+                        u'Bahamas': u'Bahamas',
+                        u'Bahia': u'Br\xe9sil',
+                        u'Bahre\xefn': u'Bahre\xefn',
+                        u'Baja California Norte': u'Mexique',
+                        u'Baja California Sur': u'Mexique',
+                        u'Bangladesh': u'Bangladesh',
+                        u'Barbade': u'Barbade',
+                        u'Bas-Rhin': u'France',
+                        u'Basilicate': u'Italie',
+                        u'Basse-Autriche': u'Autriche',
+                        u'Basse-Normandie': u'France',
+                        u'Basse-Saxe': u'Allemagne',
+                        u'Bavi\xe8re': u'Allemagne',
+                        u'Belgique': u'Belgique',
+                        u'Belize': u'Belize',
+                        u'Berlin': u'Allemagne',
+                        u'Bermudes': u'Bermudes',
+                        u'Berne': u'Suisse',
+                        u'Bhoutan': u'Bhoutan',
+                        u'Bi\xe9lorussie': u'Bi\xe9lorussie',
+                        u'Bolivie': u'Bolivie',
+                        u'Bonaire, Saint-Eustache et Saba': u'Bonaire, Saint-Eustache et Saba',
+                        u'Bosnie-Herz\xe9govine': u'Bosnie-Herz\xe9govine',
+                        u'Botswana': u'Botswana',
+                        u'Bouches-du-Rh\xf4ne': u'France',
+                        u'Bourgogne': u'France',
+                        u'Bouvet (\xeele)': u'Bouvet (\xeele)',
+                        u'Brabant': u'Belgique',
+                        u'Brabant flamand': u'Belgique',
+                        u'Brabant wallon': u'Belgique',
+                        u'Brabant-Septentrional': u'Pays-Bas',
+                        u'Brandebourg': u'Allemagne',
+                        u'Bretagne': u'France',
+                        u'Brun\xe9i': u'Brun\xe9i',
+                        u'Bruxelles': u'Belgique',
+                        u'Br\xe9sil': u'Br\xe9sil',
+                        u'Br\xeame': u'Allemagne',
+                        u'Buenos Aires': u'Argentine',
+                        u'Bulgarie': u'Bulgarie',
+                        u'Burgenland': u'Autriche',
+                        u'Burkina': u'Burkina',
+                        u'Burundi': u'Burundi',
+                        u'B\xe2le-Campagne': u'Suisse',
+                        u'B\xe2le-Ville': u'Suisse',
+                        u'B\xe9nin': u'B\xe9nin',
+                        u'B\xe9otie': u'Gr\xe8ce',
+                        u'Calabre': u'Italie',
+                        u'Californie': u'\xc9tats-Unis',
+                        u'Calvados': u'France',
+                        u'Cambodge': u'Cambodge',
+                        u'Cameroun': u'Cameroun',
+                        u'Campanie': u'Italie',
+                        u'Campeche': u'Mexique',
+                        u'Canada': u'Canada',
+                        u'Canaries': u'Espagne',
+                        u'Cantabrie': u'Espagne',
+                        u'Cantal': u'France',
+                        u'Cap-Vert': u'Cap-Vert',
+                        u'Capitale f\xe9d\xe9rale': u'Argentine',
+                        u'Carinthie': u'Autriche',
+                        u'Caroline du Nord': u'\xc9tats-Unis',
+                        u'Caroline du Sud': u'\xc9tats-Unis',
+                        u'Castille et L\xe9on': u'Espagne',
+                        u'Castille-la Manche': u'Espagne',
+                        u'Catalogne': u'Espagne',
+                        u'Catamarca': u'Argentine',
+                        u'Cayman': u'Cayman',
+                        u'Cear\xe1': u'Br\xe9sil',
+                        u'Centrafrique': u'Centrafrique',
+                        u'Centre': u'France',
+                        u'Ceuta': u'Espagne',
+                        u'Chaco': u'Argentine',
+                        u'Chalcidique': u'Gr\xe8ce',
+                        u'Champagne-Ardenne': u'France',
+                        u'Charente': u'France',
+                        u'Charente-Maritime': u'France',
+                        u'Cher': u'France',
+                        u'Chiapas': u'Mexique',
+                        u'Chihuahua': u'Mexique',
+                        u'Chili': u'Chili',
+                        u'Chine': u'Chine',
+                        u'Christmas (\xeele)': u'Christmas (\xeele)',
+                        u'Chubut': u'Argentine',
+                        u'Chypre': u'Chypre',
+                        u'Ch\xedos': u'Gr\xe8ce',
+                        u'Coahuila': u'Mexique',
+                        u'Cocos (\xeeles)': u'Cocos (\xeeles)',
+                        u'Colima': u'Mexique',
+                        u'Colombie': u'Colombie',
+                        u'Colombie britannique': u'Canada',
+                        u'Colorado': u'\xc9tats-Unis',
+                        u'Communaut\xe9 de Madrid': u'Espagne',
+                        u'Communaut\xe9 de Valence': u'Espagne',
+                        u'Comores': u'Comores',
+                        u'Congo': u'Congo',
+                        u'Congo (R\xe9publique d\xe9mocratique)': u'Congo (R\xe9publique d\xe9mocratique)',
+                        u'Connecticut': u'\xc9tats-Unis',
+                        u'Cook (\xeeles)': u'Cook (\xeeles)',
+                        u'Corfou': u'Gr\xe8ce',
+                        u'Corinthie': u'Gr\xe8ce',
+                        u'Corrientes': u'Argentine',
+                        u'Corr\xe8ze': u'France',
+                        u'Corse': u'France',
+                        u'Corse-du-Sud': u'France',
+                        u'Cor\xe9e (R\xe9publique populaire d\xe9mocratique)': u'Cor\xe9e (R\xe9publique populaire d\xe9mocratique)',
+                        u'Cor\xe9e (R\xe9publique)': u'Cor\xe9e (R\xe9publique)',
+                        u'Cor\xe9e avant 1948': u'Cor\xe9e avant 1948',
+                        u'Costa Rica': u'Costa Rica',
+                        u'Creuse': u'France',
+                        u'Croatie': u'Croatie',
+                        u'Cr\xe8te': u'Gr\xe8ce',
+                        u'Cuba': u'Cuba',
+                        u'Cura\xe7ao': u'Cura\xe7ao',
+                        u'Cyclades': u'Gr\xe8ce',
+                        u'C\xe9phalonie': u'Gr\xe8ce',
+                        u'C\xf3rdoba': u'Argentine',
+                        u"C\xf4te d'Ivoire": u"C\xf4te d'Ivoire",
+                        u"C\xf4te-d'Or": u'France',
+                        u"C\xf4tes-d'Armor": u'France',
+                        u'Dakota du Nord': u'\xc9tats-Unis',
+                        u'Dakota du Sud': u'\xc9tats-Unis',
+                        u'Danemark': u'Danemark',
+                        u'Delaware': u'\xc9tats-Unis',
+                        u'Deux-S\xe8vres': u'France',
+                        u'District de Columbia': u'\xc9tats-Unis',
+                        u'District f\xe9d\xe9ral': u'Br\xe9sil',
+                        u'Djibouti': u'Djibouti',
+                        u'Dod\xe9can\xe8se': u'Gr\xe8ce',
+                        u'Dominique': u'Dominique',
+                        u'Dordogne': u'France',
+                        u'Doubs': u'France',
+                        u'Drenthe': u'Pays-Bas',
+                        u'Dr\xe1ma': u'Gr\xe8ce',
+                        u'Dr\xf4me': u'France',
+                        u'Durango': u'Mexique',
+                        u'D\xe9pendance de Ross (Nouvelle-Z\xe9lande)': u'Antarctique',
+                        u'El Salvador': u'El Salvador',
+                        u'Entre-Rios': u'Argentine',
+                        u'Espagne': u'Espagne',
+                        u'Espirito Santo': u'Br\xe9sil',
+                        u'Essonne': u'France',
+                        u'Estonie': u'Estonie',
+                        u'Estr\xe9madure': u'Espagne',
+                        u'Eub\xe9e': u'Gr\xe8ce',
+                        u'Eure': u'France',
+                        u'Eure-et-Loir': u'France',
+                        u'Eurytanie': u'Gr\xe8ce',
+                        u'Fidji': u'Fidji',
+                        u'Finist\xe8re': u'France',
+                        u'Finlande': u'Finlande',
+                        u'Flandre occidentale': u'Belgique',
+                        u'Flandre orientale': u'Belgique',
+                        u'Floride': u'\xc9tats-Unis',
+                        u'Fl\xf3rina': u'Gr\xe8ce',
+                        u'Formosa': u'Argentine',
+                        u'France': u'France',
+                        u'Franche-Comt\xe9': u'France',
+                        u'Fribourg': u'Suisse',
+                        u'Frioul-V\xe9n\xe9tie-Julienne': u'Italie',
+                        u'Frise': u'Pays-Bas',
+                        u'F\xe9ro\xe9 (\xeeles)': u'F\xe9ro\xe9 (\xeeles)',
+                        u'Gabon': u'Gabon',
+                        u'Galice': u'Espagne',
+                        u'Gambie': u'Gambie',
+                        u'Gard': u'France',
+                        u'Gen\xe8ve': u'Suisse',
+                        u'Gers': u'France',
+                        u'Ghana': u'Ghana',
+                        u'Gibraltar': u'Gibraltar',
+                        u'Gironde': u'France',
+                        u'Glaris': u'Suisse',
+                        u'Goi\xe1s': u'Br\xe9sil',
+                        u'Grande-Bretagne': u'Grande-Bretagne',
+                        u'Grenade': u'Grenade',
+                        u'Greven\xe1': u'Gr\xe8ce',
+                        u'Grisons': u'Suisse',
+                        u'Groenland': u'Groenland',
+                        u'Groningue': u'Pays-Bas',
+                        u'Gr\xe8ce': u'Gr\xe8ce',
+                        u'Gr\xe8ce centrale': u'Gr\xe8ce',
+                        u'Gr\xe8ce occidentale': u'Gr\xe8ce',
+                        u'Guadeloupe': u'Guadeloupe',
+                        u'Guam': u'Guam',
+                        u'Guanajuato': u'Mexique',
+                        u'Guatemala': u'Guatemala',
+                        u'Gueldre': u'Pays-Bas',
+                        u'Guernesey': u'Guernesey',
+                        u'Guerrero': u'Mexique',
+                        u'Guin\xe9e': u'Guin\xe9e',
+                        u'Guin\xe9e \xe9quatoriale': u'Guin\xe9e \xe9quatoriale',
+                        u'Guin\xe9e-Bissau': u'Guin\xe9e-Bissau',
+                        u'Guyana': u'Guyana',
+                        u'Guyane fran\xe7aise': u'Guyane fran\xe7aise',
+                        u'G\xe9orgie': u'\xc9tats-Unis',
+                        u'G\xe9orgie du Sud et les \xeeles Sandwich du Sud': u'G\xe9orgie du Sud et les \xeeles Sandwich du Sud',
+                        u'Hainaut': u'Belgique',
+                        u'Hambourg': u'Allemagne',
+                        u'Haut-Rhin': u'France',
+                        u'Haute-Autriche': u'Autriche',
+                        u'Haute-Corse': u'France',
+                        u'Haute-Garonne': u'France',
+                        u'Haute-Loire': u'France',
+                        u'Haute-Marne': u'France',
+                        u'Haute-Normandie': u'France',
+                        u'Haute-Savoie': u'France',
+                        u'Haute-Sa\xf4ne': u'France',
+                        u'Haute-Vienne': u'France',
+                        u'Hautes-Alpes': u'France',
+                        u'Hautes-Pyr\xe9n\xe9es': u'France',
+                        u'Hauts-de-Seine': u'France',
+                        u'Hawaii': u'\xc9tats-Unis',
+                        u'Ha\xefti': u'Ha\xefti',
+                        u'Heard (\xeele) et \xeeles McDonald': u'Heard (\xeele) et \xeeles McDonald',
+                        u'Hesse': u'Allemagne',
+                        u'Hidalgo': u'Mexique',
+                        u'Hollande-M\xe9ridionale': u'Pays-Bas',
+                        u'Hollande-Septentrionale': u'Pays-Bas',
+                        u'Honduras': u'Honduras',
+                        u'Hong Kong': u'Hong Kong',
+                        u'Hongrie': u'Hongrie',
+                        u'H\xe9rault': u'France',
+                        u'Idaho': u'\xc9tats-Unis',
+                        u'Ille-et-Vilaine': u'France',
+                        u'Illinois': u'\xc9tats-Unis',
+                        u'Inde': u'Inde',
+                        u'Indiana': u'\xc9tats-Unis',
+                        u'Indon\xe9sie': u'Indon\xe9sie',
+                        u'Indre': u'France',
+                        u'Indre-et-Loire': u'France',
+                        u'Iowa': u'\xc9tats-Unis',
+                        u'Io\xe1nnina': u'Gr\xe8ce',
+                        u'Irak': u'Irak',
+                        u'Iran': u'Iran',
+                        u'Irlande': u'Irlande',
+                        u'Ir\xe1kleion': u'Gr\xe8ce',
+                        u'Islande': u'Islande',
+                        u'Isra\xebl': u'Isra\xebl',
+                        u'Is\xe8re': u'France',
+                        u'Italie': u'Italie',
+                        u'Jalisco': u'Mexique',
+                        u'Jama\xefque': u'Jama\xefque',
+                        u'Japon': u'Japon',
+                        u'Jersey': u'Jersey',
+                        u'Jordanie': u'Jordanie',
+                        u'Jujuy': u'Argentine',
+                        u'Jura': u'France',
+                        u'Kansas': u'\xc9tats-Unis',
+                        u'Kard\xedtsa': u'Gr\xe8ce',
+                        u'Kastori\xe1': u'Gr\xe8ce',
+                        u'Kav\xe1la': u'Gr\xe8ce',
+                        u'Kazakhstan': u'Kazakhstan',
+                        u'Kentucky': u'\xc9tats-Unis',
+                        u'Kenya': u'Kenya',
+                        u'Kilk\xeds': u'Gr\xe8ce',
+                        u'Kirghizistan': u'Kirghizistan',
+                        u'Kiribati': u'Kiribati',
+                        u'Kosovo': u'Kosovo',
+                        u'Kowe\xeft': u'Kowe\xeft',
+                        u'Koz\xe1ni': u'Gr\xe8ce',
+                        u'La Can\xe9e': u'Gr\xe8ce',
+                        u'Laconie': u'Gr\xe8ce',
+                        u'Landes': u'France',
+                        u'Languedoc-Roussillon': u'France',
+                        u'Laos': u'Laos',
+                        u'Las\xedthi': u'Gr\xe8ce',
+                        u'Latium': u'Italie',
+                        u'Le Pir\xe9e': u'Gr\xe8ce',
+                        u'Lesotho': u'Lesotho',
+                        u'Lettonie': u'Lettonie',
+                        u'Leucade': u'Gr\xe8ce',
+                        u'Liban': u'Liban',
+                        u'Liberia': u'Liberia',
+                        u'Libye': u'Libye',
+                        u'Liechtenstein': u'Liechtenstein',
+                        u'Ligurie': u'Italie',
+                        u'Limbourg': u'Pays-Bas',
+                        u'Limousin': u'France',
+                        u'Lituanie': u'Lituanie',
+                        u'Li\xe8ge': u'Belgique',
+                        u'Loir-et-Cher': u'France',
+                        u'Loire': u'France',
+                        u'Loire-Atlantique': u'France',
+                        u'Loiret': u'France',
+                        u'Lombardie': u'Italie',
+                        u'Lorraine': u'France',
+                        u'Lot': u'France',
+                        u'Lot-et-Garonne': u'France',
+                        u'Louisiane': u'\xc9tats-Unis',
+                        u'Loz\xe8re': u'France',
+                        u'Lucerne': u'Suisse',
+                        u'Luxembourg': u'Belgique',
+                        u'L\xe1risa': u'Gr\xe8ce',
+                        u'L\xe9svos': u'Gr\xe8ce',
+                        u'Macao': u'Macao',
+                        u'Mac\xe9doine (R\xe9publique)': u'Mac\xe9doine (R\xe9publique)',
+                        u'Mac\xe9doine centrale': u'Gr\xe8ce',
+                        u'Mac\xe9doine occidentale': u'Gr\xe8ce',
+                        u'Mac\xe9doine orientale et Thrace': u'Gr\xe8ce',
+                        u'Madagascar': u'Madagascar',
+                        u'Magn\xe9sie': u'Gr\xe8ce',
+                        u'Maine': u'\xc9tats-Unis',
+                        u'Maine-et-Loire': u'France',
+                        u'Malaisie': u'Malaisie',
+                        u'Malawi': u'Malawi',
+                        u'Maldives': u'Maldives',
+                        u'Mali': u'Mali',
+                        u'Malouines (\xeeles)': u'Malouines (\xeeles)',
+                        u'Malte': u'Malte',
+                        u'Manche': u'France',
+                        u'Manitoba': u'Canada',
+                        u'Maranh\xe3o': u'Br\xe9sil',
+                        u'Marches': u'Italie',
+                        u'Mariannes du Nord (\xeeles)': u'Mariannes du Nord (\xeeles)',
+                        u'Marne': u'France',
+                        u'Maroc': u'Maroc',
+                        u'Marshall (\xeeles)': u'Marshall (\xeeles)',
+                        u'Martinique': u'Martinique',
+                        u'Maryland': u'\xc9tats-Unis',
+                        u'Massachusetts': u'\xc9tats-Unis',
+                        u'Mato grosso': u'Br\xe9sil',
+                        u'Mato grosso do Sul': u'Br\xe9sil',
+                        u'Maurice': u'Maurice',
+                        u'Mauritanie': u'Mauritanie',
+                        u'Mayenne': u'France',
+                        u'Mayotte': u'Mayotte',
+                        u'Mecklembourg-Pom\xe9ranie ant\xe9rieure': u'Allemagne',
+                        u'Melilla': u'Espagne',
+                        u'Mendoza': u'Argentine',
+                        u'Mess\xe9nie': u'Gr\xe8ce',
+                        u'Meurthe-et-Moselle': u'France',
+                        u'Meuse': u'France',
+                        u'Mexico': u'Mexique',
+                        u'Mexique': u'Mexique',
+                        u'Michigan': u'\xc9tats-Unis',
+                        u'Michoac\xe1n': u'Mexique',
+                        u'Micron\xe9sie': u'Micron\xe9sie',
+                        u'Midi-Pyr\xe9n\xe9es': u'France',
+                        u'Minas Gerais': u'Br\xe9sil',
+                        u'Minnesota': u'\xc9tats-Unis',
+                        u'Misiones': u'Argentine',
+                        u'Mississippi': u'\xc9tats-Unis',
+                        u'Missouri': u'\xc9tats-Unis',
+                        u'Moldavie': u'Moldavie',
+                        u'Molise': u'Italie',
+                        u'Monaco': u'Monaco',
+                        u'Mongolie': u'Mongolie',
+                        u'Montana': u'\xc9tats-Unis',
+                        u'Montserrat': u'Montserrat',
+                        u'Mont\xe9n\xe9gro': u'Mont\xe9n\xe9gro',
+                        u'Morbihan': u'France',
+                        u'Morelos': u'Mexique',
+                        u'Moselle': u'France',
+                        u'Mozambique': u'Mozambique',
+                        u'Murcie': u'Espagne',
+                        u'Myanmar': u'Myanmar',
+                        u'Namibie': u'Namibie',
+                        u'Namur': u'Belgique',
+                        u'Nauru': u'Nauru',
+                        u'Navarre': u'Espagne',
+                        u'Nayarit': u'Mexique',
+                        u'Nebraska': u'\xc9tats-Unis',
+                        u'Neuch\xe2tel': u'Suisse',
+                        u'Neuqu\xe9n': u'Argentine',
+                        u'Nevada': u'\xc9tats-Unis',
+                        u'New Hampshire': u'\xc9tats-Unis',
+                        u'New Jersey': u'\xc9tats-Unis',
+                        u'New York': u'\xc9tats-Unis',
+                        u'Nicaragua': u'Nicaragua',
+                        u'Nidwald': u'Suisse',
+                        u'Niger': u'Niger',
+                        u'Nigeria': u'Nigeria',
+                        u'Niue': u'Niue',
+                        u'Ni\xe8vre': u'France',
+                        u'Nord': u'France',
+                        u'Nord-Pas-de-Calais': u'France',
+                        u'Norfolk (\xeele)': u'Norfolk (\xeele)',
+                        u'Norv\xe8ge': u'Norv\xe8ge',
+                        u'Nouveau Mexique': u'\xc9tats-Unis',
+                        u'Nouveau-Brunswick': u'Canada',
+                        u'Nouvelle-Cal\xe9donie': u'Nouvelle-Cal\xe9donie',
+                        u'Nouvelle-Galles-du-Sud': u'Australie',
+                        u'Nouvelle-Z\xe9lande': u'Nouvelle-Z\xe9lande',
+                        u'Nouvelle-\xc9cosse': u'Canada',
+                        u'Nuevo Le\xf3n': u'Mexique',
+                        u'N\xe9pal': u'N\xe9pal',
+                        u'Oaxaca': u'Mexique',
+                        u'Obwald': u'Suisse',
+                        u'Ohio': u'\xc9tats-Unis',
+                        u'Oise': u'France',
+                        u'Oklahoma': u'\xc9tats-Unis',
+                        u'Oman': u'Oman',
+                        u'Ombrie': u'Italie',
+                        u'Ontario': u'Canada',
+                        u'Oregon': u'\xc9tats-Unis',
+                        u'Orne': u'France',
+                        u'Ouganda': u'Ouganda',
+                        u'Ouzb\xe9kistan': u'Ouzb\xe9kistan',
+                        u'Overijssell': u'Pays-Bas',
+                        u'Pakistan': u'Pakistan',
+                        u'Palau': u'Palau',
+                        u'Pampa': u'Argentine',
+                        u'Panama': u'Panama',
+                        u'Papouasie-Nouvelle-Guin\xe9e': u'Papouasie-Nouvelle-Guin\xe9e',
+                        u'Paraguay': u'Paraguay',
+                        u'Paraiba': u'Br\xe9sil',
+                        u'Param\xe1': u'Br\xe9sil',
+                        u'Paris': u'France',
+                        u'Par\xe1': u'Br\xe9sil',
+                        u'Pas-de-Calais': u'France',
+                        u'Pays Basque': u'Espagne',
+                        u'Pays-Bas': u'Pays-Bas',
+                        u'Pays-Bas avant 1830': u'Pays-Bas avant 1830',
+                        u'Pays-de-la-Loire': u'France',
+                        u'Pennsylvanie': u'\xc9tats-Unis',
+                        u'Pernambouc': u'Br\xe9sil',
+                        u'Philippines': u'Philippines',
+                        u'Phocide': u'Gr\xe8ce',
+                        u'Phtiotide': u'Gr\xe8ce',
+                        u'Piau\xed': u'Br\xe9sil',
+                        u'Picardie': u'France',
+                        u'Pitcairn': u'Pitcairn',
+                        u'Pi\xe9mont': u'Italie',
+                        u'Pi\xe9rie': u'Gr\xe8ce',
+                        u'Poitou-Charentes': u'France',
+                        u'Pologne': u'Pologne',
+                        u'Polyn\xe9sie fran\xe7aise': u'Polyn\xe9sie fran\xe7aise',
+                        u'Porto Rico': u'Porto Rico',
+                        u'Portugal': u'Portugal',
+                        u'Pouilles': u'Italie',
+                        u"Provence-Alpes-C\xf4te d'Azur": u'France',
+                        u'Pr\xe9veza': u'Gr\xe8ce',
+                        u'Puebla': u'Mexique',
+                        u'Puy-de-D\xf4me': u'France',
+                        u'Pyr\xe9n\xe9es-Atlantiques': u'France',
+                        u'Pyr\xe9n\xe9es-Orientales': u'France',
+                        u'P\xe9lla': u'Gr\xe8ce',
+                        u'P\xe9loponn\xe8se': u'Gr\xe8ce',
+                        u'P\xe9rou': u'P\xe9rou',
+                        u'Qatar': u'Qatar',
+                        u'Queensland': u'Australie',
+                        u'Quer\xe9taro': u'Mexique',
+                        u'Quintana Roo': u'Mexique',
+                        u'Qu\xe9bec': u'Canada',
+                        u'Rhode Island': u'\xc9tats-Unis',
+                        u'Rhodope': u'Gr\xe8ce',
+                        u'Rh\xe9nanie-Palatinat': u'Allemagne',
+                        u'Rh\xe9nanie-du-Nord-Westphalie': u'Allemagne',
+                        u'Rh\xf4ne': u'France',
+                        u'Rh\xf4ne-Alpes': u'France',
+                        u'Rio Grande do Norte': u'Br\xe9sil',
+                        u'Rio Grande do Sul': u'Br\xe9sil',
+                        u'Rio Negro': u'Argentine',
+                        u'Rio de Janeiro': u'Br\xe9sil',
+                        u'Rioja': u'Argentine',
+                        u'Rond\xf4nia': u'Br\xe9sil',
+                        u'Roraima': u'Br\xe9sil',
+                        u'Roumanie': u'Roumanie',
+                        u'Royaume-Uni': u'Grande-Bretagne',
+                        u'Russie (F\xe9d\xe9ration)': u'Russie (F\xe9d\xe9ration)',
+                        u'Rwanda': u'Rwanda',
+                        u'R\xc3\xa9publique Tch\xc3\xa8que': u'R\xc3\xa9publique tch\xc3\xa8que',
+                        u'R\xe9publique dominicaine': u'R\xe9publique dominicaine',
+                        u'R\xe9publique tch\xe8que': u'R\xe9publique tch\xe8que',
+                        u'R\xe9thymnon': u'Gr\xe8ce',
+                        u'R\xe9union': u'R\xe9union',
+                        u'Sahara occidental': u'Sahara occidental',
+                        u'Saint-Barth\xe9lemy': u'Saint-Barth\xe9lemy',
+                        u'Saint-Gall': u'Suisse',
+                        u'Saint-Kitts-et-Nevis': u'Saint-Kitts-et-Nevis',
+                        u'Saint-Marin': u'Saint-Marin',
+                        u'Saint-Martin (partie fran\xe7aise)': u'Saint-Martin (partie fran\xe7aise)',
+                        u'Saint-Martin (partie n\xe9erlandaise)': u'Saint-Martin (partie n\xe9erlandaise)',
+                        u'Saint-Pierre-et-Miquelon': u'Saint-Pierre-et-Miquelon',
+                        u'Saint-Vincent-et-les Grenadines': u'Saint-Vincent-et-les Grenadines',
+                        u'Sainte-H\xe9l\xe8ne': u'Sainte-H\xe9l\xe8ne',
+                        u'Sainte-Lucie': u'Sainte-Lucie',
+                        u'Salomon (\xeeles)': u'Salomon (\xeeles)',
+                        u'Salta': u'Argentine',
+                        u'Salzbourg': u'Autriche',
+                        u'Samoa': u'Samoa',
+                        u'Samoa am\xe9ricaines': u'Samoa am\xe9ricaines',
+                        u'San Juan': u'Argentine',
+                        u'San Luis': u'Argentine',
+                        u'San Luis Potos\xed': u'Mexique',
+                        u'Santa Catarina': u'Br\xe9sil',
+                        u'Santa Cruz': u'Argentine',
+                        u'Santa Fe': u'Argentine',
+                        u'Santiago del Estero': u'Argentine',
+                        u'Sao Tom\xe9-et-Principe': u'Sao Tom\xe9-et-Principe',
+                        u'Sardaigne': u'Italie',
+                        u'Sarre': u'Allemagne',
+                        u'Sarthe': u'France',
+                        u'Saskatchewan': u'Canada',
+                        u'Savoie': u'France',
+                        u'Saxe': u'Allemagne',
+                        u'Saxe-Anhalt': u'Allemagne',
+                        u'Sa\xf4ne-et-Loire': u'France',
+                        u'Schaffhouse': u'Suisse',
+                        u'Schleswig-Holstein': u'Allemagne',
+                        u'Schwyz': u'Suisse',
+                        u'Seine-Maritime': u'France',
+                        u'Seine-Saint-Denis': u'France',
+                        u'Seine-et-Marne': u'France',
+                        u'Serbie': u'Serbie',
+                        u'Serbie-et-Mont\xe9n\xe9gro': u'Serbie-et-Mont\xe9n\xe9gro',
+                        u'Sergipe': u'Br\xe9sil',
+                        u'Seychelles': u'Seychelles',
+                        u'Sicile': u'Italie',
+                        u'Sierra Leone': u'Sierra Leone',
+                        u'Sinaloa': u'Mexique',
+                        u'Singapour': u'Singapour',
+                        u'Slovaquie': u'Slovaquie',
+                        u'Slov\xe9nie': u'Slov\xe9nie',
+                        u'Soleure': u'Suisse',
+                        u'Somalie': u'Somalie',
+                        u'Somme': u'France',
+                        u'Sonora': u'Mexique',
+                        u'Soudan': u'Soudan',
+                        u'Soudan du Sud': u'Soudan du Sud',
+                        u'Sri Lanka': u'Sri Lanka',
+                        u'Styrie': u'Autriche',
+                        u'Suisse': u'Suisse',
+                        u'Suriname': u'Suriname',
+                        u'Su\xe8de': u'Su\xe8de',
+                        u'Svalbard et \xeele Jan Mayen': u'Svalbard et \xeele Jan Mayen',
+                        u'Swaziland': u'Swaziland',
+                        u'Syrie': u'Syrie',
+                        u'S\xe1mos': u'Gr\xe8ce',
+                        u'S\xe3o Paulo': u'Br\xe9sil',
+                        u'S\xe9n\xe9gal': u'S\xe9n\xe9gal',
+                        u'S\xe9rrai': u'Gr\xe8ce',
+                        u'Tabasco': u'Mexique',
+                        u'Tadjikistan': u'Tadjikistan',
+                        u'Tamaulipas': u'Mexique',
+                        u'Tanzanie': u'Tanzanie',
+                        u'Tarn': u'France',
+                        u'Tarn-et-Garonne': u'France',
+                        u'Tasmanie': u'Australie',
+                        u'Ta\xefwan': u'Ta\xefwan',
+                        u'Tchad': u'Tchad',
+                        u'Tch\xe9coslovaquie': u'Tch\xe9coslovaquie',
+                        u'Tennessee': u'\xc9tats-Unis',
+                        u'Terre de Feu': u'Argentine',
+                        u'Terre de la Reine-Maud (Norv\xe8ge)': u'Antarctique',
+                        u'Terre-Neuve': u'Canada',
+                        u'Terres australes et antarctiques fran\xe7aises': u'Antarctique',
+                        u'Terres australes fran\xe7aises': u'Terres australes fran\xe7aises',
+                        u'Territoire antarctique australien': u'Antarctique',
+                        u'Territoire antarctique britannique': u'Antarctique',
+                        u"Territoire britannique de l'Oc\xe9an indien": u"Territoire britannique de l'Oc\xe9an indien",
+                        u'Territoire de la capitale australienne': u'Australie',
+                        u'Territoire du Nord': u'Australie',
+                        u'Territoire du Yukon': u'Canada',
+                        u'Territoire-de-Belfort': u'France',
+                        u'Territoires du Nord-Ouest': u'Canada',
+                        u'Tessin': u'Suisse',
+                        u'Texas': u'\xc9tats-Unis',
+                        u'Tha\xeflande': u'Tha\xeflande',
+                        u'Thesprotie': u'Gr\xe8ce',
+                        u'Thessalie': u'Gr\xe8ce',
+                        u'Thessalonique': u'Gr\xe8ce',
+                        u'Thurgovie': u'Suisse',
+                        u'Thuringe': u'Allemagne',
+                        u'Timor oriental': u'Timor oriental',
+                        u'Tlaxcala': u'Mexique',
+                        u'Togo': u'Togo',
+                        u'Tokelau': u'Tokelau',
+                        u'Tonga': u'Tonga',
+                        u'Toscane': u'Italie',
+                        u'Trentin-Haut-Adige': u'Italie',
+                        u'Trinit\xe9-et-Tobago': u'Trinit\xe9-et-Tobago',
+                        u'Tr\xedkala': u'Gr\xe8ce',
+                        u'Tucum\xe1n': u'Argentine',
+                        u'Tunisie': u'Tunisie',
+                        u'Turkm\xe9nistan': u'Turkm\xe9nistan',
+                        u'Turks et Ca\xefques (\xeeles)': u'Turks et Ca\xefques (\xeeles)',
+                        u'Turquie': u'Turquie',
+                        u'Tuvalu': u'Tuvalu',
+                        u'Tyrol': u'Autriche',
+                        u'URSS': u'URSS',
+                        u'US': u'\xc9tats-Unis',
+                        'USA': u'\xc9tats-Unis',
+                        u'Ukraine': u'Ukraine',
+                        u'Uri': u'Suisse',
+                        u'Uruguay': u'Uruguay',
+                        u'Utah': u'\xc9tats-Unis',
+                        u'Utrecht': u'Pays-Bas',
+                        u"Val d'Aoste": u'Italie',
+                        u"Val-d'Oise": u'France',
+                        u'Val-de-Marne': u'France',
+                        u'Valais': u'Suisse',
+                        u'Vanuatu': u'Vanuatu',
+                        u'Var': u'France',
+                        u'Vatican': u'Vatican',
+                        u'Vaucluse': u'France',
+                        u'Vaud': u'Suisse',
+                        u'Vend\xe9e': u'France',
+                        u'Venezuela': u'Venezuela',
+                        u'Veracruz': u'Mexique',
+                        u'Vermont': u'\xc9tats-Unis',
+                        u'Victoria': u'Australie',
+                        u'Vienne': u'Autriche',
+                        u'Viet Nam': u'Viet Nam',
+                        u'Virginie': u'\xc9tats-Unis',
+                        u'Virginie occidentale': u'\xc9tats-Unis',
+                        u'Vorarlberg': u'Autriche',
+                        u'Vosges': u'France',
+                        u'V\xe9n\xe9tie': u'Italie',
+                        u'Wallis et Futuna (\xeeles)': u'Wallis et Futuna (\xeeles)',
+                        u'Washington': u'\xc9tats-Unis',
+                        u'Wisconsin': u'\xc9tats-Unis',
+                        u'Wyoming': u'\xc9tats-Unis',
+                        u'X\xe1nthi': u'Gr\xe8ce',
+                        u'Yonne': u'France',
+                        u'Yougoslavie': u'Yougoslavie',
+                        u'Yucat\xe1n': u'Mexique',
+                        u'Yvelines': u'France',
+                        u'Y\xe9men': u'Y\xe9men',
+                        u'Y\xe9men (R\xe9publique d\xe9mocratique populaire)': u'Y\xe9men (R\xe9publique d\xe9mocratique populaire)',
+                        u'Zacatecas': u'Mexique',
+                        u'Zambie': u'Zambie',
+                        u'Zimbabwe': u'Zimbabwe',
+                        u'Zoug': u'Suisse',
+                        u'Zurich': u'Suisse',
+                        u'Z\xe1kynthos': u'Gr\xe8ce',
+                        u'Z\xe9lande': u'Pays-Bas',
+                        u'aire g\xe9ographique ancienne': u'aire g\xe9ographique ancienne',
+                        u'code non adapt\xe9': u'code non adapt\xe9',
+                        u'inconnu': u'inconnu',
+                        u'intergouvernemental': u'intergouvernemental',
+                        u'multiple': u'multiple',
+                        u"ne s'applique pas": u"ne s'applique pas",
+                        u'non renseign\xe9': u'non renseign\xe9',
+                        u'\xc1rta': u'Gr\xe8ce',
+                        u'\xc9gypte': u'\xc9gypte',
+                        u'\xc9lide': u'Gr\xe8ce',
+                        u'\xc9mathie': u'Gr\xe8ce',
+                        u'\xc9milie-Romagne': u'Italie',
+                        u'\xc9mirats arabes unis': u'\xc9mirats arabes unis',
+                        u'\xc9pire': u'Gr\xe8ce',
+                        u'\xc9quateur': u'\xc9quateur',
+                        u'\xc9rythr\xe9e': u'\xc9rythr\xe9e',
+                        u'\xc9tats-Unis': u'\xc9tats-Unis',
+                        u'\xc9thiopie': u'\xc9thiopie',
+                        u'\xc9tolie-et-Acarnanie': u'Gr\xe8ce',
+                        u'\xc9vros': u'Gr\xe8ce',
+                        u'\xcele Pierre 1er (Norv\xe8ge)': u'Antarctique',
+                        u'\xcele de Man': u'\xcele de Man',
+                        u'\xcele du Prince-\xc9douard': u'Canada',
+                        u'\xcele-de-France': u'France',
+                        u'\xceles Bal\xe9ares': u'Espagne',
+                        u'\xceles Ioniennes': u'Gr\xe8ce',
+                        u'\xceles Vierges am\xe9ricaines': u'\xceles Vierges am\xe9ricaines',
+                        u'\xceles Vierges britanniques': u'\xceles Vierges britanniques',
+                        u'\xceles de la Mer \xc9g\xe9e m\xe9ridionale': u'Gr\xe8ce',
+                        u'\xceles de la Mer \xc9g\xe9e septentrionale': u'Gr\xe8ce',
+                        u'\xceles mineures \xe9loign\xe9es des \xc9tats-Unis': u'\xceles mineures \xe9loign\xe9es des \xc9tats-Unis'
+                                                }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/reference_data/countries_iso_3166.txt	Tue Oct 22 15:56:01 2013 +0200
@@ -0,0 +1,269 @@
+##,non renseigné
+..,non renseigné
+aa,aire géographique ancienne
+ad,Andorre
+ae,Émirats arabes unis
+af,Afghanistan
+ag,Antigua-et-Barbuda
+ai,Anguilla
+al,Albanie
+am,Arménie
+an,Antilles néerlandaises
+ao,Angola
+aq,Antarctique
+ar,Argentine
+as,Samoa américaines
+at,Autriche
+au,Australie
+aw,Aruba
+ax,Aland (îles)
+az,Azerbaïdjan
+ba,Bosnie-Herzégovine
+bb,Barbade
+bd,Bangladesh
+be,Belgique
+bf,Burkina
+bg,Bulgarie
+bh,Bahreïn
+bi,Burundi
+bj,Bénin
+bl,Saint-Barthélemy
+bm,Bermudes
+bn,Brunéi
+bo,Bolivie
+bq,Bonaire, Saint-Eustache et Saba,Saba###Saint-Eustache
+br,Brésil
+bs,Bahamas
+bt,Bhoutan
+bv,Bouvet (île)
+bw,Botswana
+by,Biélorussie,Bélarus
+bz,Belize
+ca,Canada
+cc,Cocos (îles),Keeling (îles)
+cd,Congo (République démocratique),Zaïre
+cf,Centrafrique,République centrafricaine
+cg,Congo,Congo (République)
+ch,Suisse,Confédération helvétique
+ci,Côte d'Ivoire
+ck,Cook (îles)
+cl,Chili
+cm,Cameroun
+cn,Chine,Chine (République populaire)
+co,Colombie
+cr,Costa Rica
+cs,Serbie-et-Monténégro
+cu,Cuba
+cv,Cap-Vert
+cw,Curaçao
+cx,Christmas (île)
+cy,Chypre
+cz,République tchèque,Tchèque, République
+dd,Allemagne (République démocratique)
+de,Allemagne,Allemagne (République fédérale)
+dj,Djibouti
+dk,Danemark
+dm,Dominique
+do,République dominicaine,Dominicaine, République
+dz,Algérie
+ec,Équateur
+ee,Estonie
+eg,Égypte
+eh,Sahara occidental
+er,Érythrée
+es,Espagne
+et,Éthiopie
+fi,Finlande
+fj,Fidji
+fk,Malouines (îles),Falkland (îles)
+fm,Micronésie,États fédérés de Micronésie
+fo,Féroé (îles)
+fr,France
+ga,Gabon
+gb,Grande-Bretagne,Royaume-Uni
+gd,Grenade
+ge,Géorgie
+gf,Guyane française
+gg,Guernesey
+gh,Ghana
+gi,Gibraltar
+gl,Groenland
+gm,Gambie
+gn,Guinée
+gp,Guadeloupe
+gq,Guinée équatoriale
+gr,Grèce
+gs,Géorgie du Sud et les îles Sandwich du Sud
+gt,Guatemala
+gu,Guam
+gw,Guinée-Bissau
+gy,Guyana
+hk,Hong Kong
+hm,Heard (île) et îles McDonald
+hn,Honduras
+hr,Croatie
+ht,Haïti
+hu,Hongrie
+id,Indonésie
+ie,Irlande
+ii,intergouvernemental
+il,Israël
+im,Île de Man,Man, Île de
+in,Inde
+io,Territoire britannique de l'Océan indien,Chagos (îles)###Océan indien, Territoire britannique de l'
+iq,Irak
+ir,Iran
+is,Islande
+it,Italie
+je,Jersey
+jm,Jamaïque
+jo,Jordanie
+jp,Japon
+ke,Kenya
+kg,Kirghizistan
+kh,Cambodge
+ki,Kiribati
+km,Comores
+kn,Saint-Kitts-et-Nevis,Saint-Christophe-et-Nevis
+ko,Kosovo
+kp,Corée (République populaire démocratique),Corée du Nord
+kr,Corée (République),Corée du Sud
+kw,Koweït
+ky,Cayman,Caïmanes, Îles###Caïman (îles)
+kz,Kazakhstan
+la,Laos
+lb,Liban
+lc,Sainte-Lucie
+li,Liechtenstein
+lk,Sri Lanka
+lr,Liberia
+ls,Lesotho
+lt,Lituanie
+lu,Luxembourg
+lv,Lettonie
+ly,Libye
+ma,Maroc
+mc,Monaco
+md,Moldavie,Moldova, République de
+me,Monténégro
+mf,Saint-Martin (partie française)
+mg,Madagascar
+mh,Marshall (îles)
+mk,Macédoine (République)
+ml,Mali
+mm,Myanmar,Birmanie
+mn,Mongolie
+mo,Macao
+mp,Mariannes du Nord (îles)
+mq,Martinique
+mr,Mauritanie
+ms,Montserrat
+mt,Malte
+mu,Maurice
+mv,Maldives
+mw,Malawi
+mx,Mexique
+my,Malaisie
+mz,Mozambique
+na,Namibie
+nc,Nouvelle-Calédonie
+ne,Niger
+nf,Norfolk (île)
+ng,Nigeria
+ni,Nicaragua
+nl,Pays-Bas
+no,Norvège
+np,Népal
+nr,Nauru
+nu,Niue
+nz,Nouvelle-Zélande
+om,Oman
+oo,code non adapté
+pa,Panama
+pe,Pérou
+pf,Polynésie française
+pg,Papouasie-Nouvelle-Guinée
+ph,Philippines
+pk,Pakistan
+pl,Pologne
+pm,Saint-Pierre-et-Miquelon
+pn,Pitcairn
+pr,Porto Rico
+ps,Autorité palestinienne,Palestine
+pt,Portugal
+pw,Palau,Palaos
+py,Paraguay
+qa,Qatar
+re,Réunion
+ro,Roumanie
+rs,Serbie
+ru,Russie (Fédération),Russie
+rw,Rwanda
+sa,Arabie saoudite
+sb,Salomon (îles)
+sc,Seychelles
+sd,Soudan
+se,Suède
+sg,Singapour
+sh,Sainte-Hélène,Ascension (île)###Tristan da Cunha (île)
+si,Slovénie
+sj,Svalbard et île Jan Mayen
+sk,Slovaquie
+sl,Sierra Leone
+sm,Saint-Marin
+sn,Sénégal
+so,Somalie
+sr,Suriname
+ss,Soudan du Sud,Sud Soudan
+st,Sao Tomé-et-Principe
+su,URSS
+sv,El Salvador,Salvador
+sx,Saint-Martin (partie néerlandaise),Sint Maarten
+sy,Syrie
+sz,Swaziland
+tc,Turks et Caïques (îles)
+td,Tchad
+tf,Terres australes françaises
+tg,Togo
+th,Thaïlande
+tj,Tadjikistan
+tk,Tokelau
+tl,Timor oriental
+tm,Turkménistan
+tn,Tunisie
+to,Tonga
+tr,Turquie
+tt,Trinité-et-Tobago
+tv,Tuvalu
+tw,Taïwan,Chine (République)
+tz,Tanzanie
+ua,Ukraine
+ug,Ouganda
+um,Îles mineures éloignées des États-Unis
+us,États-Unis
+uy,Uruguay
+uz,Ouzbékistan
+va,Vatican,Saint-Siège
+vc,Saint-Vincent-et-les Grenadines
+ve,Venezuela
+vg,Îles Vierges britanniques,Vierges (îles) britanniques
+vi,Îles Vierges américaines,Vierges (îles) américaines
+vn,Viet Nam
+vu,Vanuatu
+wf,Wallis et Futuna (îles)
+ws,Samoa,Samoa occidentales
+xc,Tchécoslovaquie
+xd,Allemagne avant 1945
+xe,Europe,Union européenne
+xk,Corée avant 1948
+xn,Pays-Bas avant 1830,Belgique avant 1830
+xx,inconnu
+yd,Yémen (République démocratique populaire),Sud Yémen
+ye,Yémen
+yt,Mayotte
+yu,Yougoslavie
+yy,ne s'applique pas
+za,Afrique du Sud
+zm,Zambie
+zw,Zimbabwe
+zz,multiple
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/reference_data/us_states.py	Tue Oct 22 15:56:01 2013 +0200
@@ -0,0 +1,211 @@
+# -*- coding: utf-8 -*-
+
+# See http://en.wikipedia.org/wiki/List_of_U.S._state_abbreviations
+# WARNING: The name of each state should be in French
+# (e.g. "Floride", not "Florida")
+US_STATES = {'AK': 'Alaska',
+             'AL': 'Alabama',
+             'AR': 'Arkansas',
+             'AZ': 'Arizona',
+             'Ala.': 'Alabama',
+             'Alas.': 'Alaska',
+             'Alaska': 'Alaska',
+             'Ariz.': 'Arizona',
+             'Ark.': 'Arkansas',
+             'Az.': 'Arizona',
+             'CA': 'Californie',
+             'CF': 'Californie',
+             'CL': 'Colorado',
+             'CO': 'Colorado',
+             'CT': 'Connecticut',
+             'Ca.': 'Californie',
+             'Cal.': 'Californie',
+             'Cali.': 'Californie',
+             'Calif.': 'Californie',
+             'Col.': 'Colorado',
+             'Colo.': 'Colorado',
+             'Conn.': 'Connecticut',
+             'Ct.': 'Connecticut',
+             'D.C.': 'District of ColuFederal district',
+             'DC': 'District of ColuFederal district',
+             'DE': 'Delaware',
+             'DL': 'Delaware',
+             'De.': 'Delaware',
+             'Del.': 'Delaware',
+             'FL': 'Floride',
+             'Fl.': 'Floride',
+             'Fla.': 'Floride',
+             'Flor.': 'Floride',
+             'GA': u'Géorgie',
+             'Ga.': u'Géorgie',
+             'H.I.': 'Hawaii',
+             'HA': 'Hawaii',
+             'HI': 'Hawaii',
+             'Hawaii': 'Hawaii',
+             'IA': 'Iowa',
+             'ID': 'Idaho',
+             'IL': 'Illinois',
+             'IN': 'Indiana',
+             'Ia.': 'Iowa',
+             'Id.': 'Idaho',
+             'Ida.': 'Idaho',
+             'Idaho': 'Idaho',
+             'Il.': 'Illinois',
+             "Ill's": 'Illinois',
+             'Ill.': 'Illinois',
+             'Ills.': 'Illinois',
+             'In.': 'Indiana',
+             'Ind.': 'Indiana',
+             'Ioa.': 'Iowa',
+             'Iowa': 'Iowa',
+             'KA': 'Kansas',
+             'KS': 'Kansas',
+             'KY': 'Kentucky',
+             'Ka.': 'Kansas',
+             'Kan.': 'Kansas',
+             'Kans.': 'Kansas',
+             'Ks.': 'Kansas',
+             'Ky.': 'Kentucky',
+             'LA': 'Louisiane',
+             'La.': 'Louisiane',
+             'MA': 'Massachusetts',
+             'MC': 'Michigan',
+             'MD': 'Maryland',
+             'ME': 'Maine',
+             'MI': 'Mississippi',
+             'MN': 'Minnesota',
+             'MO': 'Missouri',
+             'MS': 'Mississippi',
+             'MT': 'Montana',
+             'Maine': 'Maine',
+             'Mass.': 'Massachusetts',
+             'Md.': 'Maryland',
+             'Me.': 'Maine',
+             'Mich.': 'Michigan',
+             'Minn.': 'Minnesota',
+             'Miss.': 'Mississippi',
+             'Mn.': 'Minnesota',
+             'Mo.': 'Missouri',
+             'Mont.': 'Montana',
+             'N. Car.': 'Caroline du Nord',
+             'N. Dak.': 'Dakota du Nord',
+             'N. Mex.': 'Nouveau-Mexique',
+             'N. York': 'New York',
+             'N.C.': 'Caroline du Nord',
+             'N.D.': 'Dakota du Nord',
+             'N.H.': 'New Hampshire',
+             'N.J.': 'New Jersey',
+             'N.M.': 'Nouveau-Mexique',
+             'N.Y.': 'New York',
+             'NB': 'Nebraska',
+             'NC': 'Caroline du Nord',
+             'ND': 'Dakota du Nord',
+             'NE': 'Nebraska',
+             'NH': 'New Hampshire',
+             'NJ': 'New Jersey',
+             'NM': 'Nouveau-Mexique',
+             'NV': 'Nevada',
+             'NY': 'New York',
+             'Neb.': 'Nebraska',
+             'Nebr.': 'Nebraska',
+             'Nev.': 'Nevada',
+             'New M.': 'Nouveau-Mexique',
+             'NoDak': 'Dakota du Nord',
+             'Nv.': 'Nevada',
+             'O.': 'Ohio',
+             'OH': 'Ohio',
+             'OK': 'Oklahoma',
+             'OR': 'Oregon',
+             'Oh.': 'Ohio',
+             'Ohio': 'Ohio',
+             'Ok.': 'Oklahoma',
+             'Okla.': 'Oklahoma',
+             'Or.': 'Oregon',
+             'Ore.': 'Oregon',
+             'Oreg.': 'Oregon',
+             'PA': 'Pennsylvanie',
+             'Pa.': 'Pennsylvanie',
+             'R.I.': 'Rhode Island',
+             'R.I. & P.P.': 'Rhode Island',
+             'RI': 'Rhode Island',
+             'S. Car.': 'Caroline du Sud',
+             'S. Dak.': 'Dakota du Sud',
+             'S.C.': 'Caroline du Sud',
+             'S.D.': 'Dakota du Sud',
+             'SC': 'Caroline du Sud',
+             'SD': 'Dakota du Sud',
+             'SoDak': 'Dakota du Sud',
+             'State': 'Utah',
+             'TN': 'Tennessee',
+             'TX': 'Texas',
+             'Tenn.': 'Tennessee',
+             'Tex.': 'Texas',
+             'Texas': 'Texas',
+             'Tn.': 'Tennessee',
+             'Tx.': 'Texas',
+             'US-AL': 'Alabama',
+             'US-AR': 'Arkansas',
+             'US-AZ': 'Arizona',
+             'US-CA': 'Californie',
+             'US-CO': 'Colorado',
+             'US-CT': 'Connecticut',
+             'US-DC': 'District of ColuFederal district',
+             'US-DE': 'Delaware',
+             'US-FL': 'Floride',
+             'US-GA': u'Géorgie',
+             'US-IL': 'Illinois',
+             'US-IN': 'Indiana',
+             'US-KY': 'Kentucky',
+             'US-LA': 'Louisiane',
+             'US-MA': 'Massachusetts',
+             'US-MD': 'Maryland',
+             'US-MI': 'Michigan',
+             'US-MN': 'Minnesota',
+             'US-MO': 'Missouri',
+             'US-MS': 'Mississippi',
+             'US-MT': 'Montana',
+             'US-NC': 'Caroline du Nord',
+             'US-ND': 'Dakota du Nord',
+             'US-NE': 'Nebraska',
+             'US-NH': 'New Hampshire',
+             'US-NJ': 'New Jersey',
+             'US-NM': 'Nouveau-Mexique',
+             'US-NY': 'New York',
+             'US-OK': 'Oklahoma',
+             'US-PA': 'Pennsylvanie',
+             'US-RI': 'Rhode Island',
+             'US-SC': 'Caroline du Sud',
+             'US-SD': 'Dakota du Sud',
+             'US-TN': 'Tennessee',
+             'US-VA': 'Virginia',
+             'US-VT': 'Vermont',
+             'US-WA': 'Washington',
+             'US-WI': 'Wisconsin',
+             'US-WV': 'Virginie occidentale',
+             'US-WY': 'Wyoming',
+             'UT': 'Utah',
+             'Ut.': 'Utah',
+             'Utah': 'Utah',
+             'VA': 'Virginia',
+             'VT': 'Vermont',
+             'Va.': 'Virginia',
+             'Vt.': 'Vermont',
+             'W. Va.': 'Virginie occidentale',
+             'W. Virg.': 'Virginie occidentale',
+             'W.V.': 'Virginie occidentale',
+             'W.Va.': 'Virginie occidentale',
+             'WA': 'Washington',
+             'WI': 'Wisconsin',
+             'WN': 'Washington',
+             'WS': 'Wisconsin',
+             'WV': 'Virginie occidentale',
+             'WY': 'Wyoming',
+             'Wa.': 'Washington',
+             'Wash.': 'Washington',
+             'Wash. D.C.': 'District of ColuFederal district',
+             'Wi.': 'Wisconsin',
+             'Wis.': 'Wisconsin',
+             'Wisc.': 'Wisconsin',
+             'Wn.': 'Washington',
+             'Wy.': 'Wyoming',
+             'Wyo.': 'Wyoming'}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/reference_data/us_states.txt	Tue Oct 22 15:56:01 2013 +0200
@@ -0,0 +1,210 @@
+
+# See http://en.wikipedia.org/wiki/List_of_U.S._state_abbreviations
+# WARNING: The name of each state should be in French
+# (e.g. "Floride", not "Florida")
+US_STATES = {'AK': 'Alaska',
+             'AL': 'Alabama',
+             'AR': 'Arkansas',
+             'AZ': 'Arizona',
+             'Ala.': 'Alabama',
+             'Alas.': 'Alaska',
+             'Alaska': 'Alaska',
+             'Ariz.': 'Arizona',
+             'Ark.': 'Arkansas',
+             'Az.': 'Arizona',
+             'CA': 'Californie',
+             'CF': 'Californie',
+             'CL': 'Colorado',
+             'CO': 'Colorado',
+             'CT': 'Connecticut',
+             'Ca.': 'Californie',
+             'Cal.': 'Californie',
+             'Cali.': 'Californie',
+             'Calif.': 'Californie',
+             'Col.': 'Colorado',
+             'Colo.': 'Colorado',
+             'Conn.': 'Connecticut',
+             'Ct.': 'Connecticut',
+             'D.C.': 'District of ColuFederal district',
+             'DC': 'District of ColuFederal district',
+             'DE': 'Delaware',
+             'DL': 'Delaware',
+             'De.': 'Delaware',
+             'Del.': 'Delaware',
+             'FL': 'Floride',
+             'Fl.': 'Floride',
+             'Fla.': 'Floride',
+             'Flor.': 'Floride',
+             'GA': u'Géorgie',
+             'Ga.': u'Géorgie',
+             'H.I.': 'Hawaii',
+             'HA': 'Hawaii',
+             'HI': 'Hawaii',
+             'Hawaii': 'Hawaii',
+             'IA': 'Iowa',
+             'ID': 'Idaho',
+             'IL': 'Illinois',
+             'IN': 'Indiana',
+             'Ia.': 'Iowa',
+             'Id.': 'Idaho',
+             'Ida.': 'Idaho',
+             'Idaho': 'Idaho',
+             'Il.': 'Illinois',
+             "Ill's": 'Illinois',
+             'Ill.': 'Illinois',
+             'Ills.': 'Illinois',
+             'In.': 'Indiana',
+             'Ind.': 'Indiana',
+             'Ioa.': 'Iowa',
+             'Iowa': 'Iowa',
+             'KA': 'Kansas',
+             'KS': 'Kansas',
+             'KY': 'Kentucky',
+             'Ka.': 'Kansas',
+             'Kan.': 'Kansas',
+             'Kans.': 'Kansas',
+             'Ks.': 'Kansas',
+             'Ky.': 'Kentucky',
+             'LA': 'Louisiane',
+             'La.': 'Louisiane',
+             'MA': 'Massachusetts',
+             'MC': 'Michigan',
+             'MD': 'Maryland',
+             'ME': 'Maine',
+             'MI': 'Mississippi',
+             'MN': 'Minnesota',
+             'MO': 'Missouri',
+             'MS': 'Mississippi',
+             'MT': 'Montana',
+             'Maine': 'Maine',
+             'Mass.': 'Massachusetts',
+             'Md.': 'Maryland',
+             'Me.': 'Maine',
+             'Mich.': 'Michigan',
+             'Minn.': 'Minnesota',
+             'Miss.': 'Mississippi',
+             'Mn.': 'Minnesota',
+             'Mo.': 'Missouri',
+             'Mont.': 'Montana',
+             'N. Car.': 'Caroline du Nord',
+             'N. Dak.': 'Dakota du Nord',
+             'N. Mex.': 'Nouveau-Mexique',
+             'N. York': 'New York',
+             'N.C.': 'Caroline du Nord',
+             'N.D.': 'Dakota du Nord',
+             'N.H.': 'New Hampshire',
+             'N.J.': 'New Jersey',
+             'N.M.': 'Nouveau-Mexique',
+             'N.Y.': 'New York',
+             'NB': 'Nebraska',
+             'NC': 'Caroline du Nord',
+             'ND': 'Dakota du Nord',
+             'NE': 'Nebraska',
+             'NH': 'New Hampshire',
+             'NJ': 'New Jersey',
+             'NM': 'Nouveau-Mexique',
+             'NV': 'Nevada',
+             'NY': 'New York',
+             'Neb.': 'Nebraska',
+             'Nebr.': 'Nebraska',
+             'Nev.': 'Nevada',
+             'New M.': 'Nouveau-Mexique',
+             'NoDak': 'Dakota du Nord',
+             'Nv.': 'Nevada',
+             'O.': 'Ohio',
+             'OH': 'Ohio',
+             'OK': 'Oklahoma',
+             'OR': 'Oregon',
+             'Oh.': 'Ohio',
+             'Ohio': 'Ohio',
+             'Ok.': 'Oklahoma',
+             'Okla.': 'Oklahoma',
+             'Or.': 'Oregon',
+             'Ore.': 'Oregon',
+             'Oreg.': 'Oregon',
+             'PA': 'Pennsylvanie',
+             'Pa.': 'Pennsylvanie',
+             'R.I.': 'Rhode Island',
+             'R.I. & P.P.': 'Rhode Island',
+             'RI': 'Rhode Island',
+             'S. Car.': 'Caroline du Sud',
+             'S. Dak.': 'Dakota du Sud',
+             'S.C.': 'Caroline du Sud',
+             'S.D.': 'Dakota du Sud',
+             'SC': 'Caroline du Sud',
+             'SD': 'Dakota du Sud',
+             'SoDak': 'Dakota du Sud',
+             'State': 'Utah',
+             'TN': 'Tennessee',
+             'TX': 'Texas',
+             'Tenn.': 'Tennessee',
+             'Tex.': 'Texas',
+             'Texas': 'Texas',
+             'Tn.': 'Tennessee',
+             'Tx.': 'Texas',
+             'US-AL': 'Alabama',
+             'US-AR': 'Arkansas',
+             'US-AZ': 'Arizona',
+             'US-CA': 'Californie',
+             'US-CO': 'Colorado',
+             'US-CT': 'Connecticut',
+             'US-DC': 'District of ColuFederal district',
+             'US-DE': 'Delaware',
+             'US-FL': 'Floride',
+             'US-GA': u'Géorgie',
+             'US-IL': 'Illinois',
+             'US-IN': 'Indiana',
+             'US-KY': 'Kentucky',
+             'US-LA': 'Louisiane',
+             'US-MA': 'Massachusetts',
+             'US-MD': 'Maryland',
+             'US-MI': 'Michigan',
+             'US-MN': 'Minnesota',
+             'US-MO': 'Missouri',
+             'US-MS': 'Mississippi',
+             'US-MT': 'Montana',
+             'US-NC': 'Caroline du Nord',
+             'US-ND': 'Dakota du Nord',
+             'US-NE': 'Nebraska',
+             'US-NH': 'New Hampshire',
+             'US-NJ': 'New Jersey',
+             'US-NM': 'Nouveau-Mexique',
+             'US-NY': 'New York',
+             'US-OK': 'Oklahoma',
+             'US-PA': 'Pennsylvanie',
+             'US-RI': 'Rhode Island',
+             'US-SC': 'Caroline du Sud',
+             'US-SD': 'Dakota du Sud',
+             'US-TN': 'Tennessee',
+             'US-VA': 'Virginia',
+             'US-VT': 'Vermont',
+             'US-WA': 'Washington',
+             'US-WI': 'Wisconsin',
+             'US-WV': 'Virginie occidentale',
+             'US-WY': 'Wyoming',
+             'UT': 'Utah',
+             'Ut.': 'Utah',
+             'Utah': 'Utah',
+             'VA': 'Virginia',
+             'VT': 'Vermont',
+             'Va.': 'Virginia',
+             'Vt.': 'Vermont',
+             'W. Va.': 'Virginie occidentale',
+             'W. Virg.': 'Virginie occidentale',
+             'W.V.': 'Virginie occidentale',
+             'W.Va.': 'Virginie occidentale',
+             'WA': 'Washington',
+             'WI': 'Wisconsin',
+             'WN': 'Washington',
+             'WS': 'Wisconsin',
+             'WV': 'Virginie occidentale',
+             'WY': 'Wyoming',
+             'Wa.': 'Washington',
+             'Wash.': 'Washington',
+             'Wash. D.C.': 'District of ColuFederal district',
+             'Wi.': 'Wisconsin',
+             'Wis.': 'Wisconsin',
+             'Wisc.': 'Wisconsin',
+             'Wn.': 'Washington',
+             'Wy.': 'Wyoming',
+             'Wyo.': 'Wyoming'}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/setup.py	Tue Oct 22 15:56:01 2013 +0200
@@ -0,0 +1,27 @@
+# -*- coding:utf-8 -*-
+# copyright 2012 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr -- mailto:contact@logilab.fr
+#
+# This program is free software: you can redistribute it and/or modify it under
+# the terms of the GNU Lesser General Public License as published by the Free
+# Software Foundation, either version 2.1 of the License, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+from distutils.core import setup
+
+setup(name='nazca',
+      version='0.2.3',
+      description='Python library for data alignment',
+      author='LOGILAB S.A. (Paris, FRANCE)',
+      author_email=' <contact@logilab.fr>',
+      url='https://www.logilab.org/project/nazca',
+      package_dir={'nazca': '.'},
+      packages=['nazca'],
+     )
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/data/alignfile.csv	Tue Oct 22 15:56:01 2013 +0200
@@ -0,0 +1,4 @@
+V1	label1	6.14194444444	48.67
+V2	label2	6.2	49
+V3	label3	5.1	48
+V4	label4	5.2	48.1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/data/file2parse	Tue Oct 22 15:56:01 2013 +0200
@@ -0,0 +1,3 @@
+1, house , 12, 19, apple
+2, horse , 21.9, 19, stramberry
+3, flower, 23, 2.17 , cherry
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/data/file2split	Tue Oct 22 15:56:01 2013 +0200
@@ -0,0 +1,1000 @@
+cambrant	cambrer
+dégrafa	dégrafer
+adorerais	adorer
+participiales	participial
+coronales	coronal
+amorcera	amorcer
+titanesques	titanesque
+Gymniques	gymnique
+Postérieurement	postérieurement
+lingual	lingual
+stomacal	stomacal
+décalitre	décalitre
+photomaton	photomaton
+éclates	éclater
+manteau	manteau
+majorés	majoré
+pleurants	pleurant
+appartenances	appartenance
+dégoûta	dégoûter
+chantournement	chantournement
+randonné	randonner
+réalisent	réaliser
+raffole	raffoler
+descendirent	descendre
+lubrifient	lubrifier
+transsibérien	transsibérien
+Rythmant	rythmer
+perquisitionnés	perquisitionner
+étampe	étampe
+islamismes	islamisme
+nitra	nitrer
+canéphores	canéphore
+aïeules	aïeul
+Mythologiques	mythologique
+piaillent	piailler
+destiné	destiner
+mélanoses	mélanose
+Otalgie	otalgie
+Déduite	déduire
+Épisiotomie	épisiotomie
+téléphonistes	téléphoniste
+Pourcentages	pourcentage
+milliaire	milliaire
+décortiquera	décortiquer
+correcteur	correcteur
+exhalera	exhaler
+inocybe	inocybe
+grenouillard	grenouillard
+coopéreront	coopérer
+tartignolles	tartignolle
+mesures	mesure
+défoliations	défoliation
+Viens	venir
+holothuries	holothurie
+cambriolés	cambrioler
+chansonniers	chansonnier
+sudorales	sudoral
+sursirent	surseoir
+ferronickel	ferronickel
+frotton	frotton
+énuclée	énucléer
+dépiste	dépister
+tondeurs	tondeur
+Jeannette	Jeannette
+Sanctifiés	sanctifier
+glisses	glisser
+diamine	diamine
+niqué	niquer
+culbutée	culbuter
+Taons	taon
+scripturales	scriptural
+coulomb	coulomb
+hémicycle	hémicycle
+paralysé	paralyser
+badine	badin
+abrège	abréger
+européanisant	européaniser
+Bouteilles	bouteille
+rétrécissement	rétrécissement
+glamour	glamour
+incorpore	incorporer
+prolétariser	prolétariser
+lointaine	lointain
+bigarrés	bigarré
+gril	gril
+infracteur	infracteur
+Regard	regard
+Divas	diva
+allonge	allonger
+muté	muter
+linéale	linéal
+répliquait	répliquer
+Lairds	laird
+démastiquer	démastiquer
+flandricismes	flandricisme
+endoparasites	endoparasite
+Einstein	Einstein
+héliotropes	héliotrope
+rétribuée	rétribuer
+fessant	fesser
+Carottiers	carottier
+âcres	âcre
+déroutantes	déroutant
+CAHUTE	cahute
+Pie-mère	pie-mère
+PIRES	pire
+célibataire	célibataire
+Durits	durit
+dévergondage	dévergondage
+Reprends	reprendre
+labourant	labourer
+dales	dale
+concrétisations	concrétisation
+atermoyer	atermoyer
+sautâmes	sauter
+crée	créer
+nide	nider
+adossant	adosser
+passiflores	passiflore
+asomatognosies	asomatognosie
+Fier-à-bras	fier-à-bras
+Talmudiste	talmudiste
+Ferrets	ferret
+surprofit	surprofit
+répercuteront	répercuter
+syngnathes	syngnathe
+polarographique	polarographique
+Hulten	Hulten
+braiments	braiment
+mondialisés	mondialiser
+flagellation	flagellation
+baptistes	baptiste
+fusaïole	fusaïole
+houspille	houspiller
+nacrée	nacrer
+fréquentée	fréquenter
+dérobées	dérobé
+Démunie	démuni
+pneus	pneu
+Rosaires	rosaire
+Gangrène	gangrène
+nymphaux	nymphal
+froideurs	froideur
+Plongeuse	plongeur
+meringues	meringue
+aplastique	aplastique
+débloquons	débloquer
+heptagonales	heptagonal
+Sécheresse	sécheresse
+successoraux	successoral
+aéronef	aéronef
+brillèrent	briller
+surgeler	surgeler
+arboristes	arboriste
+augustinisme	augustinisme
+détruisirent	détruire
+calquant	calquer
+roulé	rouler
+panis	panis
+manipules	manipule
+silicocalcaires	silicocalcaire
+cohésion	cohésion
+réunît	réunir
+spirilles	spirille
+FORS	fors
+milicienne	milicien
+édificateur	édificateur
+annale	annal
+Cologne	Cologne
+décherrai	déchoir
+décrassant	décrasser
+élucident	élucider
+impatientait	impatienter
+purpurines	purpurin
+fantastiques	fantastique
+polysynthétiques	polysynthétique
+sécherie	sécherie
+sacro-coccygien	sacro-coccygien
+entonnant	entonner
+Empoisonneurs	empoisonneur
+MARION	Marion
+polluante	polluant
+surfondue	surfondu
+Atropos	atropos
+Urbanisé	urbaniser
+corégents	corégent
+Bénis	bénir
+tétraédriques	tétraédrique
+goûteux	goûteux
+Orsay	Orsay
+épiceries	épicerie
+interalliées	interallié
+minot	minot
+bité	biter
+vidéoclub	vidéoclub
+catégorielle	catégoriel
+Gueules	gueuler
+fonctionnalités	fonctionnalité
+relayaient	relayer|relayer
+encenseur	encenseur
+parsemé	parsemer
+bavardes	bavard
+parvenions	parvenir
+Fascinant	fasciner
+Furias	furia
+mirlitonnant	mirlitonner
+abouche	aboucher
+discounts	discount
+Nord-Américaine	Nord-Américain
+Ébaucher	ébaucher
+fouiner	fouiner
+réanimeront	réanimer
+Bugaku	bugaku
+gorgerins	gorgerin
+commenterait	commenter
+shi'ite	shi'ite
+Scriptural	scriptural
+débrouillarde	débrouillard
+aziliens	azilien
+USDB	USDB
+intoxinations	intoxination
+assiérait	asseoir
+marcaires	marcaire
+pelée	pelé
+Acéphales	acéphale
+Tagals	tagal
+lovées	lover
+comptable	comptable
+ralentissent	ralentir
+IDES	ide|ides
+psycholinguistique	psycholinguistique
+vicissitudes	vicissitude
+scolarisés	scolariser
+Interroger	interroger
+apportions	apporter
+iraquiennes	iraquien
+baissa	baisser
+convulsivothérapie	convulsivothérapie
+assis	asseoir
+vitriolage	vitriolage
+amadouait	amadouer
+croîtraient	croître
+Cafetiers	cafetier
+crevez	crever
+abandonneras	abandonner
+incroyances	incroyance
+décapsidation	décapsidation
+lorgnaient	lorgner
+occupasse	occuper
+décimétriques	décimétrique
+radiaire	radiaire
+assaillent	assaillir
+molestant	molester
+hauteurs	hauteur
+concéder	concéder
+glissées	glisser
+déblaiement	déblaiement
+arbalestiers	arbalestier
+repus	repaître
+stromboliennes	strombolien
+mycéliens	mycélien
+Rebouteux	rebouteux
+fécondent	féconder
+trypanosome	trypanosome
+EXACTE	exact
+ennuiera	ennuyer
+troublante	troublant
+Trémolites	trémolite
+parage	parage
+Perpète	perpète
+consumèrent	consumer
+entamure	entamure
+Maudites	maudit
+dévitrification	dévitrification
+Éclaboussé	éclabousser
+opposa	opposer
+maux	mal
+localisent	localiser
+déchainent	déchainer
+boxé	boxer
+bonzerie	bonzerie
+rigolard	rigolard
+Hématome	hématome
+polémiste	polémiste
+gigoteuse	gigoteur
+protecteurs	protecteur
+syriaques	syriaque
+Damas	Damas
+perfectibles	perfectible
+masures	masure
+monosexués	monosexué
+martiennes	martien
+habituée	habituer
+éventrera	éventrer
+surfaits	surfait
+révolutionnariste	révolutionnariste
+gémit	gémir
+Dieux	Dieu
+fluctua	fluctuer
+mâchonnaient	mâchonner
+propageaient	propager
+intégrèrent	intégrer
+joncha	joncher
+Empirisme	empirisme
+modulateurs	modulateur
+Absurdité	absurdité
+moelleuse	moelleux
+congruence	congruence
+déjeuna	déjeuner
+tamponner	tamponner
+hyperactif	hyperactif
+rebutés	rebuter
+coxalgique	coxalgique
+laborantins	laborantin
+crosnes	crosne
+sisymbre	sisymbre
+papillons	papillon
+CHÂTEAU	Château
+défoncements	défoncement
+surnommés	surnommer
+crochu	crochu
+Rectifications	rectification
+rouquins	rouquin
+trébuchantes	trébuchant
+rémissible	rémissible
+absorbants	absorbant
+Obéissant	obéir
+Délignage	délignage
+chasuble	chasuble
+Rabâcher	rabâcher
+dactylographes	dactylographe
+bues	boire
+Véhicules	véhicule
+toussaint	toussaint
+hautes	haut
+Surprise-Partie	surprise-partie
+aluni	alunir
+Pétéchial	pétéchial
+consultée	consulter
+sublimées	sublimer
+aboutirons	aboutir
+peupleraient	peupler
+bicarbonates	bicarbonate
+charreterie	charreterie
+divergeassent	diverger
+mesurât	mesurer
+bressan	bressan
+Talonnade	talonnade
+dioscures	dioscures
+Inhumanité	inhumanité
+édicta	édicter
+Pédiatre	pédiatre
+enseignent	enseigner
+Bises	bis
+RIChelieu	Richelieu
+induvies	induvie
+dizain	dizain
+Revêtue	revêtir
+chanfreiné	chanfreiner
+surchauffés	surchauffé
+regorgeraient	regorger
+pèseraient	peser
+stérigmates	stérigmate
+tuée	tuer
+panachure	panachure
+Curieusement	curieusement
+contrôlée	contrôler
+whigs	whig
+portraiturés	portraiturer
+Accessibles	accessible
+brouet	brouet
+aliénèrent	aliéner
+vampirise	vampiriser
+Hyperfonctionnement	hyperfonctionnement
+autodestruction	autodestruction
+élastiquement	élastiquement
+Multinationale	multinational
+marcottages	marcottage
+enrayeraient	enrayer
+fatigants	fatigant
+soutes	soute
+détentrices	détenteur
+JOSÉPHINE	joséphine
+Cueilleuse	cueilleur
+Pilotant	piloter
+golgotha	golgotha
+innovés	innover
+reléguées	reléguer
+jalaps	jalap
+interdis	interdire
+cténoïde	cténoïde
+Postale	postal
+camelotes	camelote
+Présenter	présenter
+horodaté	horodaté
+mandement	mandement
+encombrerait	encombrer
+louves	louve
+inhalateurs	inhalateur
+sautillants	sautillant
+prodiguera	prodiguer
+déchirante	déchirant
+appellerions	appeler
+espadrilles	espadrille
+ressac	ressac
+coopérants	coopérant
+surcharge	surcharge
+meurtries	meurtrir
+transsude	transsuder
+dictera	dicter
+vissa	visser
+exciterait	exciter
+pastoureaux	pastoureaux
+amplifies	amplifier
+polyèdre	polyèdre
+ÉLEVÉ	élever
+épistate	épistate
+socio-affectifs	socio-affectif
+jaquets	jaquet
+chargeaient	charger
+versera	verser
+extradurales	extradural
+Idéologue	idéologue
+formalismes	formalisme
+exaspérait	exaspérer
+Marathon	Marathon
+partisan	partisan
+distinctes	distinct
+lanterniste	lanterniste
+revole	revoler
+bupreste	bupreste
+égareront	égarer
+cavalières	cavalier
+englober	englober
+bétoires	bétoire
+dédommager	dédommager
+ministères	ministère
+périlleux	périlleux
+Duteil	Duteil
+malinoise	malinois
+assécherait	assécher
+pintas	pinter
+homosexualités	homosexualité
+reprocherez	reprocher
+Actuariat	actuariat
+retransmettaient	retransmettre
+effarer	effarer
+protéiniques	protéinique
+lavages	lavage
+Arguant	arguer
+accouplements	accouplement
+Pénale	pénal
+Angoras	angora
+orang	orang
+démoralisé	démoraliser
+néo-fascismes	néo-fascisme
+reproduites	reproduire
+confusionniste	confusionniste
+frugalité	frugalité
+laryngites	laryngite
+orthocentrique	orthocentrique
+monocarpiques	monocarpique
+élèvera	élever
+Ressourcer	ressourcer
+mirabellier	mirabellier
+cristallisait	cristalliser
+microlithiques	microlithique
+faisaient	faire
+Soldats	soldat
+métencéphale	métencéphale
+Brise-Ménage	brise-ménage
+Tablées	tablée
+bimétallique	bimétallique
+redevenons	redevenir
+signora	signora
+appareillages	appareillage
+retracent	retracer
+muscardine	muscardine
+Shintoïsme	shintoïsme
+architecturaux	architectural
+cannibalisées	cannibaliser
+fil-de-fériste	fil-de-fériste
+fumoirs	fumoir
+démontrassent	démontrer
+connaîtra	connaître
+sénéchaux	sénéchal
+lagotriche	lagotriche
+Prestation	prestation
+Dilatations	dilatation
+non-possédants	non-possédant
+sémaphores	sémaphore
+expertes	expert
+SuCRE	sucre
+plus-que-parfait	plus-que-parfait
+charretées	charretée
+caléidoscope	caléidoscope
+proposables	proposable
+IdE	ide
+AUGMENTE	augmenter
+panislamique	panislamique
+boisons	boiser
+huipils	huipil
+gémissant	gémir
+rétorquent	rétorquer
+tirettes	tirette
+détissait	détisser
+honorifique	honorifique
+idéophone	idéophone
+archine	archine
+diocèse	diocèse
+biotype	biotype
+pourriez	pouvoir
+Paramilitaires	paramilitaire
+Latéralisation	latéralisation
+atomisme	atomisme
+infecta	infecter
+Éclaircissons	éclaircir
+remîmes	remettre
+influera	influer
+langouste	langouste
+pallieraient	pallier
+livresque	livresque
+Déclencher	déclencher
+Insectarium	insectarium
+allantoïde	allantoïde
+doux	doux
+sursaut	sursaut
+Meurthe	Meurthe
+nuirez	nuire
+paît	paître
+indiciblement	indiciblement
+frayes	fraye
+aveuglée	aveugler
+antistatique	antistatique
+Ombragée	ombrager
+Jeûnez	jeûner
+manuellement	manuellement
+PROCÉDÉ	procédé
+Isonomie	isonomie
+dactylographier	dactylographier
+Suivons	suivre
+prendrions	prendre
+libériens	libérien
+dramatisé	dramatiser
+frottantes	frottant
+Toussaint-Louverture	Toussaint-Louverture
+bimétalliques	bimétallique
+déferré	déferrer
+amollit	amollir
+cachez	cacher
+spiders	spider
+allodiaux	allodial
+lithographiée	lithographier
+violentent	violenter
+Modernisateur	modernisateur
+proscrivant	proscrire
+islamiste	islamiste
+cyclotouriste	cyclotouriste
+parviendrait	parvenir
+rayée	rayer|rayer
+dyslexie	dyslexie
+Suivait	suivre
+tambourins	tambourin
+désherbés	désherber
+technicisé	techniciser
+rasantes	rasant
+démantèlements	démantèlement
+enveloppeuse	enveloppeur
+nettoyez	nettoyer
+antérieure	antérieur
+exempts	exempt
+Totalisant	totaliser
+tractoire	tractoire
+CIMES	cime
+shoot	shoot
+Poursuivent	poursuivre
+Organigramme	organigramme
+Bruyante	bruyant
+latinisent	latiniser
+Trieuse	trieuse
+logis	logis
+Bulle	bulle
+Napoléoniens	napoléonien
+gêneraient	gêner
+colombine	colombine
+huîtrières	huîtrière
+festonnée	festonner
+ménagers	ménager
+richement	richement
+Préposée	préposer
+pragmatistes	pragmatiste
+jaffas	jaffer
+Vice-recteur	vice-recteur
+navigations	navigation
+commerciale	commercial
+ménageront	ménager
+porte-objet	porte-objet
+coulon	coulon
+ferromagnétiques	ferromagnétique
+Messagers	messager
+nasalisé	nasaliser
+blatère	blatérer
+Oiseuse	oiseux
+exceptionnelles	exceptionnel
+fédéraux	fédéral
+revisitera	revisiter
+flasher	flasher
+Écluses	écluse
+Pompons	pompon
+brushings	brushing
+cristallisés	cristalliser
+épaulaient	épauler
+Vigoureusement	vigoureusement
+ressemblance	ressemblance
+contrebalancé	contrebalancer
+inspecteur	inspecteur
+Turbidite	turbidite
+imprévisions	imprévision
+chicotin	chicotin
+gouaches	gouache
+désencombrement	désencombrement
+Progression	progression
+Dédoublement	dédoublement
+cryoniques	cryonique
+Déchristianisation	déchristianisation
+anosmiques	anosmique
+Salamine	Salamine
+suturant	suturer
+Présidents	président
+échancrée	échancrer
+anticyclone	anticyclone
+amollies	amollir
+Rétrospectives	rétrospectif
+bancable	bancable
+Infidèlement	infidèlement
+ravissaient	ravir
+amphibole	amphibole
+pât	pât
+Déformations	déformation
+usagères	usager
+paravalanche	paravalanche
+kriegspiels	kriegspiel
+assurable	assurable
+adjugent	adjuger
+bouzine	bouzine
+Paraplégie	paraplégie
+atteignons	atteindre
+affronteront	affronter
+macro-instructions	macro-instruction
+inséparable	inséparable
+éphémères	éphémère
+Utilise	utiliser
+nidificatrices	nidificateur
+ophidienne	ophidien
+entremêlement	entremêlement
+égalisés	égaliser
+étruscologue	étruscologue
+matons	maton
+demanderiez	demander
+Pitt	Pitt
+flamboyaient	flamboyer
+Nunchaku	nunchaku
+Harcelez	harceler
+générât	générer
+aldéhyde	aldéhyde
+psalmodie	psalmodie
+fesses	fesse
+demi-espaces	demi-espace
+lût	lire
+Écloseries	écloserie
+Abouter	abouter
+sclérifiée	sclérifier
+lardées	larder
+TRInité	trinité
+soudage	soudage
+voltages	voltage
+provenances	provenance
+gambadaient	gambader
+Semblaient	sembler
+inaperçu	inaperçu
+bousculades	bousculade
+comblanchien	comblanchien
+Démonique	démonique
+archières	archière
+renouer	renouer
+ennuya	ennuyer
+mugissement	mugissement
+quadrilobés	quadrilobé
+spore	spore
+ESPACE	espace
+élaboreront	élaborer
+instigateurs	instigateur
+stéatites	stéatite
+Soviétisation	soviétisation
+Tauromachies	tauromachie
+valorisés	valoriser
+Aches	ache
+défausse	défausse
+revivifier	revivifier
+triplace	triplace
+Parotidectomie	parotidectomie
+ostioles	ostiole
+Protègements	protègement
+tabellaire	tabellaire
+galgal	galgal
+auto-adhésifs	auto-adhésif
+Avant-Guerre	avant-guerre
+raconteras	raconter
+neuropharmacologie	neuropharmacologie
+antisoviétisme	antisoviétisme
+spectrogrammes	spectrogramme
+sacrement	sacrement
+Pensiez	penser
+politicaillerie	politicaillerie
+attarderai	attarder
+jojos	jojo
+Aller	aller
+ameublissait	ameublir
+incinérés	incinérer
+éliminant	éliminer
+baptisera	baptiser
+orphisme	orphisme
+artisanes	artisane
+nuageuses	nuageux
+harmoniserait	harmoniser
+centrifuges	centrifuge
+désenchantent	désenchanter
+agrandissement	agrandissement
+pédale	pédale
+reliez	relier
+physiognomonique	physiognomonique
+devant	devant
+obscurcissait	obscurcir
+redresse	redresser
+Criminelle	criminel
+saperas	saper
+désorganisés	désorganiser
+manufacturer	manufacturer
+pommerais	pommer
+sous-exposées	sous-exposer
+adonnés	adonner
+compléta	compléter
+canthares	canthare
+Jessica	Jessica
+prolongerons	prolonger
+salées	salé
+prodiguent	prodiguer
+remballe	remballer
+matricée	matricer
+conversait	converser
+rocheux	rocheux
+glanduleuse	glanduleux
+présidentialiste	présidentialiste
+taupinière	taupinière
+Peignoir	peignoir
+transmisses	transmettre
+périhélies	périhélie
+Difficiles	difficile
+Spirantes	spirant
+érotomane	érotomane
+Patrouilleur	patrouilleur
+Dérives	dérive
+ennéagones	ennéagone
+isosonie	isosonie
+Reformuler	reformuler
+pâtissière	pâtissier
+Prompt	prompt
+sanctifies	sanctifier
+Liseurs	liseur
+redémoli	redémolir
+gagman	gagman
+toxicogène	toxicogène
+miraillé	mirailler
+Implantez	implanter
+bêche-de-mer	bêche-de-mer
+prêtes	prêt
+contraindre	contraindre
+Impliquant	impliquer
+dépensèrent	dépenser
+subsidiaire	subsidiaire
+favisme	favisme
+courçon	courçon
+électives	électif
+comprimés	comprimé
+gallo-romaine	gallo-romain
+réaménagea	réaménager
+tartines	tartine
+sanguine	sanguin
+échaliers	échalier
+maltraitait	maltraiter
+urgente	urgent
+exposa	exposer
+directoriale	directorial
+offrais	offrir
+astronomie	astronomie
+avant-pays	avant-pays
+Muflier	muflier
+mélasse	mélasse
+névroptère	névroptère
+holorime	holorime
+Reprenant	reprendre
+JASMIN	jasmin
+réductones	réductone
+démissionneront	démissionner
+transies	transi
+Synéchies	synéchie
+vêlages	vêlage
+ypérite	ypérite
+fidélités	fidélité
+abaissera	abaisser
+Polyalcool	polyalcool
+Duumvirat	duumvirat
+oxalide	oxalide
+greluches	greluche
+Saint-Cyr	Saint-Cyr
+virga	virga
+figement	figement
+sensuel	sensuel
+défoulement	défoulement
+Hydrographique	hydrographique
+interprétatives	interprétatif
+simulant	simuler
+fredons	fredon
+Barnacle	barnacle
+dynasties	dynastie
+gémissait	gémir
+Contre-pied	contre-pied
+synchronisées	synchroniser
+écorné	écorner
+aussière	aussière
+méharistes	méhariste
+perhydrol	perhydrol
+Passing-shot	passing-shot
+millimes	millime
+Palmée	palmer
+bougeoirs	bougeoir
+Dévoiler	dévoiler
+pavez	paver
+Grassette	grassette
+alourdira	alourdir
+XXXVIIe	XXXVIIe
+procures	procure
+médiats	médiat
+tends	tendre
+Hyperespace	hyperespace
+panels	panel
+déblocage	déblocage
+ecclésiastique	ecclésiastique
+recrutèrent	recruter
+Élan	élan
+confucianiste	confucianiste
+sertit	sertir
+Sacrifiant	sacrifier
+chefS	chef
+Créant	créer
+unissant	unir
+Répression	répression
+antibourgeoise	antibourgeois
+introjectées	introjecter
+radioguidage	radioguidage
+épilés	épiler
+poireauter	poireauter
+signalisés	signaliser
+sublinguale	sublingual
+irréalisée	irréalisé
+édulcorer	édulcorer
+Lavoir	lavoir
+pointeries	pointerie
+dyades	dyade
+ragusaine	ragusain
+balustra	balustrer
+historicisme	historicisme
+Encan	encan
+éthiopiens	éthiopien
+émietter	émietter
+expirée	expirer
+récompensait	récompenser
+piété	piété
+Reformulé	reformuler
+aryballes	aryballe
+déchant	déchant
+RER	RER
+transférerait	transférer
+poursuivraient	poursuivre
+Arrière-Pays	arrière-pays
+misérable	misérable
+Désinences	désinence
+aval	aval
+forçant	forcer
+fritter	fritter
+décollable	décollable
+Brouetteur	brouetteur
+coloriés	colorier
+mendigot	mendigot
+gaussa	gausser
+thrombosé	thrombosé
+ministre-présidente	ministre-président
+prothésistes	prothésiste
+Imams	imam
+aboutissants	aboutissant
+Radome	radome
+corinthien	corinthien
+qualifiez	qualifier
+enfermement	enfermement
+féline	félin
+sanctionnerait	sanctionner
+domestiquées	domestiqué
+raccommode	raccommoder
+paravertébrale	paravertébral
+ignorées	ignorer
+xanthie	xanthie
+bossués	bossuer
+contactait	contacter
+jalonnaient	jalonner
+Notoire	notoire
+Niant	nier
+feuillardier	feuillardier
+Leucite	leucite
+désaltéra	désaltérer
+Impérialismes	impérialisme
+balivernes	baliverne
+herpétiques	herpétique
+brûlaient	brûler
+bouvière	bouvier|bouvière
+jaffe	jaffe
+propulsèrent	propulser
+dépilant	dépiler
+contactez	contacter
+omnisport	omnisport
+coutils	coutil
+incarcéreront	incarcérer
+effraient	effrayer
+salops	salop
+Touchons	toucher
+biparti	biparti
+sûre	sûr
+superposées	superposer
+roideur	roideur
+mulâtresse	mulâtre
+front	front
+officialisera	officialiser
+trilobée	trilobé
+trempage	trempage
+stationnerait	stationner
+extinctif	extinctif
+parr	parr
+va-vite	va-vite
+pelliculées	pelliculé
+progéniteurs	progéniteur
+concourir	concourir
+récusables	récusable
+luttez	lutter
+Coquins	coquin
+mahaleb	mahaleb
+gravèrent	graver
+Pachas	pacha
+alkyles	alkyle
+SYNAPSE	synapse
+étayait	étayer|étayer
+Défini	définir
+haïmes	haïr
+élis	élire
+géologiquement	géologiquement
+Écoutant	écouter
+escalator	escalator
+tombantes	tombant
+farads	farad
+compensons	compenser
+planteraient	planter
+présidentiel	présidentiel
+Réinterprétés	réinterpréter
+persuadaient	persuader
+digères	digérer
+fermentées	fermenter
+acquissiez	acquérir
+mouds	moudre
+accoupla	accoupler
+autodestructeurs	autodestructeur
+inconnaissable	inconnaissable
+Congratulé	congratuler
+viscaria	viscaria
+faustiens	faustien
+cordial	cordial
+tour-opérateur	tour-opérateur
+Briquer	briquer
+Bureaux	bureau
+aquariums	aquarium
+Rogueries	roguerie
+porte-savon	porte-savon
+faisons	faire
+fourra	fourrer
+conspuent	conspuer
+taise	taire
+Déduits	déduit
+Tentacules	tentacule
+procure	procurer
+race	race
+helvétisme	helvétisme
+radioastronomique	radioastronomique
+BOB	Bob
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/data/french_lemmas.txt	Tue Oct 22 15:56:01 2013 +0200
@@ -0,0 +1,205906 @@
+<<	<<
+>>	>>
+___	_
+­	-
+--	--
+-	-
+,	,
+;	;
+:	:
+!	!
+?	?
+/	/
+...	...
+.	.
+'	'
+"	"
+«	«
+»	»
+(	(
+)	)
+[	[
+]	]
+&	&
+%	%
++	+
+‰	‰
+›	›
+A2	A2
+A	à
+à	à
+À	à
+aa	aa
+aA	aa
+a	avoir
+ab	ab
+abaca	abaca
+Abaca	abaca
+ABACA	abaca
+abacules	abacule
+abaissa	abaisser
+abaissable	abaissable
+abaissaient	abaisser
+abaissait	abaisser
+abaissant	abaisser
+Abaissant	abaisser
+abaissante	abaissant
+abaissantes	abaissant
+abaisse	abaisse
+abaissé	abaisser
+abaissée	abaisser
+abaissées	abaisser
+abaisse-langue	abaisse-langue
+abaissement	abaissement
+Abaissement	abaissement
+abaissements	abaissement
+abaissent	abaisser
+abaissera	abaisser
+abaisser	abaisser
+Abaisser	abaisser
+abaisseraient	abaisser
+abaisserait	abaisser
+abaissèrent	abaisser
+abaisseront	abaisser
+abaisses	abaisser
+abaissés	abaisser
+abaisseur	abaisseur
+Abaisseur	abaisseur
+abaisseurs	abaisseur
+abaissez	abaisser
+Abaissez	abaisser
+abaissons	abaisser
+abajoue	abajoue
+Abajoue	abajoue
+abajoues	abajoue
+abalé	abalé
+abalone	abalone
+abandon	abandon
+Abandon	abandon
+abandonna	abandonner
+Abandonna	abandonner
+abandonnai	abandonner
+abandonnaient	abandonner
+abandonnais	abandonner
+abandonnait	abandonner
+abandonnant	abandonner
+Abandonnant	abandonner
+abandonnassent	abandonner
+abandonnât	abandonner
+abandonnataire	abandonnataire
+abandonnateur	abandonnateur
+Abandonnateur	abandonnateur
+abandonne	abandonner
+abandonné	abandonner
+Abandonné	abandonner
+abandonnée	abandonner
+Abandonnée	abandonner
+abandonnées	abandonner
+abandonnement	abandonnement
+abandonnent	abandonner
+Abandonnent	abandonner
+abandonnera	abandonner
+abandonner	abandonner
+Abandonner	abandonner
+abandonnerai	abandonner
+abandonneraient	abandonner
+abandonnerais	abandonner
+abandonnerait	abandonner
+abandonneras	abandonner
+abandonnèrent	abandonner
+abandonnerez	abandonner
+abandonneriez	abandonner
+abandonnerions	abandonner
+abandonnerons	abandonner
+abandonneront	abandonner
+abandonnes	abandonner
+abandonnés	abandonner
+abandonnez	abandonner
+Abandonnez	abandonner
+abandonniez	abandonner
+abandonnions	abandonner
+abandonnique	abandonnique
+Abandonnique	abandonnique
+abandonniques	abandonnique
+abandonnons	abandonner
+Abandonnons	abandonner
+abandons	abandon
+abaque	abaque
+abaques	abaque
+abasie	abasie
+abasourdi	abasourdir
+Abasourdi	abasourdir
+abasourdie	abasourdir
+Abasourdie	abasourdir
+abasourdies	abasourdir
+abasourdis	abasourdir
+Abasourdis	abasourdir
+abasourdit	abasourdir
+Abat	abat
+abat	abattre
+abatage	abatage
+abâtardi	abâtardir
+abâtardie	abâtardir
+abâtardies	abâtardir
+abâtardir	abâtardir
+abâtardis	abâtardir
+abâtardissement	abâtardissement
+abâtardit	abâtardir
+abatis	abatis
+abat-jour	abat-jour
+abats	abat
+ABATS	abat
+abat-son	abat-son
+abat-sons	abat-sons
+abattable	abattable
+abattables	abattable
+abattage	abattage
+Abattage	abattage
+abattages	abattage
+abattaient	abattre
+abattait	abattre
+abattant	abattre
+abattants	abattant
+abatte	abattre
+abattée	abattée
+abattement	abattement
+abattements	abattement
+abattent	abattre
+abattes	abattre
+abatteur	abatteur
+abatteurs	abatteur
+abatteuse	abatteur
+abatteuses	abatteur
+abattez	abattre
+Abattez	abattre
+abattirent	abattre
+abattis	abattis
+Abattis	abattis
+abattissent	abattre
+abattit	abattre
+abattoir	abattoir
+Abattoir	abattoir
+abattoirs	abattoir
+Abattoirs	abattoir
+abattons	abattre
+Abattons	abattre
+abattra	abattre
+abattraient	abattre
+abattrait	abattre
+abattras	abattre
+abattre	abattre
+Abattre	abattre
+abattrez	abattre
+abattront	abattre
+abattu	abattre
+abattue	abattre
+Abattue	abattre
+abattues	abattre
+Abattues	abattre
+abattures	abatture
+abattus	abattre
+Abattus	abattre
+abat-voix	abat-voix
+abbaside	abbaside
+Abbasides	abbaside
+abbatial	abbatial
+abbatiale	abbatial
+abbatiales	abbatial
+Abbatiales	abbatial
+abbatials	abbatial
+abbatiaux	abbatial
+abbaye	abbaye
+Abbaye	abbaye
+ABBAYE	abbaye
+Abbaye-aux-Dames	Abbaye-aux-Dames
+abbayes	abbaye
+abbé	abbé
+abbés	abbé
+abbesse	abbesse
+abbesses	abbesse
+Abbeville	Abbeville
+ABBEVILLE	Abbeville
+abbevillien	abbevillien
+abbevillienne	abbevillien
+ABC	ABC
+abcédée	abcéder
+abcédées	abcéder
+abcès	abcès
+Abcès	abcès
+Abdala-Pacha	Abdala-pacha
+Abdalla	Abdalla
+abdicataires	abdicataire
+abdication	abdication
+abdications	abdication
+Abdications	abdication
+abdiqua	abdiquer
+abdiquaient	abdiquer
+abdiquait	abdiquer
+abdiquant	abdiquer
+Abdiquant	abdiquer
+abdiquât	abdiquer
+abdique	abdiquer
+abdiqué	abdiquer
+abdiquée	abdiquer
+abdiquent	abdiquer
+abdiquera	abdiquer
+abdiquer	abdiquer
+abdiquerai	abdiquer
+abdiquerait	abdiquer
+abdiquèrent	abdiquer
+abdomen	abdomen
+Abdomen	abdomen
+abdomens	abdomen
+Abdomens	abdomen
+abdominal	abdominal
+Abdominal	abdominal
+abdominale	abdominal
+Abdominale	abdominal
+abdominales	abdominal
+abdominaux	abdominal
+abducteur	abducteur
+abducteurs	abducteur
+abduction	abduction
+abductions	abduction
+abécédaire	abécédaire
+ABÉCÉDAIRE	abécédaire
+abécédaires	abécédaire
+abée	abée
+abeillage	abeillage
+Abeillage	abeillage
+abeille	abeille
+abeilles	abeille
+Abeilles	abeille
+Abel	Abel
+ABEL	Abel
+abélien	abélien
+abélienne	abélien
+abéliennes	abélien
+abéliens	abélien
+aber	aber
+aberrance	aberrance
+aberrant	aberrant
+Aberrant	aberrer
+aberrante	aberrant
+aberrantes	aberrant
+aberrants	aberrant
+aberration	aberration
+Aberration	aberration
+aberrations	aberration
+Aberrations	aberration
+aberre	aberrer
+aberré	aberrer
+aberrée	aberrer
+aberrés	aberrer
+abers	aber
+abêti	abêtir
+abêtie	abêtir
+abêtir	abêtir
+abêtissant	abêtissant
+abêtissante	abêtissant
+abêtissement	abêtissement
+abêtissent	abêtir
+abêtisseur	abêtisseur
+abêtit	abêtir
+abhorra	abhorrer
+abhorraient	abhorrer
+abhorrait	abhorrer
+abhorrant	abhorrer
+Abhorrant	abhorrer
+abhorrassent	abhorrer
+abhorre	abhorrer
+abhorré	abhorrer
+abhorrée	abhorrer
+Abhorrée	abhorrer
+abhorrées	abhorrer
+abhorrent	abhorrer
+abhorrer	abhorrer
+abhorrés	abhorrer
+abies	abies
+abiétacées	abiétacées
+abiétique	abiétique
+abima	abimer
+abîma	abîmer
+abimaient	abimer
+abîmaient	abîmer
+abimait	abimer
+abîmait	abîmer
+abimant	abimer
+abîmant	abîmer
+abîme	abîme
+abime	abimer
+abimé	abimer
+Abimé	abimer
+abîmé	abîmer
+abimée	abimer
+Abimée	abimer
+abîmée	abîmer
+Abîmée	abîmer
+abimées	abimer
+abîmées	abîmer
+abiment	abimer
+abîment	abîmer
+abimera	abimer
+abîmera	abîmer
+abimer	abimer
+abîmer	abîmer
+Abîmer	abîmer
+abimerait	abimer
+abîmerait	abîmer
+abîmèrent	abîmer
+abîmeront	abîmer
+abîmes	abîme
+Abîmes	abîme
+abimes	abimer
+abimés	abimer
+abîmés	abîmer
+Abîmés	abîmer
+abîmez	abîmer
+abîmons	abîmer
+abiotique	abiotique
+abiotiques	abiotique
+abject	abject
+abjecte	abject
+abjectement	abjectement
+abjectes	abject
+abjection	abjection
+abjections	abjection
+abjects	abject
+abjura	abjurer
+abjurait	abjurer
+abjurant	abjurer
+abjurassent	abjurer
+abjuration	abjuration
+Abjuration	abjuration
+abjurations	abjuration
+abjure	abjurer
+Abjure	abjurer
+abjuré	abjurer
+abjurée	abjurer
+abjurent	abjurer
+abjurera	abjurer
+abjurer	abjurer
+abjureraient	abjurer
+abjurèrent	abjurer
+abjureront	abjurer
+abjurés	abjurer
+abjurez	abjurer
+ablactation	ablactation
+ablatant	ablater
+ablaté	ablater
+ablater	ablater
+ablatif	ablatif
+Ablatif	ablatif
+ablatifs	ablatif
+ablation	ablation
+Ablation	ablation
+ABLATION	ablation
+ablations	ablation
+able	able
+ABLE	able
+ablégat	ablégat
+ablépharie	ablépharie
+ables	able
+ablette	ablette
+ablettes	ablette
+Ablettes	ablette
+ablocage	ablocage
+ablution	ablution
+ablutions	ablution
+Ablutions	ablution
+abnégation	abnégation
+abnégations	abnégation
+abo	abo
+aboi	aboi
+aboie	aboyer
+aboiement	aboiement
+Aboiement	aboiement
+aboiements	aboiement
+aboient	aboyer
+aboiera	aboyer
+aboies	aboyer
+abois	aboi
+aboli	abolir
+Aboli	abolir
+abolie	abolir
+abolies	abolir
+abolira	abolir
+abolir	abolir
+aboliraient	abolir
+abolirais	abolir
+abolirait	abolir
+abolirent	abolir
+abolirez	abolir
+abolirons	abolir
+aboliront	abolir
+abolis	abolir
+abolissaient	abolir
+abolissait	abolir
+abolissant	abolir
+Abolissant	abolir
+abolisse	abolir
+abolissent	abolir
+Abolissez	abolir
+abolissons	abolir
+Abolissons	abolir
+abolit	abolir
+Abolit	abolir
+abolît	abolir
+abolition	abolition
+Abolition	abolition
+abolitionnisme	abolitionnisme
+Abolitionnisme	abolitionnisme
+abolitionniste	abolitionniste
+Abolitionniste	abolitionniste
+abolitionnistes	abolitionniste
+abolitions	abolition
+Abolitions	abolition
+abomasum	abomasum
+abominable	abominable
+Abominable	abominable
+ABOminable	abominable
+abominablement	abominablement
+abominables	abominable
+Abominables	abominable
+abomination	abomination
+abominations	abomination
+abomine	abominer
+abominent	abominer
+abominés	abominer
+abonda	abonder
+abondaient	abonder
+abondait	abonder
+abondamment	abondamment
+Abondamment	abondamment
+abondance	abondance
+Abondance	abondance
+abondances	abondance
+Abondances	abondance
+abondanciste	abondanciste
+abondant	abondant
+Abondant	abonder
+abondante	abondant
+Abondante	abondant
+abondantes	abondant
+abondants	abondant
+abonde	abonder
+abondé	abonder
+Abondé	abonder
+abondée	abonder
+abondées	abonder
+abondement	abondement
+abondements	abondement
+abondent	abonder
+Abondent	abonder
+abonder	abonder
+abonderait	abonder
+abondèrent	abonder
+abondés	abonder
+abondons	abonder
+abonna	abonner
+abonnant	abonner
+abonnataire	abonnataire
+abonne	abonner
+abonné	abonner
+Abonné	abonner
+abonnée	abonné
+Abonnée	abonner
+abonnées	abonné
+abonnement	abonnement
+abonnements	abonnement
+abonnent	abonner
+abonner	abonner
+abonneraient	abonner
+abonnés	abonné
+Abonnés	abonné
+Abonnez	abonner
+abonnir	abonnir
+aboral	aboral
+aborale	aboral
+aborda	aborder
+abordable	abordable
+abordables	abordable
+abord	abord
+abordage	abordage
+abordages	abordage
+Abordages	abordage
+abordaient	aborder
+abordais	aborder
+abordait	aborder
+abordant	aborder
+Abordant	aborder
+abordât	aborder
+aborde	aborder
+Aborde	aborder
+abordé	aborder
+Abordé	aborder
+abordée	aborder
+Abordée	aborder
+abordées	aborder
+abordent	aborder
+abordera	aborder
+aborder	aborder
+aborderait	aborder
+abordèrent	aborder
+aborderez	aborder
+aborderons	aborder
+aborderont	aborder
+abordes	aborder
+abordés	aborder
+abordeur	abordeur
+abordez	aborder
+Abordez	aborder
+abordions	aborder
+abordons	aborder
+Abordons	aborder
+abords	abord
+Abords	abord
+aborigène	aborigène
+aborigènes	aborigène
+abornait	aborner
+abornée	aborner
+abornement	abornement
+abornements	abornement
+aborner	aborner
+abornés	aborner
+abortif	abortif
+Abortif	abortif
+abortifs	abortif
+abortion	abortion
+abortions	abortion
+abortive	abortif
+Abortive	abortif
+abortives	abortif
+aboucha	aboucher
+abouchant	aboucher
+abouche	aboucher
+abouché	aboucher
+abouchement	abouchement
+Abouchement	abouchement
+abouchent	aboucher
+aboucher	aboucher
+abouchés	aboucher
+aboulie	aboulie
+Aboulie	aboulie
+Aboulies	aboulie
+aboulique	aboulique
+abouliques	aboulique
+about	about
+aboutant	abouter
+aboute	abouter
+abouté	abouter
+Abouté	abouter
+aboutée	abouter
+aboutées	abouter
+aboutement	aboutement
+aboutent	abouter
+abouter	abouter
+Abouter	abouter
+aboutés	abouter
+abouti	aboutir
+aboutie	aboutir
+Aboutie	aboutir
+abouties	aboutir
+aboutira	aboutir
+aboutir	aboutir
+Aboutir	aboutir
+aboutiraient	aboutir
+aboutirait	aboutir
+aboutirent	aboutir
+aboutirez	aboutir
+aboutirons	aboutir
+aboutiront	aboutir
+aboutis	aboutir
+aboutissaient	aboutir
+Aboutissaient	aboutir
+aboutissait	aboutir
+aboutissant	aboutir
+aboutissants	aboutissant
+aboutisse	aboutir
+aboutissement	aboutissement
+Aboutissement	aboutissement
+aboutissements	aboutissement
+aboutissent	aboutir
+aboutissez	aboutir
+aboutissions	aboutir
+aboutissons	aboutir
+aboutit	aboutir
+Aboutit	aboutir
+aboutît	aboutir
+abouts	about
+aboya	aboyer
+aboyaient	aboyer
+aboyais	aboyer
+aboyait	aboyer
+aboyant	aboyant
+aboyante	aboyant
+aboyé	aboyer
+aboyée	aboyer
+aboyer	aboyer
+aboyeur	aboyeur
+Aboyeur	aboyeur
+aboyeurs	aboyeur
+aboyeuse	aboyeur
+Aboyeuse	aboyeur
+aboyez	aboyer
+Aboyez	aboyer
+ABRA	abra
+abracadabra	abracadabra
+Abracadabra	abracadabra
+abracadabrant	abracadabrant
+abracadabrante	abracadabrant
+abracadabrantes	abracadabrant
+abracadabrantesque	abracadabrantesque
+abracadabrantesques	abracadabrantesque
+abracadabrants	abracadabrant
+Abraham	Abraham
+AbraHam	Abraham
+AbRaham	Abraham
+ABRAHAM	Abraham
+abras	abra
+abrasant	abraser
+abrase	abraser
+abrasé	abraser
+abrasée	abraser
+abrasement	abrasement
+abraser	abraser
+abrasif	abrasif
+abrasifs	abrasif
+abrasin	abrasin
+abrasion	abrasion
+abrasions	abrasion
+abrasive	abrasif
+abrasives	abrasif
+abraxas	abraxas
+Abraxas	abraxas
+abréaction	abréaction
+abréactions	abréaction
+abréagi	abréagir
+abrégea	abréger
+abrège	abréger
+abrégé	abréger
+Abrégé	abréger
+abrégeaient	abréger
+abrégeait	abréger
+abrégeant	abréger
+abrégée	abréger
+Abrégée	abréger
+abrégées	abréger
+abrègent	abréger
+abrégeons	abréger
+Abrégeons	abréger
+abrégera	abréger
+abréger	abréger
+Abréger	abréger
+abrégèrent	abréger
+abrégés	abrégé
+abrèges	abréger
+Abrégés	abréger
+abreuva	abreuver
+abreuvage	abreuvage
+abreuvaient	abreuver
+abreuvait	abreuver
+abreuvant	abreuver
+abreuve	abreuver
+abreuvé	abreuver
+abreuvée	abreuver
+abreuvées	abreuver
+abreuvement	abreuvement
+abreuvent	abreuver
+abreuvera	abreuver
+abreuver	abreuver
+Abreuver	abreuver
+abreuveraient	abreuver
+abreuverait	abreuver
+abreuvèrent	abreuver
+abreuvés	abreuver
+abreuvez	abreuver
+abreuvoir	abreuvoir
+Abreuvoir	abreuvoir
+ABREUVOIR	abreuvoir
+abreuvoirs	abreuvoir
+abréviateur	abréviateur
+Abréviateur	abréviateur
+abréviateurs	abréviateur
+abréviatif	abréviatif
+abréviatifs	abréviatif
+abréviation	abréviation
+abréviations	abréviation
+Abréviations	abréviation
+abréviative	abréviatif
+abréviatives	abréviatif
+abri	abri
+ABRI	abri
+abribus	abribus
+Abribus	abribus
+abricot	abricot
+abricoter	abricoter
+abricotier	abricotier
+Abricotier	abricotier
+abricotiers	abricotier
+abricotine	abricotine
+abricots	abricot
+abris	abri
+Abris	abri
+abri-sous-roche	abri-sous-roche
+abrita	abriter
+Abrita	abriter
+abritai	abriter
+abritaient	abriter
+abritait	abriter
+abritant	abriter
+Abritant	abriter
+abritât	abriter
+abrite	abriter
+Abrite	abriter
+abrité	abriter
+Abrité	abriter
+abritée	abriter
+Abritée	abriter
+abritées	abriter
+Abritées	abriter
+abritent	abriter
+abritera	abriter
+abriter	abriter
+Abriter	abriter
+abriteraient	abriter
+abriterais	abriter
+abriterait	abriter
+abritèrent	abriter
+abriteront	abriter
+abrités	abriter
+Abrités	abriter
+abritez	abriter
+abritons	abriter
+abrogatif	abrogatif
+abrogatifs	abrogatif
+abrogation	abrogation
+abrogations	abrogation
+abrogatoire	abrogatoire
+abrogea	abroger
+abrogeables	abrogeable
+abroge	abroger
+abrogé	abroger
+abrogeaient	abroger
+abrogeait	abroger
+abrogeant	abroger
+abrogée	abroger
+Abrogée	abroger
+abrogées	abroger
+abrogent	abroger
+abrogeons	abroger
+abrogera	abroger
+abroger	abroger
+Abroger	abroger
+abrogèrent	abroger
+abrogeront	abroger
+abrogés	abroger
+abrouti	abrouti
+abroutissement	abroutissement
+Abroutissement	abroutissement
+abroutissements	abroutissement
+abrupt	abrupt
+Abrupt	abrupt
+abrupte	abrupt
+abruptement	abruptement
+Abruptement	abruptement
+abruptes	abrupt
+abrupts	abrupt
+abruti	abrutir
+Abruti	abrutir
+abrutie	abrutir
+abrutir	abrutir
+abrutis	abrutir
+abrutissaient	abrutir
+abrutissant	abrutir
+abrutissante	abrutissant
+abrutissantes	abrutissant
+abrutissants	abrutissant
+abrutissement	abrutissement
+Abrutissement	abrutissement
+abrutissent	abrutir
+abrutit	abrutir
+abscisse	abscisse
+abscisses	abscisse
+abscission	abscission
+Abscission	abscission
+abscons	abscons
+absconse	abscons
+absconses	abscons
+absence	absence
+absences	absence
+Absences	absence
+absenta	absenter
+absent	absent
+absentaient	absenter
+absentait	absenter
+absentant	absenter
+absente	absent
+absenté	absenter
+absentée	absenter
+absentéisme	absentéisme
+absentéiste	absentéiste
+absentéistes	absentéiste
+absentent	absenter
+absentera	absenter
+absenter	absenter
+absentèrent	absenter
+absentes	absent
+Absentes	absent
+absentés	absenter
+absentions	absenter
+Absentions	absenter
+absents	absent
+absidal	absidal
+absidale	absidal
+absidales	absidal
+absidaux	absidal
+abside	abside
+Abside	abside
+absides	abside
+absidial	absidial
+absidiale	absidial
+absidiales	absidial
+absidiole	absidiole
+absidioles	absidiole
+absinthe	absinthe
+absinthes	absinthe
+absinthine	absinthine
+absinthisme	absinthisme
+absolu	absoudre
+ABSOLU	absoudre
+absolue	absoudre
+absolues	absolu
+absoluité	absoluité
+Absoluité	absoluité
+absolument	absolument
+absolus	absoudre
+absolut	absoudre
+absolutif	absolutif
+Absolutif	absolutif
+absolution	absolution
+absolutions	absolution
+absolutisme	absolutisme
+Absolutisme	absolutisme
+absolutismes	absolutisme
+absolutiste	absolutiste
+absolutistes	absolutiste
+absolutive	absolutif
+absolutives	absolutif
+absolvaient	absoudre
+absolvais	absoudre
+absolvait	absoudre
+absolvant	absoudre
+absolve	absoudre
+absolvent	absoudre
+absolves	absoudre
+absolvez	absoudre
+absolviez	absoudre
+absolvions	absoudre
+absolvons	absoudre
+absorba	absorber
+absorbable	absorbable
+absorbables	absorbable
+absorbaient	absorber
+absorbait	absorber
+absorbance	absorbance
+absorbances	absorbance
+absorbant	absorber
+Absorbant	absorber
+absorbante	absorbant
+Absorbante	absorbant
+absorbantes	absorbant
+absorbants	absorbant
+absorbe	absorber
+Absorbe	absorber
+absorbé	absorber
+Absorbé	absorber
+absorbée	absorber
+Absorbée	absorber
+absorbées	absorber
+Absorbées	absorber
+absorbement	absorbement
+absorbent	absorber
+absorbera	absorber
+absorber	absorber
+absorberaient	absorber
+absorberais	absorber
+absorberait	absorber
+absorbèrent	absorber
+absorberont	absorber
+absorbés	absorber
+absorbeur	absorbeur
+Absorbeur	absorbeur
+absorbeurs	absorbeur
+absorbons	absorber
+absorptiométrie	absorptiométrie
+absorption	absorption
+aBsorption	absorption
+absorptions	absorption
+absorptivité	absorptivité
+Absorptivité	absorptivité
+absorptivités	absorptivité
+absoudra	absoudre
+absoudrai	absoudre
+absoudraient	absoudre
+absoudrais	absoudre
+absoudrait	absoudre
+absoudras	absoudre
+absoudre	absoudre
+Absoudre	absoudre
+absoudrez	absoudre
+absoudriez	absoudre
+absoudrions	absoudre
+absoudrons	absoudre
+absoudront	absoudre
+absous	absoudre
+Absous	absoudre
+absout	absoudre
+Absout	absoudre
+absoute	absoute
+absoutes	absoute
+abstème	abstème
+Abstème	abstème
+abstèmes	abstème
+abstenaient	abstenir
+abstenait	abstenir
+abstenant	abstenir
+abstenez	abstenir
+Abstenez	abstenir
+absteniez	abstenir
+abstenions	abstenir
+abstenir	abstenir
+abstenons	abstenir
+abstention	abstention
+abstentionnisme	abstentionnisme
+Abstentionnisme	abstentionnisme
+abstentionniste	abstentionniste
+abstentionnistes	abstentionniste
+abstentions	abstention
+abstenu	abstenir
+abstenue	abstenir
+abstenues	abstenir
+abstenus	abstenir
+abstiendra	abstenir
+abstiendrai	abstenir
+abstiendrais	abstenir
+abstiendrait	abstenir
+abstiendrons	abstenir
+abstiendront	abstenir
+abstienne	abstenir
+abstiennent	abstenir
+abstiens	abstenir
+Abstiens	abstenir
+abstient	abstenir
+abstinence	abstinence
+Abstinence	abstinence
+abstinences	abstinence
+Abstinences	abstinence
+abstinent	abstinent
+abstinents	abstinent
+abstinrent	abstenir
+abstint	abstenir
+abstînt	abstenir
+abstract	abstract
+Abstract	abstract
+abstracteur	abstracteur
+abstracteurs	abstracteur
+abstractifs	abstractif
+abstraction	abstraction
+Abstraction	abstraction
+abstractions	abstraction
+abstractive	abstractif
+abstracts	abstract
+abstraire	abstraire
+abstrait	abstrait
+abstraite	abstraire
+abstraitement	abstraitement
+abstraites	abstraire
+abstraits	abstrait
+abstrayant	abstraire
+abstrus	abstrus
+abstruse	abstrus
+abstruses	abstrus
+absurde	absurde
+absurdement	absurdement
+absurdes	absurde
+absurdité	absurdité
+Absurdité	absurdité
+absurdités	absurdité
+abuna	abuna
+Abuna	abuna
+abusa	abuser
+abus	abus
+Abus	abus
+abusaient	abuser
+abusais	abuser
+abusait	abuser
+abusant	abuser
+Abusant	abuser
+abusassent	abuser
+abuse	abuser
+abusé	abuser
+Abusé	abuser
+abusée	abuser
+Abusée	abuser
+abusées	abuser
+abusent	abuser
+abusera	abuser
+abuser	abuser
+abuserai	abuser
+abuseraient	abuser
+abuserait	abuser
+abuseras	abuser
+abusèrent	abuser
+abuses	abuser
+abusés	abuser
+Abusés	abuser
+abuseur	abuseur
+Abuseur	abuseur
+abuseurs	abuseur
+abusez	abuser
+abusiez	abuser
+abusif	abusif
+abusifs	abusif
+abusive	abusif
+abusivement	abusivement
+abusives	abusif
+abuta	abuter
+abutilon	abutilon
+abyme	abyme
+abymes	abyme
+abyssal	abyssal
+abyssale	abyssal
+abyssales	abyssal
+abyssaux	abyssal
+abysse	abysse
+abysses	abysse
+abyssin	abyssin
+abyssine	abyssin
+abyssines	abyssin
+Abyssinie	Abyssinie
+abyssins	abyssin
+aca	aca
+Aca	aca
+acabit	acabit
+acabits	acabit
+ac	ac
+Ac	ac
+acacia	acacia
+acacias	acacia
+Acacias	acacia
+académicien	académicien
+Académicien	académicien
+académicienne	académicien
+académiciennes	académicien
+académiciens	académicien
+académie	académie
+Académie	Académie
+AcAdémie	Académie
+ACAdémie	Académie
+ACADÉMIE	académie
+académies	académie
+académique	académique
+académiquement	académiquement
+Académiquement	académiquement
+académiques	académique
+académise	académiser
+académisée	académiser
+académisme	académisme
+Académisme	académisme
+académismes	académisme
+académiste	académiste
+académistes	académiste
+acadien	acadien
+Acadien	acadien
+acadienne	acadien
+acadiennes	acadien
+Acadiennes	acadien
+acadiens	acadien
+Acadiens	acadien
+acajou	acajou
+acajous	acajou
+acalculie	acalculie
+acalèphes	acalèphes
+acalyphe	acalyphe
+acanthacées	acanthacées
+Acanthacées	acanthacées
+acanthaires	acanthaires
+acanthe	acanthe
+acanthes	acanthe
+Acanthes	acanthe
+acanthias	acanthias
+Acanthocarpe	acanthocarpe
+acanthocéphales	acanthocéphales
+acanthodes	acanthodes
+acanthodiens	acanthodiens
+acanthoptérygiens	acanthoptérygien
+Acanthoptérygiens	acanthoptérygien
+acanthure	acanthure
+Acanthure	acanthure
+acares	acare
+acariâtre	acariâtre
+acariâtres	acariâtre
+acaricide	acaricide
+Acaricide	acaricide
+acaricides	acaricide
+acariens	acariens
+acariose	acariose
+acarologie	acarologie
+acas	aca
+acatalepsie	acatalepsie
+acatène	acatène
+acaule	acaule
+Acaule	acaule
+acaules	acaule
+accabla	accabler
+accablaient	accabler
+accablait	accabler
+accablant	accablant
+accablante	accablant
+accablantes	accablant
+accablants	accablant
+accablassent	accabler
+accable	accabler
+accablé	accabler
+Accablé	accabler
+accablée	accabler
+Accablée	accabler
+accablées	accabler
+accablement	accablement
+Accablement	accablement
+accablent	accabler
+accablera	accabler
+accabler	accabler
+Accabler	accabler
+accablèrent	accabler
+accablerons	accabler
+accables	accabler
+accablés	accabler
+Accablés	accabler
+accablons	accabler
+accalmie	accalmie
+Accalmie	accalmir
+accalmies	accalmie
+accapara	accaparer
+accaparaient	accaparer
+accaparait	accaparer
+accaparant	accaparer
+accaparante	accaparant
+accapare	accaparer
+accaparé	accaparer
+Accaparé	accaparer
+accaparée	accaparer
+accaparées	accaparer
+accaparement	accaparement
+accaparements	accaparement
+accaparent	accaparer
+accaparera	accaparer
+accaparer	accaparer
+accapareraient	accaparer
+accaparèrent	accaparer
+accaparés	accaparer
+accapareur	accapareur
+accapareurs	accapareur
+Accapareurs	accapareur
+accapareuse	accapareur
+accaparez	accaparer
+accastillage	accastillage
+accéda	accéder
+Accéda	accéder
+accédaient	accéder
+accédais	accéder
+accédait	accéder
+accédant	accéder
+Accédant	accéder
+accédât	accéder
+accède	accéder
+Accède	accéder
+accédé	accéder
+Accédé	accéder
+accédée	accéder
+Accédée	accéder
+accédées	accéder
+accèdent	accéder
+accédera	accéder
+accéder	accéder
+Accéder	accéder
+accéderait	accéder
+accédèrent	accéder
+accéderez	accéder
+accéderont	accéder
+accédés	accéder
+accédez	accéder
+Accédez	accéder
+accédions	accéder
+accédons	accéder
+accéléra	accélérer
+accéléraient	accélérer
+accélérais	accélérer
+accélérait	accélérer
+accelerando	accelerando
+Accelerando	accelerando
+accélérant	accélérer
+Accélérant	accélérer
+accélérateur	accélérateur
+Accélérateur	accélérateur
+accélérateurs	accélérateur
+Accélérateurs	accélérateur
+accélération	accélération
+accélérations	accélération
+accélératrice	accélérateur
+Accélératrice	accélérateur
+accélératrices	accélérateur
+accélère	accélérer
+Accélère	accélérer
+accéléré	accélérer
+Accéléré	accélérer
+accélérée	accélérer
+Accélérées	accéléré
+accélérées	accélérer
+accélèrent	accélérer
+accélérera	accélérer
+accélérer	accélérer
+accéléreraient	accélérer
+accélérerait	accélérer
+accélérèrent	accélérer
+accélérerez	accélérer
+accéléreront	accélérer
+accélérés	accélérer
+accélérez	accélérer
+accéléromètre	accéléromètre
+accéléromètres	accéléromètre
+Accéléromètres	accéléromètre
+accense	accense
+accent	accent
+accenteur	accenteur
+Accenteur	accenteur
+accenteurs	accenteur
+Accenteurs	accenteur
+accents	accent
+Accents	accent
+accentua	accentuer
+accentuaient	accentuer
+accentuais	accentuer
+accentuait	accentuer
+accentuant	accentuer
+Accentuant	accentuer
+accentuation	accentuation
+Accentuation	accentuation
+accentuations	accentuation
+accentue	accentuer
+Accentue	accentuer
+accentué	accentuer
+accentuée	accentuer
+Accentuée	accentuer
+accentuées	accentué
+accentuel	accentuel
+accentuelle	accentuel
+accentuelles	accentuel
+accentuels	accentuel
+accentuent	accentuer
+accentuera	accentuer
+accentuer	accentuer
+Accentuer	accentuer
+accentuerais	accentuer
+accentuerait	accentuer
+accentuèrent	accentuer
+accentueront	accentuer
+accentués	accentuer
+Accentuez	accentuer
+accentuiez	accentuer
+accentuons	accentuer
+accepta	accepter
+Accepta	accepter
+acceptabilité	acceptabilité
+acceptable	acceptable
+acceptables	acceptable
+acceptai	accepter
+acceptaient	accepter
+acceptais	accepter
+acceptait	accepter
+acceptant	accepter
+Acceptant	accepter
+acceptants	acceptant
+acceptassent	accepter
+acceptât	accepter
+acceptation	acceptation
+Acceptation	acceptation
+acceptations	acceptation
+accepte	accepter
+accepté	accepter
+Accepté	accepter
+acceptée	accepter
+Acceptée	accepter
+acceptées	accepter
+acceptent	accepter
+acceptera	accepter
+accepter	accepter
+Accepter	accepter
+accepterai	accepter
+accepteraient	accepter
+accepterais	accepter
+Accepterais	accepter
+accepterait	accepter
+accepteras	accepter
+acceptèrent	accepter
+accepterez	accepter
+Accepterez	accepter
+accepterions	accepter
+accepterons	accepter
+accepteront	accepter
+acceptes	accepter
+acceptés	accepter
+Acceptés	accepter
+accepteur	accepteur
+accepteurs	accepteur
+acceptez	accepter
+Acceptez	accepter
+acceptiez	accepter
+acception	acception
+Acception	acception
+acceptions	acception
+Acceptions	acception
+acceptons	accepter
+accès	accès
+accessibilité	accessibilité
+ACCESSIBILITÉ	accessibilité
+accessibilités	accessibilité
+Accessibilités	accessibilité
+accessible	accessible
+Accessible	accessible
+accessibles	accessible
+Accessibles	accessible
+accession	accession
+Accession	accession
+ACCESSION	accession
+accessions	accession
+accessit	accessit
+Accessit	accessit
+accessits	accessit
+accessoire	accessoire
+accessoirement	accessoirement
+Accessoirement	accessoirement
+accessoires	accessoire
+Accessoires	accessoire
+accessoirisa	accessoiriser
+accessoirise	accessoiriser
+accessoirisé	accessoiriser
+accessoirisée	accessoiriser
+accessoirisées	accessoiriser
+accessoirisent	accessoiriser
+accessoiriser	accessoiriser
+accessoirisés	accessoiriser
+accessoiriste	accessoiriste
+accessoiristes	accessoiriste
+accidenta	accidenter
+accident	accident
+accidentant	accidenter
+accidenté	accidenté
+accidente	accidenter
+Accidenté	accidenter
+accidentée	accidenter
+Accidentée	accidenter
+accidentées	accidenté
+accidentel	accidentel
+Accidentel	accidentel
+accidentelle	accidentel
+accidentellement	accidentellement
+Accidentellement	accidentellement
+accidentelles	accidentel
+accidentels	accidentel
+accidentent	accidenter
+accidenter	accidenter
+accidentèrent	accidenter
+accidentés	accidenté
+accidentes	accidenter
+accidents	accident
+Accidents	accident
+accipitridés	accipitridés
+accipitriformes	accipitriformes
+accise	accise
+accises	accise
+acclama	acclamer
+acclamaient	acclamer
+acclamait	acclamer
+acclamant	acclamer
+acclamation	acclamation
+Acclamation	acclamation
+acclamations	acclamation
+Acclamations	acclamation
+acclame	acclamer
+acclamé	acclamer
+Acclamé	acclamer
+acclamée	acclamer
+acclamées	acclamer
+acclament	acclamer
+acclamera	acclamer
+acclamer	acclamer
+acclamerait	acclamer
+acclamèrent	acclamer
+Acclameront	acclamer
+acclamés	acclamer
+Acclamés	acclamer
+acclamions	acclamer
+acclamons	acclamer
+acclimata	acclimater
+acclimatable	acclimatable
+acclimatables	acclimatable
+acclimatait	acclimater
+acclimatant	acclimater
+acclimatation	acclimatation
+acclimatations	acclimatation
+Acclimatations	acclimatation
+acclimate	acclimater
+acclimaté	acclimater
+acclimatée	acclimater
+acclimatées	acclimater
+acclimatement	acclimatement
+acclimatent	acclimater
+acclimatera	acclimater
+acclimater	acclimater
+acclimatèrent	acclimater
+acclimateront	acclimater
+acclimatés	acclimater
+accointance	accointance
+accointances	accointance
+accointe	accointer
+accoisée	accoiser
+accola	accoler
+accolade	accolade
+accoladèrent	accolader
+accolades	accolade
+accolait	accoler
+accolant	accoler
+accole	accoler
+accolé	accoler
+Accolé	accoler
+accolée	accoler
+Accolée	accoler
+accolées	accoler
+Accolées	accoler
+accolement	accolement
+accolements	accolement
+accolent	accoler
+accolera	accoler
+accoler	accoler
+accolerait	accoler
+accolèrent	accoler
+accoleront	accoler
+accolés	accoler
+Accolés	accoler
+accommoda	accommoder
+Accommodage	accommodage
+accommodaient	accommoder
+accommodait	accommoder
+accommodant	accommoder
+accommodante	accommodant
+accommodants	accommodant
+accommodat	accommodat
+accommodation	accommodation
+accommodations	accommodation
+accommode	accommoder
+accommodé	accommoder
+accommodée	accommoder
+accommodées	accommoder
+accommodement	accommodement
+accommodements	accommodement
+Accommodements	accommodement
+accommodent	accommoder
+accommodera	accommoder
+accommoder	accommoder
+accommoderai	accommoder
+accommoderaient	accommoder
+accommoderait	accommoder
+accommodèrent	accommoder
+accommoderont	accommoder
+accommodés	accommoder
+Accommodés	accommoder
+Accommodez	accommoder
+accommodons	accommoder
+accompagna	accompagner
+Accompagna	accompagner
+accompagnai	accompagner
+accompagnaient	accompagner
+Accompagnaient	accompagner
+accompagnait	accompagner
+accompagnant	accompagner
+Accompagnant	accompagner
+accompagnât	accompagner
+accompagnateur	accompagnateur
+accompagnateurs	accompagnateur
+accompagnatrice	accompagnateur
+Accompagnatrice	accompagnateur
+accompagnatrices	accompagnateur
+accompagne	accompagner
+Accompagne	accompagner
+accompagné	accompagner
+Accompagné	accompagner
+accompagnée	accompagner
+Accompagnée	accompagner
+accompagnées	accompagner
+Accompagnées	accompagner
+accompagnement	accompagnement
+Accompagnement	accompagnement
+accompagnements	accompagnement
+Accompagnements	accompagnement
+accompagnent	accompagner
+Accompagnent	accompagner
+accompagnera	accompagner
+accompagner	accompagner
+Accompagner	accompagner
+accompagnerai	accompagner
+accompagneraient	accompagner
+accompagnerais	accompagner
+accompagnerait	accompagner
+accompagnèrent	accompagner
+accompagnerons	accompagner
+accompagneront	accompagner
+accompagnes	accompagner
+accompagnés	accompagner
+Accompagnés	accompagner
+accompagnez	accompagner
+Accompagnez	accompagner
+accompagnons	accompagner
+accompli	accompli
+accomplie	accompli
+accomplies	accomplir
+accomplira	accomplir
+accomplir	accomplir
+accompliR	accomplir
+Accomplir	accomplir
+accomplirai	accomplir
+accompliraient	accomplir
+accomplirais	accomplir
+accomplirait	accomplir
+accompliras	accomplir
+accomplirent	accomplir
+accomplirez	accomplir
+accompliront	accomplir
+accomplis	accomplir
+accomplissaient	accomplir
+accomplissais	accomplir
+accomplissait	accomplir
+accomplissant	accomplir
+Accomplissant	accomplir
+accomplisse	accomplir
+accomplissement	accomplissement
+Accomplissement	accomplissement
+accomplissements	accomplissement
+Accomplissements	accomplissement
+accomplissent	accomplir
+accomplissez	accomplir
+Accomplissez	accomplir
+accomplissiez	accomplir
+accomplissions	accomplir
+accomplissons	accomplir
+accomplit	accomplir
+Accomplit	accomplir
+accomplît	accomplir
+accon	accon
+Accon	accon
+acconier	acconier
+Acconier	acconier
+acconiers	acconier
+Accons	accon
+accora	accorer
+accorage	accorage
+Accorage	accorage
+accorda	accorder
+Accorda	accorder
+ACCORDA	accorder
+accordable	accordable
+accordables	accordable
+accord	accord
+Accord	accord
+accordage	accordage
+Accordage	accordage
+accordages	accordage
+accordai	accorder
+accordaient	accorder
+accordailles	accordailles
+accordais	accorder
+accordait	accorder
+accordance	accordance
+accordant	accorder
+Accordant	accorder
+accordants	accordant
+accordasse	accorder
+accordât	accorder
+accorde	accorder
+accordé	accorder
+Accordé	accorder
+accordée	accorder
+accordéE	accorder
+Accordée	accorder
+accordées	accorder
+Accordées	accorder
+accordent	accorder
+Accordent	accorder
+accordéon	accordéon
+accordéoniste	accordéoniste
+accordéonistes	accordéoniste
+accordéonISTES	accordéoniste
+accordéons	accordéon
+Accordéons	accordéon
+accordera	accorder
+accorder	accorder
+Accorder	accorder
+accorderai	accorder
+accorderaient	accorder
+accorderais	accorder
+accorderait	accorder
+accorderas	accorder
+accordèrent	accorder
+accorderez	accorder
+accorderiez	accorder
+accorderons	accorder
+accorderont	accorder
+accordes	accorder
+Accordes	accorder
+accordés	accorder
+accordeur	accordeur
+Accordeur	accordeur
+accordeurs	accordeur
+accordez	accorder
+Accordez	accorder
+accordiez	accorder
+accordoirs	accordoir
+accordons	accorder
+accords	accord
+Accords	accord
+accore	accore
+Accore	accore
+accorées	accorer
+accorent	accorer
+accorer	accorer
+accores	accore
+accorné	accorné
+accornée	accorné
+accornées	accorné
+accornés	accorné
+accort	accort
+accortes	accort
+accorts	accort
+accosta	accoster
+accostable	accostable
+accostables	accostable
+accostage	accostage
+accostages	accostage
+accostaient	accoster
+accostait	accoster
+accostant	accoster
+Accostant	accoster
+accoste	accoster
+accosté	accoster
+Accosté	accoster
+accostée	accoster
+accostées	accoster
+accostent	accoster
+accostera	accoster
+accoster	accoster
+accostèrent	accoster
+accostés	accoster
+accot	accot
+accotant	accoter
+accoté	accoter
+accotée	accoter
+accotées	accoter
+accotement	accotement
+Accotement	accotement
+accotements	accotement
+Accotements	accotement
+accoter	accoter
+accotés	accoter
+accotoir	accotoir
+accotoirs	accotoir
+accoucha	accoucher
+accouchaient	accoucher
+accouchait	accoucher
+accouchant	accoucher
+accouche	accoucher
+accouché	accoucher
+accouchée	accouchée
+accouchées	accoucher
+accouchement	accouchement
+Accouchement	accouchement
+accouchements	accouchement
+Accouchements	accouchement
+accouchent	accoucher
+accouchera	accoucher
+accoucher	accoucher
+Accoucher	accoucher
+accoucheraient	accoucher
+accoucherait	accoucher
+accoucheras	accoucher
+accouchèrent	accoucher
+accouches	accoucher
+accoucheur	accoucheur
+accoucheurs	accoucheur
+accoucheuse	accoucheur
+accoucheuses	accoucheur
+Accoucheuses	accoucheur
+accouchons	accoucher
+accouda	accouder
+accoude	accouder
+accoudé	accouder
+accoudée	accouder
+accoudées	accouder
+accoudent	accouder
+accouder	accouder
+accoudés	accouder
+accoudoir	accoudoir
+accoudoirs	accoudoir
+accoue	accouer
+accoupla	accoupler
+accouplaient	accoupler
+accouplais	accoupler
+accouplait	accoupler
+accouplant	accoupler
+accouple	accoupler
+accouplé	accoupler
+Accouplé	accoupler
+accouplée	accoupler
+accouplées	accoupler
+accouplement	accouplement
+accouplements	accouplement
+Accouplements	accouplement
+accouplent	accoupler
+accouplera	accoupler
+accoupler	accoupler
+accouplèrent	accoupler
+accoupleront	accoupler
+accouples	accouple
+Accouples	accouple
+accouplés	accoupler
+Accouplez	accoupler
+accouraient	accourir
+accourait	accourir
+accourant	accourir
+Accourant	accourir
+accourcirez	accourcir
+accourcissement	accourcissement
+accoure	accourir
+Accoure	accourir
+accourent	accourir
+accourir	accourir
+accourra	accourir
+accourraient	accourir
+accourront	accourir
+accours	accourir
+accourt	accourir
+accouru	accourir
+Accouru	accourir
+accourue	accourir
+Accourue	accourir
+accourues	accourir
+accoururent	accourir
+accourus	accourir
+accourut	accourir
+accourût	accourir
+accoutrât	accoutrer
+accoutré	accoutrer
+accoutrée	accoutrer
+accoutrement	accoutrement
+Accoutrement	accoutrement
+accoutrements	accoutrement
+accoutrer	accoutrer
+accoutrés	accoutrer
+Accoutrés	accoutrer
+accoutuma	accoutumer
+accoutumai	accoutumer
+accoutumait	accoutumer
+accoutumance	accoutumance
+accoutumances	accoutumance
+accoutumant	accoutumer
+accoutume	accoutumer
+accoutumé	accoutumer
+accoutumée	accoutumé
+accoutumées	accoutumer
+accoutument	accoutumer
+accoutumera	accoutumer
+accoutumer	accoutumer
+accoutumèrent	accoutumer
+accoutumés	accoutumer
+Accoutumés	accoutumer
+accoutumez	accoutumer
+accouvage	accouvage
+accouver	accouver
+Accouver	accouver
+accouveur	accouveur
+accouveurs	accouveur
+accrédita	accréditer
+accréditaient	accréditer
+accréditaire	accréditaire
+accréditaires	accréditaire
+accréditait	accréditer
+accréditant	accréditer
+accréditation	accréditation
+Accréditation	accréditation
+accréditations	accréditation
+accrédite	accréditer
+accrédité	accréditer
+Accrédité	accréditer
+accréditée	accréditer
+Accréditée	accréditer
+accréditées	accréditer
+accréditent	accréditer
+accréditera	accréditer
+accréditer	accréditer
+accréditeraient	accréditer
+accréditerait	accréditer
+accréditèrent	accréditer
+accréditeront	accréditer
+accrédités	accréditer
+Accrédités	accréditer
+accréditeur	accréditeur
+accréditif	accréditif
+accréditifs	accréditif
+accrescent	accrescent
+Accrescent	accrescent
+accrescentes	accrescent
+accrêté	accrêté
+accrétion	accrétion
+Accrétion	accrétion
+accrétions	accrétion
+accroc	accroc
+accrocha	accrocher
+accrochage	accrochage
+Accrochage	accrochage
+accrochages	accrochage
+Accrochages	accrochage
+accrochaient	accrocher
+accrochais	accrocher
+accrochait	accrocher
+accrochant	accrocher
+Accrochant	accrocher
+accrochas	accrocher
+accroche	accroche
+accroché	accrocher
+Accroché	accrocher
+accrochée	accrocher
+Accrochée	accrocher
+accrochées	accrocher
+Accrochées	accrocher
+accrochement	accrochement
+accrochent	accrocher
+Accrochent	accrocher
+accrochera	accrocher
+accrocher	accrocher
+accrocheraient	accrocher
+accrochèrent	accrocher
+accrocherez	accrocher
+accrocheront	accrocher
+accroches	accroche
+accrochés	accrocher
+Accrochés	accrocher
+accrocheur	accrocheur
+accrocheurs	accrocheur
+accrocheuse	accrocheur
+accrocheuses	accrocheur
+accrochez	accrocher
+Accrochez	accrocher
+accrochons	accrocher
+accrocs	accroc
+accroire	accroire
+Accroire	accroire
+accrois	accroire
+accroissaient	accroître
+accroissait	accroître
+accroissant	accroître
+Accroissant	accroître
+accroisse	accroître
+accroissement	accroissement
+accroissements	accroissement
+accroissent	accroître
+accroit	accroire
+Accroit	accroire
+accroît	accroître
+Accroît	accroître
+accroîtra	accroître
+accroîtraient	accroître
+accroîtrait	accroître
+accroître	accroître
+Accroître	accroître
+accroîtront	accroître
+accroupi	accroupir
+accroupie	accroupir
+Accroupie	accroupir
+accroupies	accroupir
+accroupir	accroupir
+accroupis	accroupir
+accroupissait	accroupir
+accroupissant	accroupir
+accroupissement	accroupissement
+accroupissements	accroupissement
+accroupissent	accroupir
+accroupit	accroupir
+accru	accroire
+accrû	accroître
+accrue	accroire|accroître
+Accrue	accroire|accroître
+accrues	accroire|accroître
+accrurent	accroire
+accrus	accroire|accroître
+accrut	accroire
+accrût	accroire|accroître
+accueil	accueil
+accueillaient	accueillir
+accueillait	accueillir
+accueillant	accueillir
+Accueillant	accueillir
+accueillante	accueillant
+accueillantes	accueillant
+accueillants	accueillant
+accueille	accueillir
+Accueille	accueillir
+accueillent	accueillir
+accueillera	accueillir
+accueillerai	accueillir
+accueilleraient	accueillir
+accueillerait	accueillir
+accueillerons	accueillir
+accueilleront	accueillir
+accueillez	accueillir
+accueilli	accueillir
+Accueilli	accueillir
+accueillie	accueillir
+Accueillie	accueillir
+accueillies	accueillir
+accueilliez	accueillir
+accueillir	accueillir
+Accueillir	accueillir
+accueillirent	accueillir
+accueillis	accueillir
+Accueillis	accueillir
+accueillissent	accueillir
+accueillit	accueillir
+Accueillit	accueillir
+accueillons	accueillir
+Accueillons	accueillir
+accueils	accueil
+Accueils	accueil
+accula	acculer
+accul	accul
+acculaient	acculer
+acculait	acculer
+acculant	acculer
+accule	acculer
+acculé	acculer
+Acculé	acculer
+acculée	acculer
+Acculée	acculer
+acculées	acculer
+Acculées	acculer
+acculement	acculement
+acculent	acculer
+acculer	acculer
+Acculer	acculer
+acculerait	acculer
+acculèrent	acculer
+acculés	acculer
+Acculés	acculer
+acculturant	acculturer
+acculturation	acculturation
+acculture	acculturer
+acculturé	acculturer
+acculturée	acculturer
+Acculturée	acculturer
+acculturées	acculturer
+acculturent	acculturer
+acculturer	acculturer
+acculturés	acculturer
+accumula	accumuler
+accumulaient	accumuler
+accumulait	accumuler
+accumulant	accumuler
+Accumulant	accumuler
+accumulassent	accumuler
+accumulateur	accumulateur
+accumulateurs	accumulateur
+Accumulateurs	accumulateur
+accumulation	accumulation
+Accumulation	accumulation
+ACCUMULATION	accumulation
+accumulations	accumulation
+accumule	accumuler
+accumulé	accumuler
+accumulée	accumuler
+Accumulée	accumuler
+accumulées	accumuler
+Accumulées	accumuler
+accumulent	accumuler
+accumulera	accumuler
+accumuler	accumuler
+Accumuler	accumuler
+accumuleraient	accumuler
+accumulerait	accumuler
+accumulèrent	accumuler
+accumuleront	accumuler
+accumulés	accumuler
+Accumulés	accumuler
+accumulez	accumuler
+accumulions	accumuler
+accumulons	accumuler
+accusa	accuser
+accusable	accusable
+accus	accus
+accusaient	accuser
+accusais	accuser
+accusait	accuser
+accusant	accuser
+Accusant	accuser
+accusateur	accusateur
+Accusateur	accusateur
+accusateurs	accusateur
+accusatif	accusatif
+accusatifs	accusatif
+accusation	accusation
+accusations	accusation
+Accusations	accusation
+accusatoire	accusatoire
+accusatoires	accusatoire
+accusatrice	accusateur
+accusatrices	accusateur
+accuse	accuser
+ACCUSE	accuser
+accusé	accuser
+Accusé	accuser
+Accusée	accusé
+accusée	accuser
+accusées	accuser
+Accusées	accuser
+accusent	accuser
+accusera	accuser
+accuser	accuser
+ACCUSER	accuser
+accuseraient	accuser
+accuserait	accuser
+accuseras	accuser
+accusèrent	accuser
+accuseront	accuser
+accuses	accuser
+accusés	accuser
+Accusés	accuser
+accusez	accuser
+accusiez	accuser
+accusions	accuser
+accusons	accuser
+ace	ace
+acellulaire	acellulaire
+acellulaires	acellulaire
+acéphale	acéphale
+Acéphale	acéphale
+acéphales	acéphale
+Acéphales	acéphale
+acéphalie	acéphalie
+acer	acer
+ACER	acer
+acéras	acérer
+acerbe	acerbe
+acerbes	acerbe
+acéré	acéré
+acérée	acérer
+acérées	acéré
+acérer	acérer
+acérés	acérer
+aces	ace
+acescence	acescence
+acétabulaire	acétabulaire
+acétabulaires	acétabulaire
+acétal	acétal
+acétals	acétal
+acétamide	acétamide
+Acétamide	acétamide
+acétamides	acétamide
+acétate	acétate
+acétates	acétate
+acétification	acétification
+acétifier	acétifier
+acétique	acétique
+acétiques	acétique
+acétobacter	acétobacter
+acétone	acétone
+acétonémie	acétonémie
+acétonurie	acétonurie
+acétophénone	acétophénone
+acétylation	acétylation
+Acétylation	acétylation
+acétylations	acétylation
+acétylcholine	acétylcholine
+acétylcoenzyme	acétylcoenzyme
+Acétylcoenzyme	acétylcoenzyme
+acétyle	acétyle
+Acétyle	acétyle
+acétylé	acétyler
+acétylée	acétyler
+Acétylée	acétyler
+acétylées	acétyler
+acétylène	acétylène
+acétylénique	acétylénique
+acétyléniques	acétylénique
+acétyler	acétyler
+acétyles	acétyle
+acétylés	acétyler
+acétylformique	acétylformique
+acétylsalicylique	acétylsalicylique
+acétylure	acétylure
+Acétylure	acétylure
+acétylures	acétylure
+achaine	achaine
+achalandage	achalandage
+Achalandage	achalandage
+achalandé	achalander
+achalandée	achalander
+achalandées	achalander
+achalandent	achalander
+achalander	achalander
+achalandés	achalander
+achards	achards
+Achards	achards
+acharna	acharner
+acharnaient	acharner
+acharnait	acharner
+acharnant	acharner
+acharnât	acharner
+acharne	acharner
+acharné	acharner
+acharnée	acharner
+Acharnée	acharner
+acharnées	acharner
+acharnement	acharnement
+acharnements	acharnement
+acharnent	acharner
+acharnera	acharner
+acharner	acharner
+acharnerait	acharner
+acharnèrent	acharner
+acharneront	acharner
+acharnés	acharner
+acharnez	acharner
+Acharnons	acharner
+achat	achat
+ACHAT	achat
+achats	achat
+Achats	achat
+ACHATS	achat
+ache	ache
+achéen	achéen
+Achéen	achéen
+achéenne	achéen
+Achéenne	achéen
+achéennes	achéen
+achéens	achéen
+achéménide	achéménide
+achéménides	achéménide
+Achéménides	achéménide
+achemina	acheminer
+acheminaient	acheminer
+acheminait	acheminer
+acheminant	acheminer
+achemine	acheminer
+acheminé	acheminer
+Acheminé	acheminer
+acheminée	acheminer
+Acheminée	acheminer
+acheminées	acheminer
+Acheminées	acheminer
+acheminement	acheminement
+acheminements	acheminement
+acheminent	acheminer
+acheminera	acheminer
+acheminer	acheminer
+Acheminer	acheminer
+acheminèrent	acheminer
+acheminerez	acheminer
+achemineront	acheminer
+acheminés	acheminer
+acheminons	acheminer
+achène	achène
+achènes	achène
+aches	ache
+Aches	ache
+acheta	acheter
+achetable	achetable
+achetables	achetable
+achet	achet
+achetai	acheter
+achetaient	acheter
+achetais	acheter
+achetait	acheter
+achetant	acheter
+Achetant	acheter
+achetasse	acheter
+achetassent	acheter
+achetât	acheter
+achète	acheter
+Achète	acheter
+acheté	acheter
+Acheté	acheter
+achetée	acheter
+Achetée	acheter
+achetées	acheter
+Achetées	acheter
+achètent	acheter
+Achètent	acheter
+achètera	acheter
+acheter	acheter
+Acheter	acheter
+achèterai	acheter
+achèteraient	acheter
+achèterais	acheter
+achèterait	acheter
+achèteras	acheter
+achetèrent	acheter
+Achetèrent	acheter
+achèterez	acheter
+achèteriez	acheter
+achèterions	acheter
+achèterons	acheter
+achèteront	acheter
+achètes	acheter
+Achètes	acheter
+achetés	acheter
+Achetés	acheter
+acheteur	acheteur
+ACHETEUR	acheteur
+acheteurs	acheteur
+ACHETEURS	acheteur
+acheteuse	acheteur
+Acheteuse	acheteur
+acheteuses	acheteur
+achetez	acheter
+Achetez	acheter
+ACHETEZ	acheter
+achetiez	acheter
+achetions	acheter
+achetons	acheter
+achets	achet
+acheuléen	acheuléen
+acheuléenne	acheuléen
+acheuléennes	acheuléen
+acheuléens	acheuléen
+acheva	achever
+achevaient	achever
+achevait	achever
+achevâmes	achever
+achevant	achever
+Achevant	achever
+achevât	achever
+achève	achever
+Achève	achever
+achevé	achever
+Achevé	achever
+achevée	achever
+Achevée	achever
+achevées	achever
+Achevées	achever
+achèvement	achèvement
+achèvements	achèvement
+achèvent	achever
+achèvera	achever
+achever	achever
+Achever	achever
+achèveraient	achever
+achèverait	achever
+achèveras	achever
+achevèrent	achever
+achèveront	achever
+achèves	achever
+achevés	achever
+achevez	achever
+Achevez	achever
+Achevons	achever
+achigan	achigan
+achigans	achigan
+Achigans	achigan
+achille	achille
+Achille	Achille
+ACHILLE	Achille
+achillée	achillée
+Achillée	achillée
+achillées	achillée
+achilléine	achilléine
+achondroplasie	achondroplasie
+achondroplasies	achondroplasie
+Achondroplasies	achondroplasie
+achoppa	achopper
+achoppaient	achopper
+achoppant	achopper
+achoppe	achopper
+achoppé	achopper
+achoppement	achoppement
+achoppements	achoppement
+achoppent	achopper
+achopper	achopper
+achoppèrent	achopper
+achoppes	achopper
+achromat	achromat
+achromate	achromate
+achromates	achromate
+achromatique	achromatique
+achromatiques	achromatique
+achromatiser	achromatiser
+achromatisme	achromatisme
+achromatopsie	achromatopsie
+achromes	achrome
+achromie	achromie
+achromique	achromique
+achromiques	achromique
+Achromobacter	achromobacter
+achronique	achronique
+achylie	achylie
+achylies	achylie
+aciculaire	aciculaire
+Aciculaire	aciculaire
+aciculaires	aciculaire
+acicule	acicule
+acicules	acicule
+acide	acide
+acides	acide
+Acides	acide
+acidifiait	acidifier
+acidifiant	acidifier
+Acidifiant	acidifier
+acidifiante	acidifiant
+acidifiantes	acidifiant
+acidifiants	acidifiant
+Acidifiants	acidifiant
+acidification	acidification
+Acidification	acidification
+acidifie	acidifier
+acidifié	acidifier
+acidifiée	acidifier
+acidifiées	acidifier
+acidifient	acidifier
+acidifiera	acidifier
+acidifier	acidifier
+acidifierait	acidifier
+acidifieront	acidifier
+acidifiés	acidifier
+acidité	acidité
+Acidité	acidité
+acidités	acidité
+acido-basique	acido-basique
+acido-basiques	acido-basique
+acidogènes	acidogène
+acidophile	acidophile
+acidophiles	acidophile
+acido-résistantes	acido-résistant
+acidose	acidose
+acidoses	acidose
+Acidoses	acidose
+acidula	aciduler
+acidule	acidule
+acidulé	aciduler
+acidulée	aciduler
+acidulées	acidulé
+aciduler	aciduler
+acidules	acidule
+acidulés	aciduler
+acier	acier
+aciérage	aciérage
+aciéré	aciérer
+aciérée	aciérer
+aciérer	aciérer
+aciéreux	aciéreux
+aciérie	aciérie
+aciéries	aciérie
+Aciéries	aciérie
+aciériste	aciériste
+aciéristes	aciériste
+aciers	acier
+Aciers	acier
+acinète	acinète
+acineuse	acineux
+acineuses	acineux
+acinus	acinus
+Acinus	acinus
+Ackermann	Ackermann
+ACKERMANN	Ackermann
+acmé	acmé
+acné	acné
+acnéiformes	acnéiforme
+acnéique	acnéique
+acnés	acné
+acoelomates	acœlomates
+acolytat	acolytat
+acolyte	acolyte
+acolytes	acolyte
+Acolytes	acolyte
+Acomas	acomas
+acompte	acompte
+acomptes	acompte
+Acomptes	acompte
+acon	acon
+Acon	acon
+aconage	aconage
+aconier	aconier
+aconiers	aconier
+aconit	aconit
+aconitine	aconitine
+aconits	aconit
+Aconits	aconit
+aconties	acontie
+acoquina	acoquiner
+acoquinant	acoquiner
+acoquine	acoquiner
+acoquiné	acoquiner
+acoquinée	acoquiner
+acoquinent	acoquiner
+acoquinera	acoquiner
+acoquiner	acoquiner
+acoquinés	acoquiner
+acore	acore
+acores	acore
+Acores	acore
+acoumètre	acoumètre
+acoumétrie	acoumétrie
+Acoumétrie	acoumétrie
+acouphène	acouphène
+acouphènes	acouphène
+acousticien	acousticien
+acousticiens	acousticien
+acoustique	acoustique
+acoustiquement	acoustiquement
+acoustiques	acoustique
+Acoustiques	acoustique
+acousto-optique	acousto-optique
+acousto-optiques	acousto-optique
+ACP	ACP
+acquéraient	acquérir
+acquérais	acquérir
+acquérait	acquérir
+acquérant	acquérir
+Acquérant	acquérir
+acquérante	acquérant
+acquéreur	acquéreur
+Acquéreur	acquéreur
+acquéreurs	acquéreur
+acquérez	acquérir
+acquériez	acquérir
+acquérions	acquérir
+acquérir	acquérir
+acquérons	acquérir
+Acquérons	acquérir
+acquerra	acquérir
+acquerrai	acquérir
+acquerraient	acquérir
+acquerrais	acquérir
+acquerrait	acquérir
+acquerras	acquérir
+acquerrez	acquérir
+acquerriez	acquérir
+acquerrions	acquérir
+acquerrons	acquérir
+acquerront	acquérir
+acquêt	acquêt
+acquêts	acquêt
+Acquêts	acquêt
+acquière	acquérir
+Acquière	acquérir
+acquièrent	acquérir
+acquières	acquérir
+acquiers	acquérir
+acquiert	acquérir
+Acquiert	acquérir
+acquiesça	acquiescer
+acquiesçait	acquiescer
+acquiesçant	acquiescer
+acquiesçante	acquiesçant
+acquiesce	acquiescer
+acquiescé	acquiescer
+acquiescement	acquiescement
+acquiescements	acquiescement
+acquiescent	acquiescer
+acquiescer	acquiescer
+acquiescèrent	acquiescer
+acquîmes	acquérir
+acquirent	acquérir
+acquis	acquérir
+acquise	acquérir
+acquises	acquérir
+Acquises	acquérir
+acquisitif	acquisitif
+acquisition	acquisition
+ACQUISITION	acquisition
+acquisitions	acquisition
+acquisitive	acquisitif
+acquisivité	acquisivité
+acquisse	acquérir
+acquissent	acquérir
+acquisses	acquérir
+acquissiez	acquérir
+acquissions	acquérir
+acquit-à-caution	acquit-à-caution
+acquit	acquérir
+acquît	acquérir
+acquîtes	acquérir
+acquits	acquit
+acquitta	acquitter
+acquittaient	acquitter
+acquittait	acquitter
+acquittant	acquitter
+acquitte	acquitter
+acquitté	acquitter
+acquittée	acquitter
+acquittées	acquitter
+acquittement	acquittement
+acquittements	acquittement
+Acquittements	acquittement
+acquittent	acquitter
+acquittera	acquitter
+acquitter	acquitter
+acquitterai	acquitter
+acquitteraient	acquitter
+acquitterait	acquitter
+acquitteras	acquitter
+acquittèrent	acquitter
+acquitterez	acquitter
+acquitteront	acquitter
+acquittés	acquitter
+acquittez	acquitter
+acras	acra
+Acras	acra
+acre	acre
+Acre	Acre
+ACRE	Acre
+âcre	âcre
+Âcre	âcre
+acres	acre
+âcres	âcre
+âcreté	âcreté
+acrididés	acrididés
+acridien	acridien
+acridienne	acridien
+acridiennes	acridien
+acridiens	acridien
+acridine	acridine
+Acridine	acridine
+acridiniques	acridinique
+acrimonie	acrimonie
+acrimonieuse	acrimonieux
+acrimonieux	acrimonieux
+acritique	acritique
+acritiques	acritique
+acroamatique	acroamatique
+acroamatiques	acroamatique
+acrobate	acrobate
+Acrobate	acrobate
+acrobates	acrobate
+acrobatie	acrobatie
+acrobaties	acrobatie
+Acrobaties	acrobatie
+acrobatique	acrobatique
+acrobatiquement	acrobatiquement
+acrobatiques	acrobatique
+Acrocarpe	acrocarpe
+acrocarpes	acrocarpe
+acrocentrique	acrocentrique
+acrocentriques	acrocentrique
+Acrochordon	acrochordon
+acrochordons	acrochordon
+acrocyanose	acrocyanose
+Acrocyanose	acrocyanose
+acrodermatite	acrodermatite
+Acrodermatite	acrodermatite
+acrodonte	acrodonte
+acroléine	acroléine
+Acroléine	acroléine
+acromégalie	acromégalie
+Acromégaloïde	acromégaloïde
+acromial	acromial
+acromion	acromion
+Acromion	acromion
+acromions	acromion
+acron	acron
+acronycte	acronycte
+acronyme	acronyme
+acronymes	acronyme
+acronymique	acronymique
+acronymiques	acronymique
+acronyque	acronyque
+acrophobie	acrophobie
+acropole	acropole
+Acropole	acropole
+acropoles	acropole
+Acropoles	acropole
+Acropolis	Acropolis
+ACROPOLIS	Acropolis
+acrosome	acrosome
+acrosomes	acrosome
+acrosomiale	acrosomial
+acrostiche	acrostiche
+acrostiches	acrostiche
+Acrostiches	acrostiche
+acrotère	acrotère
+acrotères	acrotère
+acrylate	acrylate
+acrylates	acrylate
+acrylique	acrylique
+Acrylique	acrylique
+acryliques	acrylique
+Acryliques	acrylique
+acta	acter
+actait	acter
+actanciel	actanciel
+actanciels	actanciel
+actant	actant
+Actant	actant
+actants	actant
+acte	acte
+acté	acter
+actée	acter
+Actée	acter
+actées	acter
+actéon	actéon
+acter	acter
+actes	acte
+ACtes	acte
+actés	acter
+acteur	acteur
+Acteur	acteur
+acteurs	acteur
+actif	actif
+actifs	actif
+actine	actine
+actines	actine
+actiniaires	actiniaires
+Actiniaires	actiniaires
+actinide	actinide
+actinides	actinide
+actinie	actinie
+actinies	actinie
+actinique	actinique
+actiniques	actinique
+actinisme	actinisme
+Actinisme	actinisme
+actinite	actinite
+actinium	actinium
+actinographe	actinographe
+actinolite	actinolite
+actinologie	actinologie
+actinomètre	actinomètre
+actinométrie	actinométrie
+actinomycète	actinomycète
+actinomycètes	actinomycète
+actinomycose	actinomycose
+Actinomycose	actinomycose
+actinomycoses	actinomycose
+actinon	actinon
+actinopodes	actinopodes
+actinoptérygiens	actinoptérygiens
+actinote	actinote
+action	action
+Action	action
+actionna	actionner
+actionnaient	actionner
+actionnaire	actionnaire
+actionnaires	actionnaire
+actionnait	actionner
+actionnant	actionner
+actionnariat	actionnariat
+Actionnariats	actionnariat
+actionne	actionner
+actionné	actionner
+Actionné	actionner
+actionnée	actionner
+Actionnée	actionner
+actionnées	actionner
+Actionnées	actionner
+actionnement	actionnement
+actionnent	actionner
+actionnera	actionner
+actionner	actionner
+Actionner	actionner
+actionneraient	actionner
+actionnerait	actionner
+actionnèrent	actionner
+actionnés	actionner
+Actionnés	actionner
+actionneur	actionneur
+actionneurs	actionneur
+Actionneurs	actionneur
+actionnez	actionner
+Actions	acter
+actions	action
+ACTIONS	action
+activa	activer
+activable	activable
+Activable	activable
+activables	activable
+activaient	activer
+activait	activer
+activant	activer
+Activant	activer
+activante	activant
+activants	activant
+activât	activer
+activateur	activateur
+Activateur	activateur
+activateurs	activateur
+Activateurs	activateur
+activation	activation
+Activation	activation
+activations	activation
+activatrice	activateur
+activatrices	activateur
+active	actif
+activé	activer
+Activé	activer
+activée	activer
+Activée	activer
+activées	activer
+activement	activement
+Activement	activement
+activent	activer
+activera	activer
+activer	activer
+Activer	activer
+activeraient	activer
+activerait	activer
+activèrent	activer
+activeront	activer
+actives	actif
+activés	activer
+Activés	activer
+activez	activer
+Activez	activer
+activisme	activisme
+Activisme	activisme
+activismes	activisme
+activiste	activiste
+activistes	activiste
+activité	activité
+activités	activité
+Activités	activité
+ACTIVITÉS	activité
+activons	activer
+actrice	acteur|actrice
+actrices	acteur|actrice
+actuaire	actuaire
+actuaires	actuaire
+actualisa	actualiser
+actualisable	actualisable
+actualisables	actualisable
+actualisait	actualiser
+actualisant	actualiser
+actualisateur	actualisateur
+actualisateurs	actualisateur
+actualisation	actualisation
+Actualisation	actualisation
+actualisations	actualisation
+Actualisations	actualisation
+actualisatrice	actualisateur
+actualise	actualiser
+Actualise	actualiser
+actualisé	actualiser
+Actualisé	actualiser
+actualisée	actualiser
+Actualisée	actualiser
+actualisées	actualiser
+Actualisées	actualiser
+actualisent	actualiser
+actualisera	actualiser
+actualiser	actualiser
+Actualiser	actualiser
+actualiseraient	actualiser
+actualisés	actualiser
+Actualisez	actualiser
+actualisme	actualisme
+Actualisme	actualisme
+actualité	actualité
+Actualité	actualité
+ACTUALITÉ	actualité
+actualités	actualité
+actuariat	actuariat
+Actuariat	actuariat
+actuariel	actuariel
+actuarielle	actuariel
+actuarielles	actuariel
+actuariels	actuariel
+actuation	actuation
+actuel	actuel
+actuelle	actuel
+actuellement	actuellement
+Actuellement	actuellement
+ACtuellement	actuellement
+actuelles	actuel
+actuels	actuel
+acuité	acuité
+Acuité	acuité
+acuités	acuité
+acul	acul
+Acul	acul
+Aculé	aculé
+aculéates	aculéates
+Aculéates	aculéates
+acumen	acumen
+acuminé	acuminé
+Acuminé	acuminé
+acuminée	acuminé
+acuminées	acuminé
+acuminés	acuminé
+acuponcteur	acuponcteur
+acuponcture	acuponcture
+acupuncteur	acupuncteur
+acupuncteurs	acupuncteur
+acupuncture	acupuncture
+acutangle	acutangle
+acyclique	acyclique
+acycliques	acyclique
+acylation	acylation
+acylations	acylation
+acyle	acyle
+Acyle	acyle
+acyles	acyle
+adab	adab
+ad	ad
+AD	ad
+adage	adage
+Adage	adage
+ADAGE	adage
+adages	adage
+Adages	adage
+adagio	adagio
+adagios	adagio
+Adalbéron	Adalbéron
+adam	adam
+Adam	Adam
+ADaM	Adam
+ADAM	Adam
+adamantin	adamantin
+Adamantin	adamantin
+adamantine	adamantin
+adamantines	adamantin
+adamantoblastes	adamantoblaste
+ADAMI	ADAMI
+adamienne	adamien
+adamiens	adamien
+adamique	adamique
+Adamique	adamique
+Adamiques	adamique
+adamisme	adamisme
+adamite	adamite
+Adamite	adamite
+adamites	adamite
+adams	adam
+adapta	adapter
+adaptabilité	adaptabilité
+adaptable	adaptable
+adaptables	adaptable
+Adaptables	adaptable
+adaptaient	adapter
+adaptait	adapter
+adaptant	adapter
+Adaptant	adapter
+adaptateur	adaptateur
+adaptateurs	adaptateur
+adaptatif	adaptatif
+adaptatifs	adaptatif
+adaptation	adaptation
+adaptations	adaptation
+adaptative	adaptatif
+adaptatives	adaptatif
+adaptatrice	adaptateur
+adaptatrices	adaptateur
+adapte	adapter
+Adapte	adapter
+adapté	adapter
+Adapté	adapter
+adaptée	adapter
+adaptéE	adapter
+adaptées	adapter
+adaptent	adapter
+adaptera	adapter
+adapter	adapter
+adapterai	adapter
+adapteraient	adapter
+adapterait	adapter
+adaptèrent	adapter
+adapteront	adapter
+adaptes	adapter
+adaptés	adapter
+Adaptés	adapter
+Adaptez	adapter
+adaptif	adaptif
+adaptifs	adaptif
+adaptions	adapter
+adaptive	adaptif
+ADAPTIVE	adaptif
+adaptons	adapter
+addax	addax
+addenda	addenda
+Addenda	addenda
+additif	additif
+Additif	additif
+additifs	additif
+Additifs	additif
+addition	addition
+Addition	addition
+additionna	additionner
+additionnai	additionner
+additionnaient	additionner
+additionnait	additionner
+additionnalité	additionnalité
+additionnant	additionner
+additionne	additionner
+additionné	additionner
+Additionné	additionner
+additionnée	additionner
+Additionnée	additionner
+additionnées	additionner
+Additionnées	additionner
+additionnel	additionnel
+additionnelle	additionnel
+additionnelles	additionnel
+additionnels	additionnel
+additionnent	additionner
+additionner	additionner
+Additionner	additionner
+additionneraient	additionner
+additionnèrent	additionner
+additionnés	additionner
+additionneur	additionneur
+additionneurs	additionneur
+additionnez	additionner
+additionnons	additionner
+Additionnons	additionner
+additions	addition
+Additions	addition
+additive	additif
+additivement	additivement
+Additivement	additivement
+additives	additif
+additivité	additivité
+Additivité	additivité
+adducteur	adducteur
+adducteurs	adducteur
+adduction	adduction
+Adduction	adduction
+adductions	adduction
+adduit	adduire
+adduites	adduire
+adduits	adduire
+Adèle	Adèle
+adélie	adélie
+Adeline	Adeline
+ADELINE	Adeline
+adelphe	adelphe
+Adelphe	Adelphe
+adelphies	adelphie
+adelphique	adelphique
+Adenauer	Adenauer
+adénine	adénine
+Adénine	adénine
+adénines	adénine
+adénite	adénite
+Adénite	adénite
+adénites	adénite
+adénocarcinome	adénocarcinome
+Adénocarcinome	adénocarcinome
+adénocarcinomes	adénocarcinome
+adénofibrome	adénofibrome
+Adénofibrome	adénofibrome
+adénoïde	adénoïde
+adénoïdes	adénoïde
+adénoïdienne	adénoïdien
+adénomateuse	adénomateux
+adénomateux	adénomateux
+Adénomatose	adénomatose
+adénome	adénome
+adénomes	adénome
+adénopathie	adénopathie
+adénopathies	adénopathie
+Adénopathies	adénopathie
+adénosine	adénosine
+adénovirus	adénovirus
+adent	adent
+Adent	adent
+adepte	adepte
+Adepte	adepte
+adeptes	adepte
+Adeptes	adepte
+adéquat	adéquat
+adéquate	adéquat
+adéquatement	adéquatement
+adéquates	adéquat
+adéquation	adéquation
+Adéquation	adéquation
+adéquations	adéquation
+adéquats	adéquat
+Ader	Ader
+ADER	Ader
+adernes	aderne
+adessif	adessif
+adextre	adextre
+adextré	adextré
+Adextré	adextré
+adextrée	adextré
+adextrées	adextré
+adh	adh
+Adhémar	Adhémar
+ADHÉMAR	Adhémar
+adhéra	adhérer
+adhéraient	adhérer
+adhérais	adhérer
+adhérait	adhérer
+adhérant	adhérer
+Adhérant	adhérer
+adhérassent	adhérer
+adhérât	adhérer
+adhère	adhérer
+Adhère	adhérer
+adhéré	adhérer
+adhérée	adhérer
+adhérées	adhérer
+adhérence	adhérence
+Adhérence	adhérence
+adhérences	adhérence
+adhérent	adhérent
+Adhérent	adhérent
+adhèrent	adhérer
+Adhèrent	adhérer
+adhérente	adhérent
+Adhérente	adhérent
+adhérentes	adhérent
+adhérents	adhérent
+Adhérents	adhérent
+adhérera	adhérer
+adhérer	adhérer
+Adhérer	adhérer
+adhérerait	adhérer
+adhérèrent	adhérer
+adhéreront	adhérer
+adhérés	adhérer
+adhérez	adhérer
+Adhérez	adhérer
+adhérions	adhérer
+adhérons	adhérer
+adhésif	adhésif
+Adhésif	adhésif
+adhésifs	adhésif
+adhésion	adhésion
+adhésions	adhésion
+adhésive	adhésif
+adhésives	adhésif
+adhésivité	adhésivité
+adiabatique	adiabatique
+adiabatiquement	adiabatiquement
+adiabatiques	adiabatique
+adiabatisme	adiabatisme
+adiante	adiante
+adiaphorie	adiaphorie
+adieu	adieu
+Adieu	adieu
+adieux	adieu
+adipeuse	adipeux
+adipeuses	adipeux
+adipeux	adipeux
+adipique	adipique
+adipocyte	adipocyte
+adipocytes	adipocyte
+Adipocytes	adipocyte
+adipose	adipose
+adiposité	adiposité
+adiposo-génital	adiposo-génital
+adirées	adiré
+adition	adition
+adja	adja
+Adja	adja
+adjacent	adjacent
+adjacente	adjacent
+Adjacente	adjacent
+adjacentes	adjacent
+adjacents	adjacent
+Adjacents	adjacent
+adjectif	adjectif
+Adjectif	adjectif
+ADJECTIF	adjectif
+adjectifs	adjectif
+Adjectifs	adjectif
+ADJECTIFS	adjectif
+adjectival	adjectival
+adjectivale	adjectival
+adjectivales	adjectival
+adjectivant	adjectiver
+adjectivation	adjectivation
+Adjectivation	adjectivation
+adjectivaux	adjectival
+adjective	adjectiver
+adjectivé	adjectiver
+adjectivée	adjectiver
+adjectivement	adjectivement
+adjectives	adjectif
+adjoignaient	adjoindre
+adjoignait	adjoindre
+adjoignant	adjoindre
+adjoigne	adjoindre
+adjoignent	adjoindre
+adjoignirent	adjoindre
+adjoignis	adjoindre
+adjoignit	adjoindre
+adjoindra	adjoindre
+adjoindrait	adjoindre
+adjoindre	adjoindre
+Adjoindre	adjoindre
+adjoindront	adjoindre
+adjoins	adjoindre
+adjoint	adjoindre
+Adjointe	adjoindre
+adjointe	adjoint
+adjointes	adjoindre
+adjoints	adjoindre
+adjonctifs	adjonctif
+adjonction	adjonction
+Adjonction	adjonction
+adjonctions	adjonction
+adjonctive	adjonctif
+adjudant	adjudant
+adjudants	adjudant
+adjudicataire	adjudicataire
+Adjudicataire	adjudicataire
+adjudicataires	adjudicataire
+adjudicateur	adjudicateur
+adjudicateurs	adjudicateur
+adjudication	adjudication
+Adjudication	adjudication
+adjudications	adjudication
+Adjudications	adjudication
+adjudicatrices	adjudicateur
+adjugea	adjuger
+adjuge	adjuger
+adjugé	adjuger
+Adjugé	adjuger
+adjugeaient	adjuger
+adjugeait	adjuger
+adjugeant	adjuger
+adjugeât	adjuger
+adjugée	adjuger
+adjugées	adjuger
+adjugent	adjuger
+adjugeons	adjuger
+adjugera	adjuger
+adjuger	adjuger
+adjugèrent	adjuger
+adjugés	adjuger
+adjura	adjurer
+adjurait	adjurer
+adjurant	adjurer
+adjuration	adjuration
+Adjuration	adjuration
+adjurations	adjuration
+adjure	adjurer
+adjuré	adjurer
+adjurent	adjurer
+adjurer	adjurer
+adjurez	adjurer
+adjuteur	adjuteur
+Adjuteur	adjuteur
+adjuvant	adjuver
+Adjuvant	adjuver
+adjuvants	adjuvant
+adjuvat	adjuvat
+Adjuvat	adjuvat
+adlérienne	adlérien
+adlériennes	adlérien
+admet	admettre
+Admet	admettre
+admets	admettre
+Admets	admettre
+admettaient	admettre
+admettais	admettre
+admettait	admettre
+admettant	admettre
+Admettant	admettre
+admette	admettre
+admettent	admettre
+Admettent	admettre
+admettez	admettre
+Admettez	admettre
+admettions	admettre
+admettons	admettre
+Admettons	admettre
+admettra	admettre
+admettrai	admettre
+admettraient	admettre
+admettrait	admettre
+admettre	admettre
+Admettre	admettre
+admettrons	admettre
+admettront	admettre
+adminicule	adminicule
+Adminicule	adminicule
+administra	administrer
+administraient	administrer
+administrait	administrer
+administrant	administrer
+administrante	administrant
+administrantes	administrant
+administrateur	administrateur
+administrateurs	administrateur
+Administrateurs	administrateur
+administratif	administratif
+Administratif	administratif
+administratifs	administratif
+Administratifs	administratif
+administration	administration
+ADMINISTRATION	administration
+administrations	administration
+Administrations	administration
+administrative	administratif
+administRative	administratif
+ADMinistrative	administratif
+administrativement	administrativement
+Administrativement	administrativement
+administratives	administratif
+Administratives	administratif
+administratrice	administrateur
+Administratrice	administrateur
+administratrices	administrateur
+Administratrices	administrateur
+administre	administrer
+Administre	administrer
+administré	administrer
+Administré	administrer
+administrée	administrer
+Administrée	administrer
+administrées	administrer
+Administrées	administrer
+administrent	administrer
+administrera	administrer
+administrer	administrer
+Administrer	administrer
+administreraient	administrer
+administrerait	administrer
+administrèrent	administrer
+administreront	administrer
+administrés	administrer
+Administrés	administrer
+administrez	administrer
+administrions	administrer
+administrons	administrer
+admira	admirer
+Admira	admirer
+admirable	admirable
+Admirable	admirable
+admirablement	admirablement
+Admirablement	admirablement
+admirables	admirable
+Admirables	admirable
+admirai	admirer
+admiraient	admirer
+admirais	admirer
+admirait	admirer
+admirant	admirer
+Admirant	admirer
+admirât	admirer
+admirateur	admirateur
+Admirateur	admirateur
+admirateurs	admirateur
+Admirateurs	admirateur
+admiratif	admiratif
+admiratifs	admiratif
+Admiratifs	admiratif
+admiration	admiration
+Admiration	admiration
+admirations	admiration
+admirative	admiratif
+Admirative	admiratif
+admirativement	admirativement
+admiratives	admiratif
+admiratrice	admirateur
+Admiratrice	admirateur
+admiratrices	admirateur
+admire	admirer
+admiré	admirer
+Admiré	admirer
+admirée	admirer
+Admirée	admirer
+admirées	admirer
+Admirées	admirer
+admirent	admirer
+admirera	admirer
+admirer	admirer
+admirerai	admirer
+admirèrent	admirer
+admirerez	admirer
+admireront	admirer
+admires	admirer
+admirés	admirer
+Admirés	admirer
+admirez	admirer
+Admirez	admirer
+admiriez	admirer
+admirions	admirer
+admirons	admirer
+Admirons	admirer
+admis	admettre
+Admis	admettre
+admise	admettre
+Admise	admettre
+admises	admettre
+admissibilité	admissibilité
+Admissibilité	admissibilité
+admissibilités	admissibilité
+admissible	admissible
+Admissible	admissible
+admissibles	admissible
+Admissibles	admissible
+admission	admission
+Admission	admission
+admissions	admission
+Admissions	admission
+ADMISSIONS	admission
+admit	admettre
+admît	admettre
+admittance	admittance
+Admittance	admittance
+admittances	admittance
+admixtion	admixtion
+admonesta	admonester
+admonestait	admonester
+admonestant	admonester
+admonestation	admonestation
+admonestations	admonestation
+admoneste	admonester
+admonesté	admonester
+admonestée	admonester
+admonestent	admonester
+admonester	admonester
+Admonester	admonester
+admoniteur	admoniteur
+admonition	admonition
+Admonition	admonition
+admonitions	admonition
+admonitrice	admoniteur
+adn	adn
+adnées	adné
+adnés	adné
+ADNs	adn
+ado	ado
+ADO	ado
+adobe	adobe
+ADOBE	adobe
+adobes	adobe
+adolescence	adolescence
+adolescences	adolescence
+Adolescences	adolescence
+adolescent	adolescent
+adolescente	adolescent
+Adolescente	adolescent
+adolescentes	adolescent
+Adolescentes	adolescent
+adolescents	adolescent
+Adolphe	Adolphe
+ADOLPHE	Adolphe
+adonc	adonc
+Adonc	adonc
+adoncques	adoncques
+adonique	adonique
+adonis	adonis
+adonna	adonner
+adonnaient	adonner
+Adonnais	adonner
+adonnait	adonner
+adonnant	adonner
+adonnassent	adonner
+adonnât	adonner
+adonne	adonner
+adonné	adonner
+Adonné	adonner
+adonnée	adonner
+adonnées	adonner
+adonnent	adonner
+adonnera	adonner
+adonner	adonner
+adonneraient	adonner
+adonnerait	adonner
+adonnèrent	adonner
+adonneront	adonner
+adonnés	adonner
+adopta	adopter
+Adopta	adopter
+adoptable	adoptable
+adoptables	adoptable
+adoptaient	adopter
+adoptait	adopter
+adoptant	adopter
+Adoptant	adopter
+adoptante	adoptant
+adoptantes	adoptant
+adoptants	adoptant
+adoptassent	adopter
+adoptât	adopter
+adopte	adopter
+Adopte	adopter
+adopté	adopter
+Adopté	adopter
+adoptée	adopter
+Adoptée	adopter
+adoptées	adopter
+Adoptées	adopter
+adoptent	adopter
+adoptera	adopter
+Adoptera	adopter
+adopter	adopter
+Adopter	adopter
+adopteraient	adopter
+adopterait	adopter
+adoptèrent	adopter
+Adoptèrent	adopter
+adopterez	adopter
+adopterions	adopter
+adopterons	adopter
+adopteront	adopter
+adoptes	adopter
+adoptés	adopter
+Adoptés	adopter
+adoptez	adopter
+Adoptez	adopter
+adoptiez	adopter
+adoptif	adoptif
+adoptifs	adoptif
+adoption	adoption
+Adoption	adoption
+ADOPTION	adoption
+adoptions	adoption
+Adoptions	adoption
+adoptive	adoptif
+Adoptive	adoptif
+adoptives	adoptif
+adoptons	adopter
+Adoptons	adopter
+adora	adorer
+Adora	adorer
+adorable	adorable
+Adorable	adorable
+adorablement	adorablement
+Adorablement	adorablement
+adorables	adorable
+adorai	adorer
+adoraient	adorer
+adorais	adorer
+adorait	adorer
+adorant	adorant
+Adorant	adorer
+adorante	adorant
+adorants	adorant
+adorassent	adorer
+adorateur	adorateur
+Adorateur	adorateur
+adorateurs	adorateur
+Adorateurs	adorateur
+adoration	adoration
+Adoration	adoration
+adorations	adoration
+Adorations	adoration
+adoratrice	adorateur
+adoratrices	adorateur
+Adoratrices	adorateur
+adore	adorer
+adoré	adorer
+adorée	adorer
+Adorée	adorer
+adorées	adorer
+adorent	adorer
+adorera	adorer
+adorer	adorer
+Adorer	adorer
+adorerai	adorer
+adoreraient	adorer
+adorerais	adorer
+adorerait	adorer
+adoreras	adorer
+adorèrent	adorer
+adorerez	adorer
+adorerons	adorer
+adoreront	adorer
+adores	adorer
+adorés	adorer
+adorez	adorer
+ADOREZ	adorer
+adorions	adorer
+Adorna	adorner
+adorne	adorner
+adornent	adorner
+adorner	adorner
+adorons	adorer
+Adorons	adorer
+ados	ado|ados
+adossa	adosser
+adossaient	adosser
+adossait	adosser
+adossant	adosser
+adosse	adosser
+adossé	adosser
+adossée	adosser
+Adossée	adosser
+adossées	adosser
+Adossées	adosser
+adossement	adossement
+adossent	adosser
+adosser	adosser
+adossés	adosser
+Adossés	adosser
+adouba	adouber
+adoubant	adouber
+adoube	adouber
+adoubé	adouber
+Adoubé	adouber
+adoubée	adouber
+adoubement	adoubement
+adoubements	adoubement
+adoubera	adouber
+adouber	adouber
+adouberait	adouber
+adoubés	adouber
+adouci	adoucir
+adoucie	adoucir
+adoucies	adoucir
+adoucira	adoucir
+adoucir	adoucir
+Adoucir	adoucir
+adoucirait	adoucir
+adoucirent	adoucir
+adouciront	adoucir
+adoucis	adoucir
+adoucissaient	adoucir
+adoucissait	adoucir
+adoucissant	adoucissant
+adoucissante	adoucissant
+adoucissantes	adoucissant
+adoucissants	adoucissant
+adoucissement	adoucissement
+Adoucissement	adoucissement
+adoucissements	adoucissement
+adoucissent	adoucir
+adoucisseur	adoucisseur
+Adoucisseur	adoucisseur
+adoucisseurs	adoucisseur
+adoucit	adoucir
+adoucît	adoucir
+adoxa	adoxa
+Adoxus	adoxus
+adp	adp
+adragante	adragant
+adrénaline	adrénaline
+adrénalines	adrénaline
+adrénergique	adrénergique
+adrénergiques	adrénergique
+adressa	adresser
+adressable	adressable
+adressables	adressable
+adressage	adressage
+Adressage	adressage
+adressages	adressage
+adressai	adresser
+adressaient	adresser
+adressais	adresser
+adressait	adresser
+adressant	adresser
+Adressant	adresser
+adressât	adresser
+adresse	adresser
+adressé	adresser
+Adressé	adresser
+adressée	adresser
+Adressée	adresser
+adressées	adresser
+Adressées	adresser
+adressent	adresser
+adressera	adresser
+adresser	adresser
+Adresser	adresser
+adresserai	adresser
+adresseraient	adresser
+adresserais	adresser
+adresserait	adresser
+adresseras	adresser
+adressèrent	adresser
+adresserez	adresser
+adresseront	adresser
+adresses	adresse
+adressés	adresser
+Adressés	adresser
+adressez	adresser
+Adressez	adresser
+adressons	adresser
+Adressons	adresser
+adret	adret
+adrets	adret
+Adrets	adret
+adriatique	adriatique
+Adriatique	Adriatique
+adriatiques	adriatique
+Adrien	Adrien
+ADRIEN	Adrien
+Adrienne	Adrienne
+adroit	adroit
+adroite	adroit
+adroitement	adroitement
+Adroitement	adroitement
+adroites	adroit
+adroits	adroit
+adscrit	adscrit
+adsorbable	adsorbable
+adsorbables	adsorbable
+adsorbant	adsorbant
+adsorbantes	adsorbant
+adsorbants	adsorbant
+adsorbat	adsorbat
+adsorbats	adsorbat
+adsorbe	adsorber
+adsorbé	adsorber
+adsorbée	adsorber
+adsorbées	adsorber
+adsorbent	adsorber
+adsorber	adsorber
+adsorbés	adsorber
+adsorption	adsorption
+aDsorption	adsorption
+adsorptions	adsorption
+adstrat	adstrat
+adulaire	adulaire
+adulait	aduler
+adulant	aduler
+Adulant	aduler
+adulateur	adulateur
+adulateurs	adulateur
+adulation	adulation
+adulations	adulation
+adulatrices	adulateur
+adule	aduler
+adulé	aduler
+Adulé	aduler
+adulée	aduler
+Adulée	aduler
+adulées	aduler
+adulent	aduler
+aduler	aduler
+adulèrent	aduler
+adulés	aduler
+adulte	adulte
+Adulte	adulte
+adultérant	adultérer
+adultération	adultération
+adultérations	adultération
+adultère	adultère
+Adultère	adultère
+adultérée	adultérer
+adultères	adultère
+Adultères	adultère
+adultérin	adultérin
+adultérine	adultérin
+adultérines	adultérin
+adultérins	adultérin
+adultes	adulte
+advection	advection
+advections	advection
+advenait	advenir
+advenant	advenir
+Advenant	advenir
+advenir	advenir
+adventice	adventice
+adventices	adventice
+adventif	adventif
+Adventif	adventif
+adventifs	adventif
+adventiste	adventiste
+adventistes	adventiste
+Adventistes	adventiste
+adventive	adventif
+adventives	adventif
+advenu	advenir
+advenue	advenir
+advenues	advenir
+advenus	advenir
+adverbaux	adverbal
+adverbe	adverbe
+adverbes	adverbe
+Adverbes	adverbe
+adverbial	adverbial
+Adverbial	adverbial
+adverbiale	adverbial
+ADVERBIALE	adverbial
+adverbialement	adverbialement
+adverbiales	adverbial
+adverbiaux	adverbial
+adversaire	adversaire
+adversaires	adversaire
+adversative	adversatif
+adversatives	adversatif
+adverse	adverse
+adverses	adverse
+adversité	adversité
+adversités	adversité
+advertance	advertance
+adviendra	advenir
+adviendrait	advenir
+adviendront	advenir
+advienne	advenir
+Advienne	advenir
+adviennent	advenir
+adviens	advenir
+advient	advenir
+Advient	advenir
+advinrent	advenir
+advint	advenir
+advînt	advenir
+adynamie	adynamie
+adynamique	adynamique
+adynamiques	adynamique
+adyton	adyton
+Adyton	adyton
+Aeacus	Aeacus
+aède	aède
+aèdes	aède
+AELE	AELE
+Aelien	Aelien
+aepyornis	aepyornis
+Aepyornis	aepyornis
+aequo	aequo
+aéra	aérer
+aérage	aérage
+aéraient	aérer
+aérant	aérer
+aérateur	aérateur
+Aérateur	aérateur
+aérateurs	aérateur
+aération	aération
+Aération	aération
+aérations	aération
+aéraulique	aéraulique
+aérauliques	aéraulique
+aère	aérer
+aéré	aérer
+Aéré	aérer
+aérée	aérer
+aérées	aérer
+aèrent	aérer
+aérer	aérer
+Aérer	aérer
+aérés	aérer
+aérez	aérer
+Aérez	aérer
+aérien	aérien
+Aérien	aérien
+aérienne	aérien
+aériennes	aérien
+aériens	aérien
+Aériens	aérien
+aérifère	aérifère
+aérifères	aérifère
+aériforme	aériforme
+aériformes	aériforme
+aérium	aérium
+aéro	aéro
+aérobic	aérobic
+aérobie	aérobie
+aérobies	aérobie
+Aérobies	aérobie
+aérobiologie	aérobiologie
+aérobiose	aérobiose
+aérobus	aérobus
+aéro-club	aéro-club
+Aéro-club	aéro-club
+Aéro-Club	aéro-club
+aéro-clubs	aéro-club
+Aéro-clubs	aéro-club
+aérocolie	aérocolie
+aérocondenseur	aérocondenseur
+aérocystes	aérocyste
+aérodrome	aérodrome
+Aérodrome	aérodrome
+aérodromes	aérodrome
+aérodynamicien	aérodynamicien
+aérodynamicienne	aérodynamicien
+aérodynamiciens	aérodynamicien
+aérodynamique	aérodynamique