Pages

Friday, March 2, 2012

Визначення мови, якою написаний матеріал

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

Як же можна визначити мову документу? Найпростіший спосіб - якщо мова має якісь специфічні та властиві лише їй символи (українська літера є чи ї, російська літера ы). Але, навіть у цьому випадку, теоретично, може зустрітися текст, який не містить таких літер-маркерів.

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

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

Цей підхід я перевірив на наборі текстів українською і російською мовою. Алгоритм помилився в 3 випадках на 20 тисяч статей.

Friday, February 24, 2012

Стемування українських слів з допомогою python і словників openoffice



Встановлюємо залежності:

sudo apt-get install hunspell libhunspell libhunspell-dev myspell-uk
sudo pip install -e svn+http://pyhunspell.googlecode.com/svn/trunk/#egg=pyhunspell


В консолі python: 

>>> import hunspell
>>> hobj = hunspell.HunSpell('/usr/share/hunspell/uk_UA.dic', '/usr/share/hunspell/uk_UA.aff')
>>> print hobj.stem('маму')[0]
мама

Інші ніштяки:


>>> print hobj.spell('маме')
False
>>> print hobj.spell('мамо')
True

>>> for i in hobj.suggest('маме'):
...     print i
... 
мам
мама
маже
мами
мамі
мале
мамо
саме
мате
маму
Мамай
макраме
мадер
марен


Ще

Thursday, February 16, 2012

Websocket, Rabbitmq, Tornado

Стомився бороти постійно неробочий websocket транспорт в ActiveMQ/HornetQ і наваляв маленький власний тестовий шлюзик ws2rabbitmq. Швидше пруф, що це можна зробити за пару годин. Пруф вийшов досить робочим.

Отже, може кому стане у нагоді: https://github.com/frutik/test-rabbitmq-websocket-gw


Sunday, November 27, 2011

Вийшов SOLR 3.5

Прес-реліз тут - http://lucene.apache.org/#27+November+2011+-+Lucene+Core+3.5.0+and+Solr+3.5.0+Available

Я б хотів відмітити тільки одне - 'Added support for Hunspell stemmer'. Тепер ви можете повнотекстовий пошук для довільної мови з коробки

Friday, July 8, 2011

Простий ETL tool

Інколи виникає потреба взяти якісь дані з однієї бази даних і перенести їх в іншу. Поки така потреба виникає лише інколи, можна цілком обходитися консольним клієнтом самої СУБД.

Проблема виникає, якщо дані потрібно переносити:

  • регулярно
  • в СУБД іншого типу (mysql -> postgresql) 
  • з не СУБД в СУБД (csv -> sql)
  • якось модифікувати дані при переносі 

Sunday, June 26, 2011

В публічному доступі існує гарна база стартапів http://www.crunchbase.com/. Вам доступна купа корисної інформації про ту чи іншу технологічну компанію.

Також існує набір скриптів, який дозволяє завантажити дані у форматі, придатному для подальшого аналізу - https://github.com/petewarden/crunchcrawl

Чим ми власне і зайнялися цієї неділі. Результати більш професійного аналізу з допомогою R будуть пізніше в блозі моєї дружини (ми вирішили провести два незалежних дослідження і пізніше порівняти висновки).

Одже, для дослідження я вибрав з повної бази в 60 тисяч проектів ті, які отримали хоч якесь фінансування, і проаналізувати саме їх. Крім того вибірку було обмежено групами, в які потрапило не меншще 50 проектів



crunchbase=# select country_code, count(*), min(amount_raised::float) / 1000 as min, max(amount_raised::float) / 1000 as max, median(amount_raised::float::int8)::int8 / 1000 as median, stddev(amount_raised::float) from org where amount_raised::float > 0 group by country_code having count(*) > 49 order by median desc;
 country_code | count | min |   max   | median |      stddev      
--------------+-------+-----+---------+--------+------------------
 CHN          |   162 |   7 |  478000 |  12000 | 54822859.7331082
 USA          |  7936 |   1 | 5620000 |   6972 | 81810808.5188822
 IND          |   162 |   6 |  300000 |   6555 | 30929815.0756823
 CHE          |    77 |  10 |  515000 |   5600 | 69345180.8354862
 CAN          |   345 | 1.2 |  350000 |   5000 | 24191815.1134509
 ISR          |   282 |  20 |  115000 |   4300 | 14798301.8257697
 IRL          |    64 |  70 |   50250 |   3900 | 8616604.81320482
 DNK          |    58 |  10 |  160400 |   3865 |  28943480.142572
 DEU          |   154 |  15 |  158700 |   3185 | 18653788.5816171
 GBR          |   526 |  10 | 1275000 |   3035 | 63979428.8180331
 FRA          |   306 |  50 |  149000 |   2935 | 12570166.9277194
 SWE          |   104 |  35 |   79960 |   2595 | 9937558.03216955
 ESP          |    83 |  15 |  218400 |   1930 | 25105973.5354224
 AUS          |    67 |   7 |   90000 |   1800 | 14347652.0292516
(14 rows)



Одже:

  • за найвищою ціною продано американський проект (5 млрд долларів - цікаво що це було??? - треба порити)
  • в загальному більші кошти отримують китайські (медіана 12 мільйонів доларів) і американські (медіана 7 мільйонів доларів) проекти 
  • в той самий час середнє відхилення (хаотичність оцінки проектів) найвища в америці.  


crunchbase=# select category_code, count(*), min(amount_raised::float) / 1000 as min, max(amount_raised::float) / 1000 as max, median(amount_raised::float::int8)::int8 / 1000 as median from org where amount_raised::float > 0 group by category_code having count(*) > 49 order by 5 desc;
  category_code   | count |  min  |    max     | median 
------------------+-------+-------+------------+--------
 semiconductor    |   335 |    35 |     540000 |  13500
 biotech          |  1300 |    10 |     598000 |  12086
 cleantech        |   516 |    10 |    1200000 |  12000
 network_hosting  |   277 |    10 |     300000 |   9400
 security         |   158 |    25 |     565000 |   8050
 hardware         |   451 |   1.1 |     409900 |   7650
 enterprise       |   429 |     5 |     217930 |   7000
 mobile           |   638 |     1 |    5620000 |   6000
 advertising      |   424 |   1.5 |     248000 |   5750
 public_relations |   372 |    10 |     283000 |   5735
 software         |  2219 |     5 |    1275000 |   5387
 consulting       |   131 |     3 |     100000 |   4575
                  |   597 | 2.667 |     260000 |   4000
 other            |   501 |     1 |     495000 |   4000
 games_video      |   580 |     5 |     519000 |   4000
 search           |   137 |     2 |     223000 |   4000
 web              |  1443 |   1.2 |    2335700 |   3000
 ecommerce        |   407 |   2.5 | 503751.458 |   2520
(18 rows)




  • Не дивно, що "піднятися" найвища імовірність на напівпровідниках і  біотехнологіях.
  • Найтяжче заробити на є-комерсі. Але саме там відбулася найдорожча продажа.
В голові крутиться кілька більш цікавих досліджень. Спробую їх реалізувати ближчим часом, якщо поточні справи не закрутять...