Блоґ одного кібера

Історія хвороби контуженого інформаційним вибухом

Good news everyone! І ще дещо філологічне.

with 6 comments

Довжина інтервалу оцінювання: 48.0 днів
Початок роботи: 2011-10-02 06:28:44+00:00
Середня швидкість роботи: 3064.96094781 байт/день
Оцінка часу до завершення: 337.541701444 днів, 2012-10-20 19:50:27.004718+00:00

Тобто, якщо я продовжу в тому ж дусі, то менш ніж за рік, “Занурення в Python 3” вже можна буде загортати в симпатичну pdf-ку.

А поки що на ваш осуд виносяться мої перші розділи:

  • Встановлення. Його перекладала Bellatrix, за що я їй дуже вдячний, бо це один з найнудніших розділів. Я з ботом заливав картинки. Буду вдячний також, якщо хтось зробить .png скріншоти інсталяції на вінді. Власне й для інших систем їх варто б обновити.
  • Ваша перша програма
  • Регулярні вирази. Сьогодні тема про них.
  • Детальніше про ітератори. Мій улюблений розділ.
  • Стандартні типи даних поки що перекладається, але булеві, числа, списки, і кортежі вже описані. Залишились множини і словники, і окремий розділ про рядки.

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

І до речі, я поки читав переклад Пола Грема “Перемогти посередність”, винайшов Vim-патч. Суть його полягає в написанні під час читання поста команд для Vim виду:

:%s/з\([кптфх]\)/с\1/gc

Звісно мої були простіші, і полягали в заміні помилкового тексту на правильний, а те що вище – це реалізація правила “КаФе ПТаХ” в регулярних виразах Vim. Навіть думаю що треба якось собі написати маленький lint для української мови, благо колекцію типових шаблонів помилок скласти не так вже і складно. Для мене це інтерпрИтатор -> інтерпрЕтатор, і лабоЛаторна -> лабоРаторна. А зверху ще можна накласти лексичний аналіз, і створення ланцюжківа Маркова для окремих слів, і для послідовностей слів. Тобто – чим частіше одне слово йде за іншим – тим більша ймовірність що так і повинно бути. Деякі неправильні переходи можна штучно понизити в рейтингу. Якщо ми зустрічаємо якусь неймовірну послідовність, наприклад слово “инший” – підсвічуємо тим яскравішим кольором, чим ця послідовність неймовірніша.

Принаймі лексичний аналіз природньої мови я вже нарешті навчився робити:

#!coding=utf8
''' Ахтунг! Все ще Python 2 '''
import re
TOKENIZE_PATTERN = ur'([\w`-]+|[^\w\s])'
TOKENIZE_REGEX = re.compile(TOKENIZE_PATTERN, re.U)

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

if __name__=='__main__':
	text = u'''Філософськи, веб-сервіси HTTP можна описати як обмін даними з віддаленим сервером використовуючи лише засоби протоколу HTTP. Якщо ви хочете отримати дані з сервера - використовуйте HTTP GET. Якщо хочете відправити дані на сервер - HTTP POST. API деяких передових веб-сервісів також дозволяють створення, модифікацію та видалення даних за допомогою HTTP PUT, та HTTP DELETE. Це все. Ніяких регістрів, конвертів, обгорток, тунелювання. "Дієслова" вбудовані в протокол HTTP (GET, POST, PUT та DELETE) напряму пов’язані з операціями прикладного рівня для отримання, створення, модифікації та видалення даних.

рев’ю коду

Основна перевага такого підходу - простота, а простота зарекомендувала себе дуже популярною. Дані - зазвичай XML або JSON можуть зберігатись статично, чи генеруватись динамічно скриптом на стороні сервера, і всі основні мови програмування (включаючи Python звісно!) включать бібліотеку для доступу до них через HTTP. Зневадження також набагато простіше, бо так як кожен ресурс веб-сервісу має унікальну адресу в формі URL, ви можете просто відкрити його в веб-браузері щоб одразу побачити чисті дані.'''

	lexicon = set((word.lower() for word in tokenize(text)))
	print u', '.join((u'"%s"' % word for word in lexicon))

Тепер мене звісно починає хвилювати те, що мої апострофи не входять в стандартний клас \w для юнікоду. Про свої “дефіси” я взагалі мовчу. В мене вони відрізняються від тире тим, що навколо тире стоять прогалики, а від мінуса тим, що навколо мінуса стоять вирази. 🙂

Не вірю що тут заведеться такий Rosetta Code як в Данила, але трохи на це сподіваюсь. Задача складніша – описати певні помилки в тексті предикатом. А ще краще написати функцію, яка отримує текст з помилкою, а замість нього повертає текст без.

Advertisements

Written by bunyk

Листопад 19, 2011 at 23:51

Відповідей: 6

Subscribe to comments with RSS.

  1. 1. Тобто ідея – “знайшов помилку, напиши регексп який її виправить”?
    2. Ти хочеш статистичний аналіз на помилки чи словниковий?

    danbst

    Листопад 20, 2011 at 10:46

    • Ще трохи на дану тематику. Word представляє свій орфографічний двигун як API-сервіс, див. приклад тут http://www.codeproject.com/KB/cs/spellcheckdemo.aspx

      Плюси: не треба придумувати регекспів, взагалі нічого придумувати не потрібно. Орфографію виправляє правильно у 99.99%
      Мінуси: закритий код, важко розпізнає формули і погано реагує на вживання іноземних слів у перевіряємому тексті.

      danbst

      Листопад 21, 2011 at 09:56

      • Ага. Якщо я зможу прикрутити вордівські модулі до vim мені гарантована шнобелівська премія.

        Але “Можливо ви мали на увазі google spelling corrector“? До речі, тут F# як завжди крут.

        bunyk

        Листопад 21, 2011 at 21:52

      • Приблизно так я і уявлвяв – прикрутити через Wine до vim-у.

        А взагалі, так, я мав на увазі саме spelling corrector.

        danbst

        Листопад 21, 2011 at 22:20

  2. open System.IO
    open System.Text.RegularExpressions
    
    let fileToAnalyse = "nlp.txt"
    let analysisResultsFile = "out1.txt"
    let curdir = @"E:\dev\fsharp\nlp\"
    let lines = Path.Combine([| curdir; fileToAnalyse; |]) |> File.ReadLines
    
    let words = seq { for line in lines do
                         for aMatch in Regex.Split("[^\w'-]", line) do
                             yield aMatch } 
                |> Set.ofSeq |> Set.toSeq |> Seq.where (fun x -> not (x.Length = 0 || Regex.IsMatch(x, "[0-9]+")))
    
    File.WriteAllLines(Path.Combine([| curdir; analysisResultsFile; |]), words)
    printfn "File %s written successful" analysisResultsFile
    

    danbst

    Листопад 23, 2011 at 01:18

  3. […] P.S. Про лексичний аналіз української мови – читайте тут. […]


Залишити відповідь

Заповніть поля нижче або авторизуйтесь клікнувши по іконці

Лого WordPress.com

Ви коментуєте, використовуючи свій обліковий запис WordPress.com. Log Out / Змінити )

Twitter picture

Ви коментуєте, використовуючи свій обліковий запис Twitter. Log Out / Змінити )

Facebook photo

Ви коментуєте, використовуючи свій обліковий запис Facebook. Log Out / Змінити )

Google+ photo

Ви коментуєте, використовуючи свій обліковий запис Google+. Log Out / Змінити )

З’єднання з %s

%d блогерам подобається це: