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

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

Словник транслітерації імен

leave a comment »

Задача: пройтись по інтервікісловнику, вияснити які статті пишуть про людей, тобто мають заголовки виду “Прізвище Ім’я”, розділити ці заголовки на дві частини, і таким чином можливо трохи скоротити словник. За одно отримати словник транслітерацій імен і прізвищ.

Для цього:

  1. За назвою статті шукаємо об’єкт в Freebase який з нею пов’язаний.
  2. Шукаємо типи цього об’єкта. Якщо він має тип /peoples/person, значить це людина (правда на жаль тільки реально існуюча, тому якогось там Індіану Джонса доведеться вводити вручну). Та все одно це простіше.
  3. Якщо це не людина виходимо.
  4. Розбиваємо назви на слова.
  5. Дивимось кількість слів в англійському та українському написанні. Якщо вона різна – виходимо.
  6. Питаємо користувача чи не переплутаний порядок слів. Якщо переплутаний – виходимо.
  7. Дивимось чи немає вже таких транслітерацій в словнику. Якщо є – питаємо користувача яка краща. (Чи може краще додавати альтернативний варіант? Чи видаляти обидві, щоб потім перекладалось тільки вручну?)

Функція перевірки на “людськість”:

 
personquery = {
        "key":[{"namespace":"/wikipedia/en", "value":None}],
        "type":[]
}

def is_person(article_name):
        if article_name.find(":")!=-1:
                return False
        personquery["key"][0]["value"]=upper1(article_name.replace(" ","_") )
        # Not shure that this is real transformation name -> link
        try:
                res = freebase.mqlread(personquery)
        except MetawebError:
                return False
        if res:
                return "/people/person" in res["type"]
        else:
                return False

Що таке "namespace":"/wikipedia/en" читайте тут.

>>> is_person("Linus Thorvalds")
False
>>> is_person("Linus Torvalds")
True
>>> is_person("Indiana Jones")
False
>>> is_person("Banksy")
True
>>> is_person("Bunyk Taras")
False

Звісно останній результат мене дещо засмучує :), але при складанні словника помилки типу false negative не призводять до жодних помилок в ньому. Хіба що він буде дещо неповним, але він за самим означенням вікіпедії завжди буде неповним.

Гірше те, що я щойно виявив false positive. Хтось дав в Freebase буддизму тип /people/person. Навіщо?

Проблема в тому, що запити до віддаленої бази даних – це найвузькіше місце в програмі. За 124 секунди робиться трохи більше 150 запитів, відповідно щоб зробити 150 000 запитів треба в тисячу разів більше секунд. Програма запускалась двічі, і один раз на цілу ніч. Зате тепер маю список, в якому з великою ймовірністю імена людей (upd: і в ньому якісь проблеми з ключами :( ).

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

Ivan Bahrianyi Багряний Іван Павлович
Levko Revutsky Ревуцький Лев Миколайович
Yaroslav I the Wise Ярослав Мудрий
Ivan Franko Франко Іван Якович
Lesya Ukrainka Леся Українка
Sergey Alexeyevich Lebedev Лебедєв Сергій Олексійович
Volodymyr Kostyantynovych Vysokovych Високович Володимир Костянтинович
Pavlo Zahrebelnyi Загребельний Павло Архипович
Dmitri Mendeleev Менделєєв Дмитро Іванович
Maria Sokil Марія Іванівна
Eugen Slutsky Слуцький Євген Євгенович
Nikolay Sklifosovsky Скліфосовський Микола Васильович
Zenon Snylyk он
Gerry Adams Джеррі Адамс
Fyodor Sologub Сологуб Федір Кузьмич
Opanas Slastion Сластіон Опанас Георгійович
Yakym Somko Яким Сомко
Danylo Skoropadskyi Скоропадський Данило Павлович
Hadrian Адріан (римський імператор)
Solon Солон

А деякі інтервікі взагалі пошкоджені :(.

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

P.S. В рунеті час від часу мелькав наклеп на те, що Curses не мають підтримки Юнікоду. Але насправді всьо чотко:

 
#!coding:utf-8
import locale # for proper curses unicode support
locale.setlocale(locale.LC_ALL,"")

Written by bunyk

16 Травня, 2011 at 06:44

Опубліковано в Кодерство, Павутина

Tagged with ,

Залишити коментар

Цей сайт використовує Akismet для зменшення спаму. Дізнайтеся, як обробляються ваші дані коментарів.