# HG changeset patch # User Chris Cannam # Date 1266583283 0 # Node ID 06b2ea2ca577254041e59b7f66852475b38694af # Parent a1d67e136c306927ed04aac5c989cd4fea489925 * use floating-point scores for name matching diff -r a1d67e136c30 -r 06b2ea2ca577 common/Objects.cpp --- a/common/Objects.cpp Fri Feb 19 11:41:57 2010 +0000 +++ b/common/Objects.cpp Fri Feb 19 12:41:23 2010 +0000 @@ -275,7 +275,7 @@ return false; } -int +float Composer::matchFuzzyName(QString n) const { int fameBonus = m_pages.size(); @@ -284,9 +284,11 @@ return matchFuzzyName(n.toLower().split(sre, QString::SkipEmptyParts)); } -int +float Composer::matchFuzzyName(QStringList elements) const { + if (elements.empty()) return 0; + cacheNames(); int fameBonus = m_pages.size(); @@ -391,7 +393,7 @@ score += fameBonus; } // if (score > 1) std::cerr << "[score " << score << " for " << name().toStdString() << "]" << std::endl; - return score; + return float(score) / (elements.size() * 10); } static int diff -r a1d67e136c30 -r 06b2ea2ca577 common/Objects.h --- a/common/Objects.h Fri Feb 19 11:41:57 2010 +0000 +++ b/common/Objects.h Fri Feb 19 12:41:23 2010 +0000 @@ -357,7 +357,7 @@ * that the intended composer was this one. Higher return values * indicate greater confidence. */ - int matchFuzzyName(QString name) const; + float matchFuzzyName(QString name) const; /** * Given another name which is believed to be a user-entered @@ -367,7 +367,7 @@ * indicate greater confidence. The supplied name should have * been lower-cased and split on non-alphabetical characters. */ - int matchFuzzyName(QStringList name) const; + float matchFuzzyName(QStringList name) const; /** * Return the supplied name reduced into a "simplified" form, diff -r a1d67e136c30 -r 06b2ea2ca577 testapp/Loader.cpp --- a/testapp/Loader.cpp Fri Feb 19 11:41:57 2010 +0000 +++ b/testapp/Loader.cpp Fri Feb 19 12:41:23 2010 +0000 @@ -94,21 +94,21 @@ } */ while (!std::cin.eof()) { - std::cerr << "Enter composer name: "; + std::cerr << std::endl << "Enter composer name: "; std::string s; getline(std::cin, s); - QMultiMap matches; + QMultiMap matches; QRegExp sre("[\\., -]+"); QStringList elements = QString::fromStdString(s) .toLower().split(sre, QString::SkipEmptyParts); foreach (QObject *o, composers) { Composer *c = qobject_cast(o); if (!c) continue; - int value = c->matchFuzzyName(elements); + float value = c->matchFuzzyName(elements); matches.insert(value, c->getSortName(false)); } int n = 0; - for (QMultiMap::const_iterator i = matches.end(); + for (QMultiMap::const_iterator i = matches.end(); i != matches.begin(); ) { --i; if (i.key() < 0) continue; @@ -119,7 +119,9 @@ } else { std::cerr << " - "; } - std::cerr << i.value().toStdString() << std::endl; + std::cerr << i.value().toStdString(); + for (int c = i.value().length(); c < 40; ++c) std::cerr << " "; + std::cerr << "[" << i.key() << "]" << std::endl; if (++n > 5 || i.key() < 1) break; } if (n == 0) std::cerr << "No matches" << std::endl;