Examples — super-collator 0.0.3 documentation

# Examples

Install:

    $ pip install super-collator

Align two strings with relaxed spelling using N-Grams:

    >>> from super_collator.aligner import Aligner
    >>> from super_collator.ngrams import NGrams
    >>> from super_collator.super_collator import to_table

    >>> aligner = Aligner(-0.5, -0.5, -0.5)
    >>> a = "Lorem ipsum dollar amat adipiscing elit"
    >>> b = "qui dolorem ipsum quia dolor sit amet consectetur adipisci velit"
    >>>
    >>> a = [NGrams(s).load(s, 3) for s in a.split()]
    >>> b = [NGrams(s).load(s, 3) for s in b.split()]
    >>>
    >>> a, b, score = aligner.align(a, b, NGrams.similarity, lambda: NGrams("-"))
    >>> print(to_table(list(map(str, a)), list(map(str, b))))
    -   Lorem   ipsum -    dollar -   amat -           adipiscing elit
    qui dolorem ipsum quia dolor  sit amet consectetur adipisci   velit

Multiple alignment: We repeatedly align two lists of NGrams against each other.

    >>> from super_collator.aligner import Aligner
    >>> from super_collator.ngrams import NGrams
    >>> from super_collator.super_collator import to_table
    >>>
    >>> def similarity(aa, bb):
    ...     sim = float("-inf")
    ...     for a in aa:
    ...         for b in bb:
    ...             score = NGrams.similarity(a, b)
    ...             if score > sim:
    ...                 sim = score
    ...     return sim
    >>>
    >>> def merge(aa, bb):
    ...     return [a + b for a, b in zip(aa, bb)]
    >>>
    >>> aligner = Aligner(-1.0, -0.5, -0.5)
    >>> a = "qui dolorem ipsum quia dolor sit amet consectetur adipisci velit"
    >>> b = "Lorem ipsum adipiscing"
    >>> c = "Lorem dollar amat elit"
    >>>
    >>> a = [[NGrams(s).load(s, 2)] for s in a.split()]
    >>> b = [[NGrams(s).load(s, 2)] for s in b.split()]
    >>> c = [[NGrams(s).load(s, 2)] for s in c.split()]
    >>>
    >>> a,  b, score = aligner.align(a,  b, similarity, lambda: [NGrams("-")], lambda: [NGrams("-")])
    >>> ab = merge(a, b)
    >>> ab, c, score = aligner.align(ab, c, similarity, lambda: [NGrams("-")] * 2, lambda: [NGrams("-")])
    >>> abc = merge(ab, c)
    >>>
    >>> print(to_table(*zip(*[[t.user_data for t in nn] for nn in abc])))
    qui dolorem ipsum quia dolor  sit amet consectetur adipisci   velit
    -   Lorem   ipsum -    -      -   -    -           adipiscing -
    -   Lorem   -     -    dollar -   amat -           -          elit

Align two sentences using their part-of-speech tags only:

    >>> from super_collator.aligner import Aligner
    >>> from super_collator.super_collator import to_table
    >>>
    >>> class PosToken:
    ...     def __init__(self, s, pos):
    ...         self.s = s
    ...         self.pos = pos
    ...
    ...     def __str__(self):
    ...         return self.s
    ...
    ...     @staticmethod
    ...     def similarity(a, b):
    ...         return 1.0 if a.pos == b.pos else 0.0
    >>>
    >>> aligner = Aligner()
    >>> a = "it/PRP was/VBD a/DT dark/JJ and/CC stormy/JJ night/NN"
    >>> b = "it/PRP is/VBZ a/DT fine/JJ day/NN"
    >>>
    >>> a = [PosToken(*s.split("/")) for s in a.split()]
    >>> b = [PosToken(*s.split("/")) for s in b.split()]
    >>>
    >>> c, d, score = aligner.align(a, b, PosToken.similarity, lambda: PosToken("-", ""))
    >>> print(to_table(list(map(str, c)), list(map(str, d))))
    it was a dark and stormy night
    it is  a fine -   -      day