Разбить текст на английский (несколько строк) - PullRequest
0 голосов
/ 09 июня 2018

Меня интересует эффективный способ разбить текст на предложения.Предложения разделяются точкой + пробел

Текст примера

 The quick brown fox jumps 
 over the lazy dog. I love eating toasted cheese and tuna sandwiches.

Мой алгоритм работает следующим образом

Read first line from text file to string
Find what is needed
Write to file

Однако иногда половина предложения может быть в следующемлиния.

Так что мне было интересно, как лучше всего решить эту проблему

Да, попробованный поиск в Google "поиск по нескольким строкам", и я не хочу использовать регулярное выражение

Первоначально моя идея состоит в том, чтобы проверить, заканчивается ли первая строка символом .+ space, а если нет, перехватить другую строку и выполнить поиск по ней.Но у меня такое чувство, что я что-то упускаю.

РЕДАКТИРОВАТЬ: Извините, забыл упомянуть, что я делаю это в C ++

Ответы [ 3 ]

0 голосов
/ 09 июня 2018

Вот мой подход к этой проблеме

void to_sentences()
{
    // Do not skip whitespaces
    std::cin >> std::noskipws;

    char c;
    // Loop until there is no input
    while (std::cin >> c) {
        // Skip new lines
        if (c == '\n')
            continue;

        // Output the character
        std::cout << c;

        // check if there is a dot folowed by space
        // if there add new line
        if (c == '.') {
            std::cin >> c;
            if (c == ' ')
                std::cout << endl;
        }
    }

    // Reset skip whitespaces
    std::cin >> std::skipws;
}

Вы можете прочитать комментарии и спросить, есть ли что-то неясное.

0 голосов
/ 09 июня 2018

Вы можете использовать std::getline(), с пользовательским делитером '.'

#include <sstream>
#include <string>
#include <vector>

auto split_to_sentences(std::string inp)
{
    std::istringstream ss(inp); // make a stream using the string
    std::vector< std::string > sentences; // return value

    while(true) {
        std::string this_sentence;

        std::getline(ss, this_sentence, '.');
        if (this_sentence != "") 
            sentences.push_back(std::move(this_sentence));
        else 
            return sentences;
    }
}

Обратите внимание, что если у вас есть входной текст в виде потока , тоВы можете пропустить шаг std::stringstream и передать поток непосредственно на std::getline вместо ss.

Использование std::move не обязательно, но может повысить производительность, предотвращаякопия и удаление динамических частей (в куче) std::string.

0 голосов
/ 09 июня 2018

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

1. Read line
2. Check the last symbols in this line.
3. If last symbols are dot or dot+space
 3.1 Split it and write all strings to output 
 3.2 GOTO 1
ELSE 
  3.3 split the line, write length-1 strings to output
  3.4 Keep last piece in some variable and append next readed line to it.

Надеюсь, моя идея ясна.

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