123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- # Copyright (c) 2018 luozhouyang
- #
- # Permission is hereby granted, free of charge, to any person obtaining a copy
- # of this software and associated documentation files (the "Software"), to deal
- # in the Software without restriction, including without limitation the rights
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- # copies of the Software, and to permit persons to whom the Software is
- # furnished to do so, subject to the following conditions:
- #
- # The above copyright notice and this permission notice shall be included in all
- # copies or substantial portions of the Software.
- #
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- # SOFTWARE.
- from enum import IntEnum
- from .cosine import Cosine
- from .damerau import Damerau
- from .jaccard import Jaccard
- from .jarowinkler import JaroWinkler
- from .levenshtein import Levenshtein
- from .longest_common_subsequence import LongestCommonSubsequence
- from .metric_lcs import MetricLCS
- from .ngram import NGram
- from .normalized_levenshtein import NormalizedLevenshtein
- from .optimal_string_alignment import OptimalStringAlignment
- from .qgram import QGram
- from .sorensen_dice import SorensenDice
- from .weighted_levenshtein import WeightedLevenshtein
- class Algorithm(IntEnum):
- COSINE = 1
- DAMERAU = 2
- JACCARD = 3
- JARO_WINKLE = 4
- LEVENSHTEIN = 5
- LCS = 6
- METRIC_LCS = 7
- N_GRAM = 8
- NORMALIZED_LEVENSHTEIN = 9
- OPTIMAL_STRING_ALIGNMENT = 10
- Q_GRAM = 11
- SORENSEN_DICE = 12
- WEIGHTED_LEVENSHTEIN = 13
- class Factory:
- @staticmethod
- def get_algorithm(algorithm: Algorithm, k=3):
- if algorithm == Algorithm.COSINE:
- return Cosine(k)
- elif algorithm == Algorithm.DAMERAU:
- return Damerau()
- elif algorithm == Algorithm.JACCARD:
- return Jaccard(k)
- elif algorithm == Algorithm.JARO_WINKLE:
- return JaroWinkler()
- elif algorithm == Algorithm.LEVENSHTEIN:
- return Levenshtein()
- elif algorithm == Algorithm.LCS:
- return LongestCommonSubsequence()
- elif algorithm == Algorithm.METRIC_LCS:
- return MetricLCS()
- elif algorithm == Algorithm.N_GRAM:
- return NGram()
- elif algorithm == Algorithm.NORMALIZED_LEVENSHTEIN:
- return NormalizedLevenshtein()
- elif algorithm == Algorithm.OPTIMAL_STRING_ALIGNMENT:
- return OptimalStringAlignment()
- elif algorithm == Algorithm.Q_GRAM:
- return QGram()
- elif algorithm == Algorithm.SORENSEN_DICE:
- return SorensenDice(k)
- elif algorithm == Algorithm.WEIGHTED_LEVENSHTEIN:
- raise TypeError("This method does not support create weighted_levenshtein algorithm.")
- else:
- return Cosine(k)
- @staticmethod
- def get_weighted_levenshtein(char_sub, char_change):
- return WeightedLevenshtein(char_sub, char_change)
- if __name__ == "__main__":
- a = Factory().get_algorithm(Algorithm.LEVENSHTEIN)
- distance_format = "distance: {:.4} between {} and {}"
- s0 = "你好"
- s1 = "你好啊"
- print(distance_format.format(str(a.distance(s0, s1)), s0, s1))
|