Go to file
matthieugomez d79ce43481 readme 2015-11-05 15:57:07 -05:00
benchmark add RatcliffObershelp 2015-11-05 10:32:58 -05:00
src more examples 2015-11-05 13:02:09 -05:00
test more examples 2015-11-05 13:02:09 -05:00
.travis.yml first commit 2015-10-22 12:12:44 -04:00
LICENSE.md first commit 2015-10-22 12:12:44 -04:00
README.md readme 2015-11-05 15:57:07 -05:00
REQUIRE add RatcliffObershelp 2015-11-05 10:32:58 -05:00

README.md

Build Status Coverage Status StringDistances

This Julia package computes various distances between strings.

Distances

Edit Distances

Q-Grams Distances

Q-gram distances compare the set of all substrings of length q in each string.

Others

Syntax

evaluate

The function evaluate returns the litteral distance between two strings (a value of 0 being identical). While some distances are bounded by 1, other distances like Hamming, Levenshtein, Damerau-Levenshtein, Jaccard can be higher than 1.

using StringDistances
evaluate(Hamming(), "martha", "marhta")
#> 2
evaluate(QGram(2), "martha", "marhta")
#> 6

compare

The higher level function compare directly computes for any distance a similarity score between 0 and 1. A value of 0 being completely different and a value of 1 being completely similar.

using StringDistances
compare(Hamming(), "martha", "marhta")
#> 0.6666666666666667
compare(QGram(2), "martha", "marhta")
#> 0.4

Modifiers

The package defines a number of ways to modify string metrics:

  • Winkler boosts the similary score of strings with common prefixes

    compare(Jaro(), "martha", "marhta")
    #> 0.9444444444444445
    compare(Winkler(Jaro()), "martha", "marhta")
    #> 0.9611111111111111
    

    The Winkler adjustment was originally defined for the Jaro distance but this package defines it for any string distance.

    compare(QGram(2), "william", "williams")
    #> 0.9230769230769231
    compare(Winkler(QGram(2)), "william", "williams")
    #> 0.9538461538461539
    
  • The Python library fuzzywuzzy defines a few modifiers for the RatcliffObershelp distance. This package defines them for any string distance:

    • Partial adjusts for differences in string lengths. The function returns the maximal similarity score between the shorter string and all substrings of the longer string.

      compare(Levenshtein(), "New York Yankees", "Yankees")
      #> 0.4375
      compare(Partial(Levenshtein()), "New York Yankees", "Yankees")
      #> 1.0
      
    • TokenSort adjusts for differences in word orders by reording words alphabetically.

      compare(RatcliffObershelp(), "mariners vs angels", "angels vs mariners")
      #> 0.44444
      compare(TokenSort(RatcliffObershelp()),"mariners vs angels", "angels vs mariners")
      #> 1.0
      
    • TokenSet adjusts for differences in word orders and word numbers.

      compare(Jaro(),"mariners vs angels", "los angeles angels at seattle mariners")
      #> 0.559904
      compare(TokenSet(Jaro()),"mariners vs angels", "los angeles angels at seattle mariners")
      #> 0.944444
      
  • You can compose multiple modifiers:

    compare(Winkler(Partial(Jaro())),"mariners vs angels", "los angeles angels at seattle mariners")
    #> 0.7378917378917379
    compare(TokenSet(Partial(RatcliffObershel())),"mariners vs angels", "los angeles angels at seattle mariners")
    #> 1.0
    

Tips

In case you're wondering which distance to use:

  • Each distance is tailored to a specific problem. Edit distances works well with local spelling errors, the Ratcliff-Obsershelp distance works well with edited texts, the Jaro Winkler distance was invented for short strings such as person names, the QGrams distances works well with strings composed of multiple words with fluctuating orderings.

  • When comparing company or individual names, each string is composed of multiple words and their ordering is mostly irrelevant. Edit distances will perform poorly in this situation. Use either a distance robust to word order (like QGram distances), or compose a distance with TokenSort or TokenSet, which reorder the words alphabetically.

    compare(RatcliffObershelp(), "mariners vs angels", "angels vs mariners")
    #> 0.44444
    compare(TokenSort(RatcliffObershelp()),"mariners vs angels", "angels vs mariners")
    #> 1.0
    compare(Cosine(3), "mariners vs angels", "angels vs mariners")
    #> 0.8125
    
  • Standardize strings before comparing them (lowercase, punctuation, whitespaces, accents, abbreviations...)

References