Словник транслітерації імен
Задача: пройтись по інтервікісловнику, вияснити які статті пишуть про людей, тобто мають заголовки виду “Прізвище Ім’я”, розділити ці заголовки на дві частини, і таким чином можливо трохи скоротити словник. За одно отримати словник транслітерацій імен і прізвищ.
Для цього:
- За назвою статті шукаємо об’єкт в Freebase який з нею пов’язаний.
- Шукаємо типи цього об’єкта. Якщо він має тип /peoples/person, значить це людина (правда на жаль тільки реально існуюча, тому якогось там Індіану Джонса доведеться вводити вручну). Та все одно це простіше.
- Якщо це не людина виходимо.
- Розбиваємо назви на слова.
- Дивимось кількість слів в англійському та українському написанні. Якщо вона різна – виходимо.
- Питаємо користувача чи не переплутаний порядок слів. Якщо переплутаний – виходимо.
- Дивимось чи немає вже таких транслітерацій в словнику. Якщо є – питаємо користувача яка краща. (Чи може краще додавати альтернативний варіант? Чи видаляти обидві, щоб потім перекладалось тільки вручну?)
Функція перевірки на “людськість”:
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: і в ньому якісь проблеми з ключами :( ).
А ще проблема в тому, що в цьому списку не всі імена записані в одному порядку:
А деякі інтервікі взагалі пошкоджені :(.
Тому, треба придумати якийсь зручний менюшний curses інтерфейс для побудови цього словника, і сісти за кілька(десятків?) годин через нього все прогнати.
P.S. В рунеті час від часу мелькав наклеп на те, що Curses не мають підтримки Юнікоду. Але насправді всьо чотко:
#!coding:utf-8 import locale # for proper curses unicode support locale.setlocale(locale.LC_ALL,"")
Залишити коментар