Я только что написал код для приблизительного сопоставления строк. Я хотел бы сравнить свой наивный алгоритм с более зрелой реализацией, работающей на JVM. Какие-либо предложения?
Примерная библиотека регулярных выражений для Java?
Ответы (2)
Я нашел эти ответы в другом месте на этом сайте для аналогичных проблем.
В Commons Lang есть реализация расстояния Левенштейна.
http://commons.apache.org/lang/api-release/org/apache/commons/lang/StringUtils.htmlВ кодеке Commons есть реализация soundex и метафона.
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
(источник)
Lucene (http://lucene.apache.org/) также реализует расстояние редактирования Левенштейна.
(исходный код: zarawesome)
Так получилось, что я заново изобрел это колесо много лет назад - в программе FORTRAN на мэйнфрейме :)
Когда я с гордостью рассказал другим людям в Интернете о моем алгоритме, они засмеялись и указали мне на два (четыре?) Громких имени в этой области:
Это алгоритмы для сравнения огромных последовательностей одинаковых строк. Требование к памяти составляет около m + n
, где m и n - размеры строк, а время выполнения составляет около m * n
.
Gunslinger47 упоминает Levenshtein, Soundex и Metaphone. Левенштейн также является мощным средством вычисления расстояний между строками, но он лучше подходит для «обычного» текста. Soundex и Metaphone вычисляют короткую строку, предназначенную для кодирования звука строки, когда ее произносит человек ... они становятся неэффективными примерно через 3 слога, они действительно предназначены для слов на человеческом языке, а не для строк геномов или чего-то подобного.
ИЗМЕНИТЬ
Ой, я только что нашел свои 4 громких имени внизу статьи, которую вы процитировали. Значит, вы уже знаете о них. Я думаю, что если вы будете искать эти имена, и «Java» найдет вам их реализации. Вот первый, который я нашел.