'Leacock Chodorow Similarity:
Return a score denoting how similar two word senses are, based on the
shortest path that connects the senses (as above) and the maximum depth
of the taxonomy in which the senses occur. The relationship is given as
-log(p/2d) where p is the shortest path length and d is the taxonomy
depth.
:type  other: Synset
:param other: The ``Synset`` that this ``Synset`` is being compared to.
:type simulate_root: bool
:param simulate_root: The various verb taxonomies do not
share a single root which disallows this metric from working for
synsets that are not connected. This flag (True by default)
creates a fake root that connects all the taxonomies. Set it
to false to disable this behavior. For the noun taxonomy,
there is usually a default root except for WordNet version 1.6.
If you are using wordnet 1.6, a fake root will be added for nouns
as well.
:return: A score denoting the similarity of the two ``Synset`` objects,
normally greater than 0. None is returned if no connecting path
could be found. If a ``Synset`` is compared with itself, the
maximum score is returned, which varies depending on the taxonomy
depth.'

def lch_similarity(self, other, verbose=False, simulate_root=True):

    if (self._pos != other._pos):
        raise WordNetError((u'Computing    the    lch    similarity    requires    %s    and    %s    to    have    the    same    part    of    speech.' % (self, other)))
    need_root = self._needs_root()
    if (self._pos not in self._wordnet_corpus_reader._max_depth):
        self._wordnet_corpus_reader._compute_max_depth(self._pos, need_root)
    depth = self._wordnet_corpus_reader._max_depth[self._pos]
    distance = self.shortest_path_distance(other, simulate_root=(simulate_root and need_root))
    if ((distance is None) or (distance < 0) or (depth == 0)):
        return None
    return (- math.log(((distance + 1) / (2.0 * depth))))
