From c4743dd4dd15681b1ff9d2be64c8307d0dce53b9 Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Mon, 23 Jan 2017 12:03:51 -0500 Subject: Added form::startsWithVowelSound convenience method --- lib/form.cpp | 44 +++++++++++++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 11 deletions(-) (limited to 'lib/form.cpp') diff --git a/lib/form.cpp b/lib/form.cpp index 8ba3bd7..778e5d3 100644 --- a/lib/form.cpp +++ b/lib/form.cpp @@ -1,26 +1,26 @@ #include "form.h" #include #include "filter.h" -#include "pronunciation.h" #include "database.h" #include "query.h" +#include "util.h" namespace verbly { - + const object form::objectType = object::form; - + const std::list form::select = {"form_id", "form", "complexity", "proper"}; - + const field form::id = field::integerField(object::form, "form_id"); const field form::text = field::stringField(object::form, "form"); const field form::complexity = field::integerField(object::form, "complexity"); const field form::proper = field::booleanField(object::form, "proper"); - + const field form::pronunciation = field::joinThrough(object::form, "form_id", object::pronunciation, "forms_pronunciations", "pronunciation_id"); - + const field form::lemmaJoin = field::joinField(object::form, "form_id", object::lemma); const field form::inflectionCategory = field::integerField("lemmas_forms", "category"); - + form::form(const database& db, sqlite3_stmt* row) : db_(&db), valid_(true) { id_ = sqlite3_column_int(row, 0); @@ -28,7 +28,7 @@ namespace verbly { complexity_ = sqlite3_column_int(row, 2); proper_ = (sqlite3_column_int(row, 3) == 1); } - + filter operator%=(form::inflection_field check, filter joinCondition) { return (form::lemmaJoin %= (joinCondition && (form::inflectionCategory == check.getCategory()))); @@ -40,14 +40,36 @@ namespace verbly { { throw std::domain_error("Bad access to uninitialized form"); } - + if (!initializedPronunciations_) { pronunciations_ = db_->pronunciations(pronunciation::form %= *this, false, -1).all(); initializedPronunciations_ = true; } - + return pronunciations_; } - + + bool form::startsWithVowelSound() const + { + if (!valid_) + { + throw std::domain_error("Bad access to uninitialized form"); + } + + const std::vector& pronunciations = getPronunciations(); + if (!pronunciations.empty()) + { + return std::any_of(std::begin(pronunciations), std::end(pronunciations), [] (const verbly::pronunciation& p) { + std::cout << "phonemes: " << implode(std::begin(p.getPhonemes()), std::end(p.getPhonemes()), ",") << std::endl; + return p.getPhonemes().front().find_first_of("012") != std::string::npos; + }); + } else { + // If the word is not in CMUDICT, fall back to checking whether the first letter is a vowel. + // Not perfect but will work in most cases. + char ch = std::tolower(text_.front()); + return (ch == 'a') || (ch == 'e') || (ch == 'i') || (ch == 'o') || (ch == 'u'); + } + } + }; -- cgit 1.4.1