Моя проблема связана с обработкой естественного языка (NLP) и разбиением входных строк на логические группы.
Для упрощения я имею в виду вектор структур данных Token, каждая из которых содержит строковое значение тега, помимо прочего.
class Token
{
public:
std::string tag;
std::string word;
// other stuff;
};
std::vector<Token> input_tokens;
typedef std::vector<Token>::iterator tok_iter;
Я также формирую объединенную строку значений ‘tag’, взятых из каждого токена в векторе, который выглядит следующим образом:
std::string pos_tags = "DT JJ NN NN IN RB JJ NN DT";
Я заинтересован в формировании фрагментов JJ (прилагательное) и NN (существительное) только для
В приведенном выше примере pos_tags было бы два соответствующих блока:
«JJ NN NN», «JJ NN»
Можно ли выполнить своего рода регулярное выражение над строкой pos_tags, чтобы каждое совпадение регулярного выражения представляло диапазон токенов во входном наборе токенов (input_tokens), откуда он пришел? Другими словами, каждый сформированный фрагмент не является строкой, а представлен начальными и конечными итераторами.
В идеале я хотел бы сохранить найденные совпадения в виде вектора boost :: iterator_range, где каждый диапазон представляет начало / конец каждого найденного фрагмента, что-то вроде этого:
std::vector< boost::iterator_range<tok_iter> > chunks;
Я надеюсь это имеет смысл. Я не обязательно ищу полный код, но намекает на то, как использовать регулярные выражения (я новичок) таким образом.
Задача ещё не решена.
Других решений пока нет …