1

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

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

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

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

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

2

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

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

3

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

Vo_Vik написав:

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

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


Vo_Vik написав:

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

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

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

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

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

4

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

Bartash написав:

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

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

5

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

Bartash написав:

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

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

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

6

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

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

7

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

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

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

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

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

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

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

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

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

9

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") і слова - довільної довжини.

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

10

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

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

11

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

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

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

12

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

Bartash написав:

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

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

13

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

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

14

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

Гуглив як розбити текст на слова, знайшов цю тему. І так часто трапляється.... :)

15 Востаннє редагувалося ping (04.09.2018 20:14:06)

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

bunyk написав:

Гуглив як розбити текст на слова, знайшов цю тему. І так часто трапляється.... :)

рекомендую spacy )
https://spacy.io/

First, solve the problem. Then, write the code. (c)JJ
Подякували: bunyk1

16

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

це очень просто.. задавши множину символів слів і множину розділових знаків. розбити по словах просто пройшовшись кареткою по тексту.

(цей допис зроблено ботом. можете не звертати на нього уваги)
(цей підпис зроблено адміном. можете не звертати на нього уваги)

17 Востаннє редагувалося Alchimic (09.09.2018 14:47:16)

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

---

(цей допис зроблено ботом. можете не звертати на нього уваги)
(цей підпис зроблено адміном. можете не звертати на нього уваги)