Simmetrics je knihovna napsaná v jazyku Java, poskytující rozsáhlé spektrum metrik pro porovnávání a slučovaní založených na kalkulaci nákladů transformace řetězců a tokenizaci, známý fonetický algoritmus Soundex a několik vlastních algoritmů autora. Teoretické pozadí většiny těchto metod pokrývá [1] a javadoc příslušné knihovny. Po ukončení vývoje knihovny jejím autorem došlo k několika pokusům na její vývoj navázat. Původní zdrojový kód je stále ještě dostupný pod odkazem [2]. [3] poskytuje její novější verzi přizpůsobenou pro snadnější použití v rámci vývojového prostředí Eclipse. Bohužel obě dostupné verze při jejich testování produkovaly chybný výstup pro některé z metrik. Tento článek představuje stručný návod, jakým způsobem naimportovat a upravit knihovnu v prostředí Eclipse.
Knihovna SIMMETRICS vznikla jako součást disertační práce Sama Chapmana, obhájené na UK Sheffield University, vypracované v rámci EPSRC, číslo grantu GR/N15764/01. Poskytuje značné (ač ne úplné) spektrum metrik pro porovnávání a slučování:
Testování knihovny bylo provedeno s využitím prostředí Eclipse Kepler. Stažené soubory knihovny byly nejprve dekomprimovány a poté importovány do nově vytvořeného Java Projektu. Kód je napsán pro Java SE 1.6, v novější verzi Javy nebude fungovat. Po importu projektu je před vlastním testováním nutné potlačit celou řadu chybových hlášek, způsobených ne zcela dobře napsaným kódem. Problém je v balíčcích uk.ac.shef.wit.simmetrics (třída TestMetrics) a uk.ac.shef.wit.simmetrics.utils (třída FileLoader). Pro všechny je snadným postačujícím řešením nabízený Quick Fix v podobě potlačení hlášky. Pro jednoduché otestování knihovny je možné použít třídu SimpleExample. V rámci ní lze nadefinovat konstanty str1 a str2, pro něž bude poskytnut výstup v podobě skóre jednotlivých metod. V rámci třídy SimpleExample nejsou naimportovány všechny dostupné metody. Přidání dalších z balíčku uk.ac.shef.wit.simmetrics.similaritymetrics lze provést naimportováním třídy představující požadovanou metriku, přidáním výstupu této metriky prostým nakopírováním níže uvedené části kódu a změnou názvu inicializované třídy ze Soundex na požadovanou metriku:
metric = new Soundex(); result = metric.getSimilarity(str1, str2); outputResult(result, metric);
Chování knihovny lze snadno otestovat vložením shodného řetězce pro str1 i str2, např. jména David.
100.0 Using Metric ChapmanLengthDeviation gives a similarity score of 100.0% Using Metric ChapmanMatchingSoundex gives a similarity score of 90.0% Using Metric ChapmanMeanLength gives a similarity score of 7.763171% Using Metric EuclideanDistance gives a similarity score of 100.0% Using Metric Levenshtein gives a similarity score of 100.0% Using Metric MongeElkan gives a similarity score of 100.0% Using Metric NeedlemanWunch gives a similarity score of 100.0% Using Metric QGramsDistance gives a similarity score of 100.0% Using Metric SmithWatermanGotoh gives a similarity score of 100.0% Using Metric SmithWatermanGotohWindowedAffine gives a similarity score of 100.0% Using Metric SmithWaterman gives a similarity score of 100.0% Using Metric Soundex gives a similarity score of 90.0%
Výstup testu však vyvolá značné pochybnosti. V případě Chapman Matching Soundex, Chapman Mean Length a Soundex je u shodných řetězců dosaženo schody nižší než 100%. Obdobným způsobem se chová i Jaro Winklerova vzdálenost. Chyba je obsažena v metodě StringBuilder. V níže uvedeném kódu je nutné odstranit odečítání jedné od délky druhého řetězce:
for (int j = Math.max(0, i - distanceSep); !foundIt && j < Math.min(i + distanceSep, string2.length() - 1); j++) {
Tento hot fix opraví fungování většiny metod s výjimkou ChapmanMeanLength.
Po výše uvedených úpravách je sice knihovna relativně funkční pro další testování, pro reálnou aplikaci je však stávající forma výstupu na konzoli poněkud nepraktická. Pro rychlou nápravu tohoto neduhu jsem vytvořil v rámci balíčku uk.ac.shef.wit.simmetrics klon třídy SimpleExample, doplnil jej o konektivitu na databázi MySQL a nazval MzSqlJdbcTest. Zdrojový kód je k dispozici v rámci sekce Výzkum / Metody pro porovnávání řetězců. Úpravy kódu jsou šity na míru realizovanému benchmarku metod pro porovnávání a slučování. Lze jej však snadnými úpravami přizpůsobit jakékoliv aplikaci v rámci níž jsou porovnávány dva řetězce obsažené v rámci dvojice atributů jednotlivých řádků tabulky. V rámci poskytnuté třídy jsou provedené některé dílčí standardizační kroky. Původní knihovna předpokládala anglofonní prostředí, před jejím použitím pro ČR je nutné odstranit diakritiku pomocí sady metod replace(). Knihovna rovněž abstrahovala od nestejné velikosti písmen. Proto jsem v rámci úprav přidal i sjednocení velikosti pomocí metody toUpperCase().