WordSegmentation в SymSpellPlusPlus - PullRequest
       18

WordSegmentation в SymSpellPlusPlus

0 голосов
/ 31 мая 2019

Я хотел бы использовать C ++ версию SymSpell , которая называется SymSpellPlusPlus . В версии C # использование WordSegmentation выглядит так (из первой ссылки):

//word segmentation and correction for multi-word input strings with/without spaces
inputTerm="thequickbrownfoxjumpsoverthelazydog";
maxEditDistance = 0;
suggestion = symSpell.WordSegmentation(input);

//display term and edit distance
Console.WriteLine(suggestion.correctedString + " " + suggestion.distanceSum.ToString("N0"));

В версии C ++ метод WordSegmentation возвращает общий указатель (из второй ссылки):

     ...
     shared_ptr<WordSegmentationItem> WordSegmentation(const char* input)
        {
            return WordSegmentation(input, this->maxDictionaryEditDistance, this->maxDictionaryWordLength);
        }

     shared_ptr<WordSegmentationItem> WordSegmentation(const char* input, size_t maxEditDistance)
        {
            return WordSegmentation(input, maxEditDistance, this->maxDictionaryWordLength);
        }

     shared_ptr<WordSegmentationItem> WordSegmentation(const char* input, size_t maxEditDistance, size_t maxSegmentationWordLength)
        {
          // lines 1039 - 1179 under second link
          std::vector<shared_ptr<WordSegmentationItem>> compositions;
          ...
          return compositions[circularIndex];
        }

В своем коде я пробовал среди прочего следующий код:

const char* inputTerm = "whereis th elove hehad dated forImuch of thepast who couqdn'tread in sixtgrade and ins pired him";
auto suggestions = symSpell.WordSegmentation(inputTerm);

Но выдает ошибку:

free() invalid next size (fast)

Это связано с ошибкой памяти, но я не знаю, как решить эту проблему.
Класс WordSegmentationItem выглядит следующим образом (строки 292-325 во второй ссылке):

class WordSegmentationItem
    {
    public:
        const char* segmentedString{ nullptr };
        const char* correctedString{ nullptr };
        u_int8_t distanceSum = 0;
        double probabilityLogSum = 0;

        WordSegmentationItem() { }
        WordSegmentationItem(const symspell::WordSegmentationItem & p)
        {
            this->segmentedString = p.segmentedString;
            this->correctedString = p.correctedString;
            this->distanceSum = p.distanceSum;
            this->probabilityLogSum = p.probabilityLogSum;
        }

        WordSegmentationItem& operator=(const WordSegmentationItem&) { return *this; }
        WordSegmentationItem& operator=(WordSegmentationItem&&) { return *this; }

        void set(const char* pSegmentedString, const char* pCorrectedString, u_int8_t pDistanceSum, double pProbabilityLogSum)
        {
            this->segmentedString = pSegmentedString;
            this->correctedString = pCorrectedString;
            this->distanceSum = pDistanceSum;
            this->probabilityLogSum = pProbabilityLogSum;
        }

        ~WordSegmentationItem()
        {
            delete[] segmentedString;
            delete[] correctedString;
        }
};

Как мне получить правую строку из элемента WordSegmentationItem?

1 Ответ

1 голос
/ 31 мая 2019

Библиотека глючит, и автор должен внести некоторые исправления.

Во-первых, компиляция дает нам предупреждение о SuggestItem::ShallowCopy, которое возвращает локальную переменную по ссылке. Очень плохой! Мы можем изменить это, чтобы вернуть по значению, вероятно.

Это не исправляет сбой, однако.

Если мы клонируем репозиторий библиотеки, запустите следующий тестовый пример в отладчике:

#include "symspell6.h"

int main()
{
    const char* inputTerm = "whereis th elove hehad dated forlmuch of thepast who couqdn'tread in sixtgrade and ins pired him";

    symspell::SymSpell symSpell;
    auto suggestions = symSpell.WordSegmentation(inputTerm);
}

& hellip; мы видим, что возврат compositions[circularIndex] из функции WordSegmentation вызывает неверный доступ в конструкторе shared_ptr. Это говорит о том, что circularIndex выходит за пределы и дает нам несуществующий shared_ptr. Действительно, circularIndex - это 95, но compositions.size() - это 0!

В функции отсутствует серьезная проверка ошибок.

Теперь только автор (или, по крайней мере, тот, кто знает, что должна делать библиотека; это не я!) Может исправить это должным образом. Но в качестве быстрого патча я добавил следующее после строки 1055:

if (compositions.empty())
   return nullptr;

& hellip; и теперь он, по крайней мере, работает.

Кажется, что функция предполагает, что словарь не пуст. Я не знаю, ожидаемое ли это поведение или нет (кроме отсутствующей проверки ошибок, как описано выше).

Проект нуждается в некоторой документации, потому что для этих функций не упоминаются предварительные условия или постусловия и нет указаний на то, как предполагается использовать библиотеку. Опять же, автор должен исправить эти вещи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...