blob: 90b22ba186c0bf4545abb4250f87791b3791e1e8 [file] [edit]
// This file is part of ICU4X. For terms of use, please see the file
// called LICENSE at the top level of the ICU4X source tree
// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
#include <icu4x/GraphemeClusterSegmenter.hpp>
#include <icu4x/LineSegmenter.hpp>
#include <icu4x/SentenceSegmenter.hpp>
#include <icu4x/WordSegmenter.hpp>
#include <icu4x/Logger.hpp>
#include <iostream>
#include <string_view>
using namespace icu4x;
using std::cout;
using std::endl;
void print_ruler(size_t str_len) {
for (size_t i = 0; i < str_len; i++) {
if (i % 10 == 0) {
cout << "0";
} else if (i % 5 == 0) {
cout << "5";
} else {
cout << ".";
}
}
cout << endl;
}
template <typename Iterator>
void iterate_breakpoints(Iterator& iterator) {
while (true) {
int32_t breakpoint = iterator.next();
if (breakpoint == -1) {
break;
}
cout << " " << breakpoint;
}
cout << endl;
}
template <typename Iterator>
void iterate_word_breakpoints(Iterator& iterator) {
while (true) {
int32_t breakpoint = iterator.next();
if (breakpoint == -1) {
break;
}
cout << " " << breakpoint;
switch (iterator.word_type()) {
case SegmenterWordType::Value::None:
cout << " (none";
break;
case SegmenterWordType::Value::Number:
cout << " (number";
break;
case SegmenterWordType::Value::Letter:
cout << " (letter";
break;
default:
cout << " (unknown status";
break;
}
if (iterator.is_word_like()) {
cout << ", word-like";
}
cout << ")";
}
cout << endl;
}
void test_line(const std::string_view& str) {
const auto segmenter_auto =
LineSegmenter::create_auto();
const auto segmenter_lstm =
LineSegmenter::create_lstm();
const auto segmenter_dictionary =
LineSegmenter::create_dictionary();
const LineSegmenter* segmenters[] = {segmenter_auto.get(), segmenter_lstm.get(),
segmenter_dictionary.get()};
for (const auto* segmenter : segmenters) {
cout << "Finding line breakpoints in string:" << endl << str << endl;
print_ruler(str.size());
cout << "Line breakpoints:";
auto iterator = segmenter->segment(str);
iterate_breakpoints(*iterator.get());
}
}
void test_grapheme(const std::string_view& str) {
const auto segmenter = GraphemeClusterSegmenter::create();
cout << "Finding grapheme cluster breakpoints in string:" << endl
<< str << endl;
print_ruler(str.size());
cout << "Grapheme cluster breakpoints:";
auto iterator = segmenter->segment(str);
iterate_breakpoints(*iterator.get());
}
void test_word(const std::string_view& str) {
const auto segmenter_auto =
WordSegmenter::create_auto();
const auto segmenter_lstm =
WordSegmenter::create_lstm();
const auto segmenter_dictionary =
WordSegmenter::create_dictionary();
const WordSegmenter* segmenters[] = {segmenter_auto.get(), segmenter_lstm.get(),
segmenter_dictionary.get()};
for (const auto* segmenter : segmenters) {
cout << "Finding word breakpoints in string:" << endl << str << endl;
print_ruler(str.size());
cout << "Word breakpoints:";
auto iterator = segmenter->segment(str);
iterate_word_breakpoints(*iterator.get());
}
}
void test_word_with_options(const std::string_view& str) {
std::unique_ptr<Locale> locale = Locale::from_string("sv").ok().value();
const auto segmenter_auto =
WordSegmenter::create_auto_with_content_locale(*locale.get()).ok().value();
const auto segmenter_lstm =
WordSegmenter::create_lstm_with_content_locale(*locale.get()).ok().value();
const auto segmenter_dictionary =
WordSegmenter::create_dictionary_with_content_locale(*locale.get()).ok().value();
const WordSegmenter* segmenters[] = {segmenter_auto.get(), segmenter_lstm.get(),
segmenter_dictionary.get()};
for (const auto* segmenter : segmenters) {
cout << "Finding word breakpoints for sv in string:" << endl << str << endl;
print_ruler(str.size());
cout << "Word breakpoints:";
auto iterator = segmenter->segment(str);
iterate_word_breakpoints(*iterator.get());
}
}
void test_sentence(const std::string_view& str) {
const auto segmenter = SentenceSegmenter::create();
cout << "Finding sentence breakpoints in string:" << endl
<< str << endl;
print_ruler(str.size());
cout << "Sentence breakpoints:";
auto iterator = segmenter->segment(str);
iterate_breakpoints(*iterator.get());
}
void test_sentence_with_options(const std::string_view& str) {
std::unique_ptr<Locale> locale = Locale::from_string("el").ok().value();
const auto segmenter =
SentenceSegmenter::create_with_content_locale(*locale.get()).ok().value();
cout << "Finding sentence breakpoints for el in string:" << endl
<< str << endl;
print_ruler(str.size());
cout << "Sentence breakpoints:";
auto iterator = segmenter->segment(str);
iterate_breakpoints(*iterator.get());
}
int main(int argc, char* argv[]) {
Logger::init_simple_logger();
std::string_view str;
if (argc >= 2) {
str = argv[1];
} else {
str = "The 101 quick brown foxes jump over the lazy dog.";
}
test_line(str);
cout << endl;
test_grapheme(str);
cout << endl;
test_word(str);
cout << endl;
test_word_with_options(str);
cout << endl;
test_sentence(str);
cout << endl;
test_sentence_with_options(str);
cout << endl;
return 0;
}