1

Тема: Розбити текст на слова

Є текст. Якоюсь мовою. Або мовами. В Юнікоді. Потрібно знайти в ньому слова. Щоб потім наприклад порахувати. Або щоб зробити перекладач, над яким думають в іншій темі. Просто розбити по пробілах не вийде, бо є ще розділові знаки.

Тут щось пишуть про те як це зробити: http://www.unicode.org/reports/tr29/ , але я не в'їжджаю...

Взагалі, можна було б виділяти слова регулярним виразом "\w+", але ж є апострофи і дефіси. Тому "[\w`-]", якщо якесь падло не поставить інший апостроф, або якийсь правильний символ дефіса замість мінуса.

P.S. А може завести розділ для мовно-незалежних проблем?

2

Re: Розбити текст на слова

Взагалі-то, після розділових знаків переважно теж кладуть пробіл, принаймі, мали би. Варіант:
1) зробити реплейс всі розділових знаків на пробіли.
2) поки є подвійний пробіл замінити його на одинарний.
3) розбити на слова через пробіл.

3

Re: Розбити текст на слова

bunyk написав:

Є текст. Якоюсь мовою. Або мовами. В Юнікоді. Потрібно знайти в ньому слова. Щоб потім наприклад порахувати. Або щоб зробити перекладач, над яким думають в іншій темі. Просто розбити по пробілах не вийде, бо є ще розділові знаки.

Тут щось пишуть про те як це зробити: http://www.unicode.org/reports/tr29/ , але я не в'їжджаю...

Взагалі, можна було б виділяти слова регулярним виразом "\w+", але ж є апострофи і дефіси. Тому "[\w`-]", якщо якесь падло не поставить інший апостроф, або якийсь правильний символ дефіса замість мінуса.

P.S. А може завести розділ для мовно-незалежних проблем?

Як щодо складної регулярки з усіма можливими знаками пунктуації та білосимволами (\w)?

З.І: Розділ "Інше" підійшов би. А так - ідея розділу для кросс-платформового програмування цікава. Власне, він би відчутно перегукувався з тематикою алгоритмізації, яка не залежить від мови.

I belong to the Dead Generation.

4

Re: Розбити текст на слова

Vo_Vik написав:

Взагалі-то, після розділових знаків переважно теж кладуть пробіл, принаймі, мали би.

А деякі нехороші люди ще і перед, але біда не в тому, пробіл можна запросто зарахувати до розідлових знаків.


Vo_Vik написав:

Варіант:
1) зробити реплейс всі розділових знаків на пробіли.
2) поки є подвійний пробіл замінити його на одинарний.
3) розбити на слова через пробіл.

Простіше розбити всі слова через пробіл і інші розділові знаки.

Але проблема глобальніша - які символи включати до слів, а які до розділових знаків?

Крім пробілів зокрема варто не забути \t, \n, \r, nbsp і всякі інші які підходять під регулярний вираз \s. Складніше з розділовими знаками. Бо перелічивши всі знаки в українській, ми забуваємо що в іспанців є наприклад "¿¡". І є ще одна проблема. Навіть якщо ми забудемо про те що якийсь розумник може вставити знак іронії: "⸮", то треба врахувати те що всякі там наголоси потрібно просто видалити зі слова не розбиваючи його на частини. Як і http://en.wikipedia.org/wiki/Double_grave_accent у всяких там сербів напевне...

Подякували: miroslav.chandler1

5

Re: Розбити текст на слова

Bartash написав:

Як щодо складної регулярки з усіма можливими знаками пунктуації та білосимволами (\w)?

Так от питання в тому як написати складну регулярку. ;)

6

Re: Розбити текст на слова

Можна спробувати напролом - перерахунком можливих символів: "([\t\r\n\v\f,.:;?!]+)".
Або ж, навпаки, інверсією: "будь-що, крім літер", як от: "([^ A-Za-z -]+)".

Тут слід враховувати, що на практиці можуть трапитися різні випадки, тому у процесі розробки варто передбачити як наявність достатньої кількості "тестових" рядків для перевірки, так і можливість оперативного втручання у регулярку у разі виявлення помилки.

I belong to the Dead Generation.

7

Re: Розбити текст на слова

Bartash написав:

Або ж, навпаки, інверсією: "будь-що, крім літер", як от: "([^ A-Za-z -]+)".

Ну, мій приклад в першому повідомленні куди загальніший, [\w`-] бо враховує ще й апостроф, якщо звісно правильно враховує.

Можна обрати цей варіант, але як тоді бути з наголосами і іншими виокремленими надрядковими знаками?

8

Re: Розбити текст на слова

Ні, ну я розумію що я придираюсь, і методом проб та помилок я знайду якийсь прийнятний в моїй задачі спосіб. Але невже не існує глобального рішення? (Певне треба буде ще на StackOverflow запитатись).

9

Re: Розбити текст на слова

bunyk написав:

Ну, мій приклад в першому повідомленні куди загальніший, [\w`-] бо враховує ще й апостроф, якщо звісно правильно враховує.

