Разбить предложение на слова, содержащие апостроф - PullRequest
1 голос
/ 18 апреля 2020

Предположим, у меня есть группа слов в качестве предложения:

Aujourd'hui séparer l'élément en deux

И хочу, чтобы результат был как отдельные слова (после раскола):

Aujourd'hui | séparer | л '| элемент | en | deux

Примечание: Как вы можете видеть, «aujourd'hui» - это одно слово.

Что было бы лучшим регулярным выражением для использования здесь?


С моими текущими знаниями я могу достичь только этой базовой операции c:

QString sentence("Aujourd'hui séparer l'élément en deux");
QStringList list = sentence.split(" ");

Вывод:

Aujourd'hui / Séparer / l'élément / en / deux

Вот два вопроса ближе всего к моему: это и это .

Ответы [ 4 ]

1 голос
/ 18 апреля 2020

Поскольку сокращения, которые вы хотите рассматривать как отдельные слова, обычно представляют собой одну букву + апостроф на французском языке (например, l'huile, n'en, d'accord), вы можете использовать шаблон, который соответствует 1+ пробелам. или место, которому непосредственно предшествует начало слова, затем 1 буква, а затем апостроф.

Я также предлагаю учесть фигурные апострофы. Итак, используйте

 \s+|(?<=\b\p{L}['’])\b

См. Демонстрационную версию regex .

Подробности

  • \s+ - 1+ пробелов
  • | - или
  • (?<=\b\p{L}['’])\b - положение границы слова (\b), которому предшествуют начало слова (\b), буква (\p{L}) и ' или .

In Qt, вы можете использовать

QStringList result = text.split(
     QRegularExpression(R"(\s+|(?<=\b\p{L}['’])\b)", 
        QRegularExpression::PatternOption::UseUnicodePropertiesOption)
);

R"(...)" - это необработанная строковая литеральная нотация, вы можете использовать "\\s+|(?<=\\b\\p{L}['’])\\b", если вы используете среду C ++, которая не допускает необработанные строковые литералы.

1 голос
/ 18 апреля 2020

Я не знаю C ++, но думаю, что он поддерживает отрицательный взгляд назад.

Попробуйте:

(?: |(?<!\w{2})')

Это разделит пробел или апостроф, если нет 2 букв до.

Демонстрация и объяснение

1 голос
/ 18 апреля 2020

Ну, здесь вы имеете дело с естественным языком, и первая, и самая сложная, проблема, на которую нужно ответить: вы можете придумать фиксированное правило, когда должно произойти расщепление? В данном конкретном случае на самом деле нет логической причины, по которой французский считает «aujourd'hui» одним словом (когда логически оно может быть проанализировано как «au jour de hui»).

I'm не знаком со всеми возможными ловушками на французском языке, но если вы действительно хотите, чтобы охватить все неясные случаи, вам придется искать токенизатор на естественном языке.

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

sentence.split(QRegularExpression("(?<![\\w][\\w])'"));
1 голос
/ 18 апреля 2020

Не уверен, что я понял, что вы говорите, но это может помочь вам

QString sentence("Aujourd'hui séparer l'élément en deux");
QStringList list = sentence.split(" '");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...