Токенизация с использованием boost дает тот же результат - PullRequest
0 голосов
/ 24 октября 2018

Я хочу маркировать много бирманского текста.Поэтому я попытался использовать токенайзер boost.

Текст, который я пробовал, - ျခင္းခတ္ခဲ့တာလို႕, и он должен быть токенизирован до ျခင္း и င္းျခင္း, но он просто выводит данные.Есть ли что-то, что я делаю неправильно?

    #include<iostream>
    #include<boost/tokenizer.hpp>
    #include<string>

    int main(){
        using namespace std;
        using namespace boost;
        string s = "ျခင္းခတ္ခဲ့တာလို႕";
        tokenizer<> tok(s);
        for(tokenizer<>::iterator beg=tok.begin(); beg!=tok.end();++beg){
                cout << *beg << "\n";
        }
    }

Выход должен разбиваться на серию токенов, таких как: ျခင္း и ခတ္ခဲ့တာလို႕, но в настоящее время выход равен входному.

Я хочу разбить это на последовательность токенов с границами слов, если это возможно.

1 Ответ

0 голосов
/ 25 октября 2018

Я не понимаю этот язык, но обнаружение границ слов, как правило, не токенизация.

Вместо этого используйте Boost Locale's Boundary Analysis

Пример:

using namespace boost::locale::boundary;
boost::locale::generator gen;
std::string text="To be or not to be, that is the question."
// Create mapping of text for token iterator using global locale.
ssegment_index map(word,text.begin(),text.end(),gen("en_US.UTF-8")); 
// Print all "words" -- chunks of word boundary
for(ssegment_index::iterator it=map.begin(),e=map.end();it!=e;++it)
    std::cout <<"\""<< * it << "\", ";
std::cout << std::endl;

Напечатает

"To", " ", "be", " ", "or", " ", "not", " ", "to", " ", "be", ",", " ", "that", " ", "is", " ", "the", " ", "question", ".",

И это предложение "生きるか死ぬか、それが問題だ。" будет разбито на следующие сегменты в ja_JP.UTF-8 (японском) локали:

"生", "きるか", "死", "ぬか", "、", "それが", "問題", "だ", "。", 

DEMO

Демонстрация с использованием текста ОП и локали my_MM:

Live On Coliru

#include <boost/range/iterator_range.hpp>
#include <boost/locale.hpp>
#include <boost/locale/boundary.hpp>
#include <iostream>
#include <iomanip>

int main() {
    using namespace boost::locale::boundary;
    boost::locale::generator gen;
    std::string text="ျခင္းခတ္ခဲ့တာလို႕";

    ssegment_index map(word,text.begin(),text.end(),gen("my_MM.UTF-8")); 

    for (auto&& segment : boost::make_iterator_range(map.begin(), map.end()))
        std::cout << std::quoted(segment.str()) << std::endl;
}

Печать

"ျ"
"ခ"
"င္း"
"ခ"
"တ္"
"ခဲ့"
"တာ"
"လို႕"

Это может или не может быть тем, что ожидает OP.Обратите внимание, что вам может потребоваться сгенерировать / установить соответствующий язык (и) в вашей системе, чтобы он работал должным образом.

...