Можна обрати цей варіант, але як тоді бути з наголосами і іншими виокремленими надрядковими знаками?

Апостроф варто вважати частиною слова у даному випадку, оскільки без нього воно втратить первісний зміст.
Наголос та інша кухня: а як їх розмістити у неформатованому тексті?

I belong to the Dead Generation.

10

Re: Розбити текст на слова

З.І:

Подяка Replace за виокремлення розділу:).

I belong to the Dead Generation.

11

Re: Розбити текст на слова

можна глянути в специфікацію utf-8, де там спец символи йдуть, а де букви.

ПС: "букви з наголосами"-там такі ж букви як і всі інші.

12 Востаннє редагувалося funivan (13.12.2012 22:13:30)

Re: Розбити текст на слова

Ось моя логіка і як я роблю.
В першу чергу розбиваю по пробілах.
Дальше маємо масив який треба профільтрувати.
Біжимо по масиву трімаємо зліва і справа, тобто будуть такі перетворення

,слово - слово
кома,  - кома

Якщо зліва або справа 1н симол не українська літера значить грохаємо його і так до того часу поки не знайдемо український символ або довжина слова = 0
Ось як на мене ідеальний алгоритм.
;) Зауваження вітаються))

P.s.букви з наголосами варто замінювати на нормальні))

13

Re: Розбити текст на слова

Гррр. Немає букв з наголосом, є окремий символ наголосу, який ставиться після букви, як у рядку: "На́голос або акце́нт".


І окремо обробляти пробіли немає сенсу, бо пробіли це занадто просто (ви забуваєте що невидимих символів набагато більше.

Ось як я робив:

TOKENIZE_PATTERN = r'([\w`-]+|[^\w\s]|\s+)'
TOKENIZE_REGEX = re.compile(TOKENIZE_PATTERN)

def tokenize(text):
    return (s.groups()[0] for s in TOKENIZE_REGEX.finditer(text))

Функція tokenize дасть нам ітерацію по словах, пропусках і розділових знаках, як окремих токенах. При чому токени розділових знаків завжди будуть односимвольними, а серії пропусків (наприклад " \r\n\t") і слова - довільної довжини.

Символ наголосу як і апостроф напевне варто буде внести до складу слова на час розбиття, і видалити опісля.

14

Re: Розбити текст на слова

Якщо уже мова зайшла про іспанців, то потрібно сходити на http://www.unicode.org/charts/ і злякатися. А потім шукати нормальну бібліотеку підтримки юнікоду, бо усілякі регулярки у цьому випадку - то дитячі пустощі.

15

Re: Розбити текст на слова

Ще непоганим було би сісти і записати на аркуші паперу усі вимоги, що висуватимуться до програми (включно з типом та характером даних). Потім скріпити "документ" підписом та печаткою, прикріпити на стіну - і тоді уже міркувати щодо реалізації. :)

I belong to the Dead Generation.

16

Re: Розбити текст на слова

Гррр. Немає букв з наголосом, є окремий символ наголосу, який ставиться після букви, як у рядку: "На́голос або акце́нт".

http://symbolcodes.tlt.psu.edu/bylanguage/french.html - при встановленій французькій розкладці, оце все набирається одною клавішою. Китайські ієрогліфи набираються кількома клавішами, але все ж вони не будуть розділовими знаками. Не треба плутати методи набору з тим як воно зберігається в пам’яті.

17

Re: Розбити текст на слова

Bartash написав:

Ще непоганим було би сісти і записати на аркуші паперу усі вимоги, що висуватимуться до програми (включно з типом та характером даних). Потім скріпити "документ" підписом та печаткою, прикріпити на стіну - і тоді уже міркувати щодо реалізації. :)

Хочу скачати дамп вікіпедії, викинути форматування, порахувати кожне слово, відсортувати за частотою, потім вивести тисячу перших, і обчислити який відсоток тексту вони дозволяють розуміти. І так для англійської, німецької, української, французької, іспанської, польської і можливо ще якихось інших... Було б круто якби для всіх.

Подякували: Bartash1

18

Re: Розбити текст на слова

bunyk написав:

Хочу скачати дамп вікіпедії, викинути форматування, порахувати кожне слово, відсортувати за частотою, потім вивести тисячу перших, і обчислити який відсоток тексту вони дозволяють розуміти. І так для англійської, німецької, української, французької, іспанської, польської і можливо ще якихось інших... Було б круто якби для всіх.

Цікава ідея.
Думаю, у даному разі алгоритм обробки тексту має бути схожий, відмінності хіба у наборах символів (знову-таки, є статті, що містять слова з кількох мов водночас - можуть бути граблі). Як варіант - створення деякого асоціативного масиву (чи таблиці у БД) з ключем - мовою та значенням - набором символів, дозволених у словах, наприклад.

З.І: збереження слів теж було би доцільним робити у БД, враховуючи їхню загальну кількість та подальші операції.

I belong to the Dead Generation.

19

Re: Розбити текст на слова

Якщо йдеться про статистику на великому надорі даних, то можна використовувати найпростішу регулярку. Похибка буде невеликою, а швидкодія значно зросте.