Nano Hash - криптовалюты, майнинг, программирование

Итератор (string::iterator) ведет себя так, как будто выходит за рамки?

У меня есть документы в формате PDF, скопированные/вставленные в TXT в качестве входных данных, и я хочу построить дерево «Раздел». Каждый раздел содержит заголовок (например, «3.3 Оценка методов») и текст (все остальное до следующего заголовка). Оба реализованы с помощью iterator_range (который я набрал как string_range).

Я начал с функции, которая возвращает мне номер заголовка + самое первое слово после него (в приведенном выше примере она вернет «3.3 Evaluation», а все остальное поместит под текст). Эта функция расширяет заголовок.

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

Цикл while нужен, чтобы заставить меня добраться до последнего. Если отладить, он отлично работает ВНУТРИ цикла. Как только я оставляю это, итераторы облажались. Я не понимаю, почему.

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

Строка temp должна быть причиной, так как это единственное, что находится внутри цикла while, но это не имеет никакого смысла, поскольку я копирую ее в другую переменную, а это единственное, что видят итераторы. Другая переменная не выходит за пределы области видимости, так почему же меняются итераторы? Не могу придумать объяснение :-(

Это не повышение, потому что необъяснимый std::string::iterator делает то же самое - класс iterator_range не имеет ничего общего с этим поведением...

#include <string>
#include <boost/algorithm/string.hpp>
#include <boost/algorithm/string_regex.hpp>
#include <boost/regex.h>


using namespace std;
using namespace boost;

typedef iterator_range<string::iterator> string_range;

int main() {
    string original_text("Mixed Initiative Dialogue Management 2.1 Motivation In naturally occurring human-human dialogues, speakers often adopt different dialogue strategies based on hearer characteristics, dialogue history, etc.For instance, the speaker may provide more guidance if the hearer is hav- ing difficulty making progress toward task completion, while taking a more passive approach when the hearer is an expert in the domain.Our main goal is to enable a spoken dialogue system to simulate such human be- havior by dynamically adapting dialogue strategies dur- ing an interaction based on information that can be au- tomatically detected from the dialogue. Figure 1 shows an excerpt from a dialogue between MIMIC and an ac- tual user where the user is attempting to find the times at which the movie Analyze This playing at theaters in Montclair. S and U indicate system and user utterances, respectively, and the italicized utterances are the output of our automatic speech recognizer.In addition, each system turn is annotated with its task and dialogue ini- tiative holders, where task initiative tracks the lead in the process toward achieving the dialogue participants' do- main goal, while dialogue initiative models the lead in determining the current discourse focus (Chu-Carroll and Brown, 1998). In our information query application do- main, the system has task (and thus dialogue) initiative if its utterances provide helpful guidance toward achieving the user's domain goal, as in utterances (6) and (7) where MIMIC provided valid response choices to its query in- tending to solicit a theater name, while the system has 97 dialogue but not task initiative if its utterances only spec- ify the current discourse goal, as in utterance (4). This dialogue illustrates several features of our adap- tive mixed initiative dialogue manager for dynamic");
    string_range text(original_text.begin(), original_text.end() );
    string first_sentence("Mixed Initiative Dialogue Management 2.1 Motivation In naturally occurring human-human dialogues, speakers often adopt different dialogue strategies based on hearer characteristics, dialogue history, etc.");
    regex capex("((^| )([A-Z][a-z]+|[A-Z]+) )"); // Capitalized word (or fullcapsed word)
    string_range capitalized_word;

    string::iterator unexplainable;
    int count = 0;
    while (find_regex(first_sentence, capex) ) { // Getting the last one
        capitalized_word = find_regex(first_sentence, capex);
        string temp(capitalized_word.end(), first_sentence.end() );
        first_sentence = temp;
        unexplainable = capitalized_word.begin(); // Here is fine
        count++;
    }
    if (count <= 1) return 0;
    string_range new_text_range(unexplainable, text.end()); // Here it gets full of junk... why??
    string new_string(new_text_range.begin(), new_text_range.end() );
    string_range new_text_range2(capitalized_word.begin(), text.end());
    return 0;
}
04.03.2012

Ответы:


1

Ваша проблема в том, что вы смешиваете итераторы из разных последовательностей и пытаетесь создать из них новую последовательность. Итератор unexplainable указывает где-то в строке first_sentence, а text.end() указывает на конец строки original_text.

Вот как может выглядеть память

      0123456789012345
      ----------------
   00 Hello World!0%&(
   16 %£$!*Bye world!0

Теперь скажем, что unexplainable указывает на 6, т.е. "Мир!" и text.end() указывает на 31, теперь, если вы создадите диапазон (а затем строку из этого диапазона), вы получите мусор, потому что строка, которую вы получите, будет выглядеть так: "World!0%&(%£$!*Bye world!". Это всего лишь выдуманный пример, но я надеюсь, что вы уловили идею: Не смешивайте итераторы из разных последовательностей!!

Я бесплатно дам еще одну подсказку: не вычисляйте find_regex() дважды, измените цикл на что-то вроде:

do
{
  capitalized_word = find_regex(first_sentence, capex);
  if(capitalized_word)
  {
    // do stuff
  }
}while(capitalized_word);
04.03.2012
  • Я вычислил его дважды, потому что думал, что, выполнив while (capitalized_word = find_regex(first_sentence, capex)) , я смогу получить логическое значение в слово с заглавной буквы, тем самым все испортив. Кстати, слово с заглавной буквы и необъяснимое сразу указывают на мусор. Если я засуну в отладчик и остановлюсь перед if, то там уже полно хлама (до него все нормально). Я попробую std::distance, но не могу понять, почему... Сферы кажутся прекрасными! 05.03.2012
  • @Davide: Нет, я думаю, вы меня неправильно поняли, настоящая проблема заключается в том, что не вычисление find_regex() дважды, а в том, что вы не можете создать диапазон с помощью итераторов из двух отдельных строк. 06.03.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..