C++: проверьте, правильно ли написано слово

Я ищу простой способ проверить, является ли определенная строка правильно написанным английским словом. Например, "look" вернул бы "True", а "hurrr" вернул бы "False". Мне не нужны предложения правописания или какие-либо исправляющие орфографию функции. Просто простая функция, которая принимает строку и возвращает логическое значение.

Я мог бы легко сделать это с Python, используя PyEnchant, но, похоже, вам нужно скомпилировать библиотеку самостоятельно, если вы хотите использовать ее с MS Visual C++.

5 ответов

Решение

PyEnchant основан на Enchant- библиотеке C, предоставляющей интерфейсы C и C++. Так что вы можете просто использовать это для C++. Минимальный пример будет примерно таким:

#include <memory>
#include <cstdio>

#include "enchant.h"
#include "enchant++.h"

int main ()
{
    try
        {
            enchant::Broker *broker = enchant::Broker::instance ();
        std::auto_ptr<enchant::Dict> dict (broker->request_dict ("en_US"));

            const char *check_checks[] = { "hello", "helllo" };
            for (int i = 0; i < (sizeof (check_checks) / sizeof (check_checks[0])); ++i)
        {
            printf ("enchant_dict_check (%s): %d\n", check_checks[i],
                dict->check (check_checks[i]) == false);
        }

    } catch (const enchant::Exception &) {
        return 1;
    }
}

Дополнительные примеры / тесты см. В их репозитории SVN.

Если вы хотите реализовать такую ​​функцию самостоятельно, вам потребуется база данных для запроса, чтобы выяснить, является ли данное слово допустимым (обычно достаточно простого текстового файла, например, /usr/share/dict/words в Linux).

В противном случае вы могли бы положиться на стороннюю библиотеку проверки орфографии, которая делает именно это.

Вы можете взять один из словарей GNU там (например, /usr/share/dict/words как уже упоминалось) и встроить его в соответствующую структуру данных, которая обеспечит вам быстрый поиск и проверку членства в зависимости от ваших потребностей в производительности, может быть достаточно что-то вроде ориентированного ациклического графа слов или даже просто три.

Для начала вам понадобится список слов. (может быть /usr/share/dict/words?)

Вы должны прочитать свой список слов в std::set, Затем проверка правильности орфографии состоит просто из проверки всех вводимых пользователем слов на предмет того, находятся ли они в наборе.

bool spell_check(std::string const& str)
{
  std::cout << "Is '" << str << "' spelled correctly? ";
  std::string input;
  std::getline(input);

  return input[0] == 'y' || input[0] == 'Y';
}
Другие вопросы по тегам