Я только что написал некоторый код для приблизительного сопоставления строк. Я хотел бы сравнить своего наивного алгоритма с более сформировавшейся реализацией, работающей на JVM. Какие-либо предложения?
Я нашел эти ответы в другом месте на этом сайте для аналогичных проблем.
Commons Lang имеет реализацию расстояния Левенштейна.
http://commons.apache.org/lang/api-release/org/apache/commons/lang/StringUtils.htmlCommons Codec имеет реализацию саундекса и метафона.
http://commons.apache.org/codec/api-release/org/apache/commons/codec/language/Soundex.html
http://commons.apache.org/codec/api-release/org/apache/commons/codec/language/Metaphone.html
(source)
Lucene (http://lucene.apache.org/) также реализует расстояние Левенштейна.
(source: zarawesome)
Так получилось, что я изобрел это колесо много лет назад - в программе на FORTRAN на мэйнфрейме :)
Когда я с гордостью рассказывал о своем алгоритме другим людям в Интернете, они смеялись и указывали мне на два (четыре?) больших имени в этой области:
Это алгоритмы для сравнения огромных последовательностей похожих строк. Требуется память около m + n
, где m и n - размеры строк, а время работы - около m * n
.
Gunslinger47 упоминает Levenshtein, Soundex и Metaphone. Левенштейн также является мощным средством вычисления расстояний между строками, но он лучше подходит для "нормального" текста. Soundex и Metaphone вычисляют короткую строку, предназначенную для кодирования звука строки при произнесении человеком... они становятся неэффективными примерно после 3 слогов, они действительно предназначены для слов в человеческом языке, а не для строк геномов или тому подобного.
EDIT
Упс, я только что нашел свои 4 громких имени внизу статьи, которую вы цитировали. Так что вы уже знаете о них. Я думаю, что если вы проведете поиск по этим именам и "Java", вы должны найти их реализации. Вот первое, что я нашел.