LTAL, проект: Розрив слів
Ідея: Спроектуйте та впровадьте в Python алгоритм Кнута-Лянга для автоматичного переносу. Вам слід написати програму, яка читає список слів (наприклад, текст) і друкує ці слова із зазначенням дефісів, які вважаються законними, наприклад.:

Враховуючи, що повторне пізнання гідності всіх членів людської сім'ї та їх рівних і невід'ємних прав є основою свободи, справедливості та миру у світі,
Беручи до уваги, що ігнорування та ігнорування прав людини призвели до актів бар-барі, які відновлюють свідомість гуманності, і що поява світу, де люди будуть вільні говорити і вірити, вільні від терору та половинчастості, було проголошено найвищою ас-пі-рацією людини,
Враховуючи, що важливо захищати права людини за допомогою верховенства права, щоб людина не обмежувалась, у вищому повазі, повстанням проти тиранії та опозиції.,
Враховуючи, що дуже важливо сприяти розвитку дружніх відносин між націями,
Беручи до уваги, що в Хартії народи Організації Об'єднаних Націй знову проголосили свою віру в основоположні права людини, гідність і цінність людської особистості, рівність прав чоловіків і жінок, і що вони рішучі зробити просоціальну та ін-тау-рер кращими умовами життя при більшій свободі, .
Для своїх тестів візьміть деякі літературні тексти французькою мовою, над якими ми працювали, відмінні від "Декларації". Якщо ви бажаєте, порівняйте своє рішення з результатом JavaScript, зазначеним нижче. Деякі незначні відмінності можуть зберігатися, ви не оброблятимете винятки.
Вступ
Ось тест. Змініть ширину сторінки, перевірте, як змінюється заповнення рядка. (Тут система переносу вставляє HTML "умовний дефіс" у слова:, видимий лише тоді, коли відбувається перенос).
Методика порівняно складна, оскільки правила переносу часто бувають різнорідними, фонетичними, морфологічними та етимологічними (семантичними), за кількома винятками. В італійській мові домінує доволі механічний поділ на склади, евфонічний (вирізаний перед приголосною). Але в польській чи французькій мовах семантика фрагментів слів важливіша за склади, а правила більш ніж у десять разів більші.
Візерунки Лян
Місцеве правило може бути визнане недійсним іншим: трансамериканським, але трансакційним, та транс-портерним. Потім: mas-to-donte apos-trophe, але de-struc-tu-rer (і, на думку деяких, "апостроф" був погано вирізаний, оскільки "апо" і "строфа" - це морфологічні сутності).
Ідея полягає в тому, щоб зібрати (вручну або напівавтоматично) певну кількість (десятки або тисячі.) Шаблонів: комбінацій літер, де ми знаходимо, вкраплені, маленькі цілі числа: 1, 2, 3. Відсутність числа дорівнює нулю. Непарне число означає, що вирізання дозволено, парне - заборонено. Якщо візерунки заважають (декілька оголошених таким чином комбінацій є одним словом, там же - більша кількість "виграє").
Приклади французьких зразків: tran2s1o2, 1ni, .o4, 4fre., .dé3s2o3dé тощо. Крапка символізує початок або кінець слова. Так, наприклад, ми забороняємо розбивати перед тихим складом, що закінчує слово, cam-bre-mer, але room. Іноді ми зустрічаємо "культурні/психологічні" правила: невідповідність, але побудова, вгадайте чому.
Візерунки вам дадуть. У http://www.ctan.org/tex-archive/language/hyphenation/ ви знайдете списки шаблонів більшістю мов, придатних для TeX (або еквівалентних систем). Звичайно, список для французької мови. Місцево у вас є цей документ. Його формат не зручний, ми повернемося до подання шаблонів у вашій програмі; це частина вашої роботи.
Поріз
Ось поєднання слова та шаблонів: Останній рядок, який збирає цифри, зберігаючи максимум, дає відповідь на проблему відсічення. Відповідь - гіфентація .
Метод роботи
Підготовка візерунків
- Очистіть файл hyph-fr.tex, створіть файл, що містить лише шаблони: Використовуючи регулярні вирази, усувайте коментарі TeX: все, що починається з символу "%" до кінця рядка. Потім усуньте зайві пробіли. Нарешті, усуньте "\ pattern" і все.
Можливі оптимізації
Отже, одна з можливостей оптимізації полягає в наступному. Для кожного виявленого зразка відокремте лексичний фрагмент, видаліть цифри (але вони не забудуться). Таким чином e2n1i2vr перетвориться на п'яного. Цей "чистий" шаблон буде використовуватися як ключ у пошуковому словнику. Значення, пов’язані з ключами, використовуватимуть цифри та визначатимуть позиції правових пунктів переносу. Для кожного символу повного шаблону ми зберігаємо послідовність відповідних цифр, де їх позиції очевидні, якщо ми відновимо неявні нулі. Наприклад тощо. Доповніть словник таким чином. Список містить близько 1140 шаблонів, що сьогодні не є надмірним. (Але 30 років тому це було непросто.) Ви можете зберегти числовий список: [1, 0, 0] замість "100", що швидше, але вимагає більше пам'яті.
Краще, ми можемо зберігати словник із позиціями як ключі. Послідовність 02010200, пов'язана з 'enivr', представлена у вигляді словника .
Головна сцена
Ця частина програми зводиться до простого циклу у словнику шаблонів із оновленням списку/словника посад. Для кожного слова ми проходимо всі схеми, і ми накопичуємо позиції переносу з їхніми "вагами". В кінці процесу враховуються лише непарні ваги.
Увага.
-
Однією з помилок (не надто частою, але дратує) є задоволення одним поєднанням знайденого шаблону, хоча їх декілька. Отже, ваша програма може правильно вирізати слово відчужуване, але вона вирішує скоротити невідчужуваний таким чином, оскільки вона знаходить лише перше НС з двох у зв’язаному НС NA ble .
Перед основною фазою розрізу розгорніть слова з двох сторін: ". Перенос." . Це дозволить застосовувати початок/кінець шаблонів слів. Однак у наведеному остаточному рішенні усуньте "." .
Слова, що містять великі регістри, повинні бути перетворені в малу канонічну форму, інакше шаблони, завжди малі, можуть не вдатися.