суббота, 27 ноября 2010 г.

Морфологический словарь - Форум о поисковых системах

Морфологический словарь - Форум о поисковых системах

Морфологический словарь русского языка (словарь словоформ) можно скачать

Морфологический словарь русского языка (словарь словоформ) можно скачать

Плати.ру. Пароль для архива, в котором Морфологический словарь

Плати.ру. Пароль для архива, в котором Морфологический словарь

Морфологический словарь

Морфологический словарь
тест

Спеллчекер простой, доработанный

ОРИГИНАЛ ТУТ
http://www.linguis.ru/art/spell


Спеллчекер простой, доработанный

Как то понадобилось сделать проверку орфографии для вводимых поисковых запросов. При этом хотелось скопировать поведение поисковиков, которые на запрос "ашипка" выдадют: Возможно, вы имели в виду: ошибка. В недолгих поисках наткнулся на статью Питера Норвига, в которой описывается Spellcheker на питоне размером в 30 строк кода. В этой статье показывается, каким образом его можно доработать, чтобы:
  • спеллчекер проверял слова на нескольких языках (здесь, на русском и английском);
  • выявлял ошибки неверной раскладки (jib,rf -> ошибка).

Предыстория

Для полноты рассказа, привожу оригинальный код, взятый с сайта Питера Норвига.

import re, collections      def words(text): return re.findall('[a-z]+', text.lower())       def train(features):         model = collections.defaultdict(lambda: 1)         for f in features:             model[f] += 1         return model      NWORDS = train(words(file('big.txt').read()))      alphabet = 'abcdefghijklmnopqrstuvwxyz'      def edits1(word):        s = [(word[:i], word[i:]) for i in range(len(word) + 1)]        deletes    = [a + b[1:] for a, b in s if b]        transposes = [a + b[1] + b[0] + b[2:] for a, b in s if len(b)>1]        replaces   = [a + c + b[1:] for a, b in s for c in alphabet if b]        inserts    = [a + c + b     for a, b in s for c in alphabet]        return set(deletes + transposes + replaces + inserts)      def known_edits2(word):         return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in NWORDS)      def known(words): return set(w for w in words if w in NWORDS)      def correct(word):         candidates = known([word]) or known(edits1(word)) or known_edits2(word) or [word]         return max(candidates, key=NWORDS.get)       
Не буду описывать код деталях: любой желающий сможет прочесть оригинальную статью, либо ту же в русском переводе. Если кратко, работа спеллчекера состоит из трех шагов:
  1. Формируется модель языка. Фактически, это словарь, ключами которого являются допустимые слова языка, а значениями - количество повторений каждого из слов в неком эталонном наборе текстов (корпусе языка).
  2. Для проверяемого слова составляется множество из всех возможных слов для замены. Это делается с помощью четырех преобразований: удаления, вставки, замены и перестановки.
  3. В финале, каждый кандидат из построенного множества слов проверяется на наличие в словаре. При этом, выбирается наиболее вероятное слово (т.е. то слово, которое чаще всего встречается в корпусе).

Ошибки ввода текста для русского и английского

Заставить спеллчекер говорить по-русски не составит труда: нужно просто заменить алфавит на русский и использовать русский корпус. Однако, нам необходимо два языка: спеллчекер должен исправлять как русские слова, так и английские.
Один из вариантов решения - расширить английский алфавит русскими буквами: alphabet = 'abcd...абвгд...'. Но этот вариант ведет к побочному эффекту: при формировании кандидатов формируется много лишних слов. К примеру преобразование типа "замены" для слова "карова" даст нам следующие варианты с английской буквой 'r': ['rарова', 'кrрова', 'каrова', 'карrва', 'кароrа', 'каровr'].
Чтобы избежать этого, нам придется выполнить две задачи: 1 - разделить алфавиты, 2 - определить, к какому алфавиту принадлежит проверяемое слово. Разделение реализуем словарем алфавитов, а принадлежность слова к языку будем определять по максимальному совпадению букв слова с имеющимися алфавитами. Код:
alphabets = {         'en':u'abcdefghijklmnopqrstuvwxyz',         'ru':u'абвгдежзийклмнопрстуфхцчшщъыьэюя' }  def get_lang(word):     return max(alphabets,         key=lambda lang: sum(1 for l in word if l in alphabets[lang])) 
Принадлежность слова к алфавиту можно было бы определить и полным соответствием всех букв слова какому-либо алфавиту. Однако, такой подход не позволит нам исправлять слова типа 'ошибкаh', т.е. с "вкрапленными" буквами из другого языка.
Итак, первая задача решена. Осталось лишь передать нужный алфавит в функцию edits1known_edits2), а также подправить функцию words c тем, чтобы она выделяла также и русские слова. Исходный файл в юникоде. Соответственно, делаем необходимое преобразование в юникод-строку.
def words(text): return re.findall(u'[a-z]+|[а-я]+', text.decode('utf-8').lower()) 

Ошибки неверной раскладки

Теперь перейдем к решению второй задачи - определению неверной раскладки. Это можно сделать следующим кодом:
ttable = {             'en':u'qwertyuiop[]asdfghjkl;'zxcvbnm,',             'ru':u'йцукенгшщзхъфывапролджэячсмитьбю'             }  def translate(word, from_lang):     words = []     for to_lang in alphabets:         if to_lang == from_lang: continue         to, frm = ttable[to_lang], ttable[from_lang]         try:             words.append(''.join(to[frm.index(char)] for char in word))         except ValueError: pass     return words 
Функция translate формирует список преобразованных слов, по одному для каждого языка (исключая, естественно, изначальный язык). В случае, если для какой-либо буквы слова не находится соответствие в словаре транслитераций ttable, пропускаем это слово. Все что нам осталось сделать - поместить вызов этой функции в функцию correct, отфильтровав все неизвестные слова функциейknown.
В итоге, полный код нашего спеллчекера будет выглядеть следующим образом:
# -*- coding: utf-8 -*- import re, collections  def words(text): return re.findall(u'[a-z]+|[а-я]+', text.decode('utf-8').lower())  def train(features):     model = collections.defaultdict(lambda: 1)     for f in features:         model[f] += 1     return model  NWORDS = train(words(file('big.txt').read()))  alphabets = {             'en':u'abcdefghijklmnopqrstuvwxyz',             'ru':u'абвгдежзийклмнопрстуфхцчшщъыьэюя' }  ttable = {             'en':u'qwertyuiop[]asdfghjkl;'zxcvbnm,',             'ru':u'йцукенгшщзхъфывапролджэячсмитьбю'             }  def get_lang(word):     return max(alphabets,         key=lambda lang: sum(1 for l in word if l in alphabets[lang]))  def translate(word, from_lang):     words = []     for to_lang in alphabets:         if to_lang == from_lang: continue         to, frm = ttable[to_lang], ttable[from_lang]         try:             words.append(''.join(to[frm.index(char)] for char in word))         except ValueError: pass     return words  def edits1(word, lang):     alphabet = alphabets[lang]     s = [(word[:i], word[i:]) for i in range(len(word) + 1)]     deletes    = [a + b[1:] for a, b in s if b]     transposes = [a + b[1] + b[0] + b[2:] for a, b in s if len(b)>1]     replaces   = [a + c + b[1:] for a, b in s for c in alphabet if b]     inserts    = [a + c + b     for a, b in s for c in alphabet]     return set(deletes + transposes + replaces + inserts)  def known_edits2(word, lang):     return set(e2 for e1 in edits1(word, lang) for e2 in edits1(e1, lang) if e2 in NWORDS)  def known(words): return set(w for w in words if w in NWORDS)  def correct(word):     lang = get_lang(word)     candidates = known([word]) or known(edits1(word, lang)) or known_edits2(word, lang) or known(translate(word, lang)) or [word]     return max(candidates, key=NWORDS.get) 
Пример использования:
>>> correct(u'ашибка') ошибка  >>> correct(u'ашипка') ошибка  >>> correct(u'jib,rf') ошибка 

Что дальше

Спелчекер вышел простым, и этим он мне очень нравится. Однако, у него есть ряд серьезных недочетов:
  • Отсутствует знание о морфологии слова: если в корпусе не встретится словоформа "ошибками", это слово будет считаться ошибочным, и будет исправлено на "ошибка" (извините за тавтологию).
  • Значительно увеличивается сложность расчета при исправлении трех и более букв. В приведенном коде мы исправляем только две. Однако, поисковые системы исправляют и большее количество (см. ашипкааа).
  • Невозможно использовать для исправления "слипшихся" слов (этоошибка), а также разделенного слова (оши бка).
Но если это делают поисковые системы, значит можем и мы. О том как написать более мощный спеллчекер я расскажу в следующей части.

Вычисляем расстояние Левенштейна (Levenstein distance)

(Levenstein distance): расстояние Левенштейна - это минимальное количество операций, которые необходимо выполнить для того, чтобы одну строку преобразовать в другую

Windows Communication Foundation Technology Samples

Windows Communication Foundation Technology Samples

Windows Communication Foundation

Windows Communication Foundation

четверг, 28 октября 2010 г.


Отели


АоНанг


Экскурсии с Ао Нанга:
1. взять лодку в будке на пляже за 2000-1800 на весь день (на всех, кто в ней будет) и поехать на целый день по окрестным островам поплавать (Ко Тап, Чикен, Пода, и пляж на материке - Франанг Кейв с пещерой), позагорать (на Ао Нанге с этим не очень... - там только жить хорошо и вечернее время проводить в кафешках). Здесь на надо экскурсии - лучше просто лодку. Дороже, но зато полная свобода действий и кол-во часов в разных местах столько, сколько Вы сами хотите. 
2. Также утром пораньше (как можно пораньше) взять машинку с водилой (или байк - это уже сами выбирайте) и поехать на горячие источники и изумрудное озеро. Если горячей водой и купанием в ней вместе с другими людьми (их не мало) не увлекаетесь, то на источники, может, и не стоит ехать - только если галочку поставить.. По поводу Изумрудного озера - сама длинная дорога к нему (не по грунтовке, а через лес) намного интереснее озера. Обязательно надо идти по длинной дороге - вправо от входа в парк. Ощущения - просто фантастические :-| (если Вы любите природные красоты)
3. Тален Бей и кайакинг в каньонах, мангровый лес. Просто суперское путешествие. Можно купить на пол дня в любом агентстве на Ао Нанге. Ехать надо в первой половине дня - вода выше и плавать интересней. Почитайте отчеты по Краби - об этом есть информация. 
4. можно просто взять такси боат и поехать по остров Ко Пода - его видно с пляжа Ао Нанг. Там хорошее, чистое море, белый песочек. Просто приятно провести время. Причем, пляжей там много и разных - есть укромные бухточки с кусочком песка, есть длинные и широкие. 
5. Архипелаг Хонг. Это группа островов справа от Ао Нанг бей. На самом Хонге - красивая лагуна, если повезет на главном пляже можно неплохо поснорклить. Туда можно на кайаке сплавать (но сначала приплыть вместе с этим кайаком на длиннохвостке, конечно). Также в архипелаге красивые острова - Ладинг (Парадайз его еще называют), Пакбия). Экскурсия тоже продается в любом агентстве на Ао Нанг. 
6. Можно съездить на Пи-Пи (лучше на спидботе). Но лично я предпочитаю ездить непосредственно на Пи-Пи на 2-4 дня. Остров и его окрестности, безусловно, стоят этого. 

Райли

Езжайте на Рэйли. Это от Ао Нанга на лодке ок. 15 мин. Только останавливаться надо на Западном Рэйли, там красиво, все отели прямо на берегу. Хорошо дней 5, не больше. Только отливы сильные. А так - обстановка, я бы сказала, дачная. Русских немного. А на Восточный Рэйли можно ходить вечером, там растаманские бары, вкусная еда и не видно грязи.
С Рейли на Ао-Нанг можно добраться на лодке за 100 батт с человека. Обычные лодки ходят до 5-6 вечера


Пи Пи

п.с. на Пи-пи были -- не воткнул людской муравейник - так что он сразу минус.

А вообще-то оттуда я бы поехала на Пхи-Пхи - но только на Лонг Бич. Там очень симпатичный отельчик Pearl Paradise и недорогой. 



На Пи-Пи я рекомендую взять поездку на Спидботе на день вокруг Пи-Пи по всем местам (в восьмиместном спидботе) + закат + снорк. Народу не много, едет быстро. Если попадется хорошая компания (как нам - было 4 молодые пары примерно одного возраста: из Бразилии, UK, ГК и мы из России - было очень здорово пообщаться :roll: ). В марте этого года это стоило по 1600 бат на чел. Не торговались.


Ко Ланта

Добраться:  http://www.lantainfo.com/getting_ko_lanta_aonang.htm

http://forum.awd.ru/viewtopic.php?f=836&t=104983


Ко Ланта (Ко Ланта Ной - транзитом в Ко Ланта Яй) - мусульманский остров... Грустный, недешевый с не очень хорошими пляжами...А деньги там по-моему ваще негде менять, а если есть то по бешеному курсу...


Советую взять мотобайк и объехать остров, он небольшой. Все пляжи на западном побережье. Мне больше всего понравились несколько пляжей ближе к южной оконечности острова (где дорога становится грунтовкой). По названиям сейчас не вспомню.


А что в Краби делать 5 дней?
Ланту можно побольше 2 дней.

В принципе маршрут простой.
Всё достигается паромами, спидботами.
Пукет - Пи Пи - Краби - Ланта (или в обратном направлении)
Соотвественно точки прилета/вылета - Пукет/Краби.
С/на Ланту трансфер можно прямо из аэропорта сделать и всё .......



Уберите лучше то, где уже были. Например, Ланту - зачем туда во второй раз?? Либо еще вариант - сделайте Ланту базой для поездки на острова Крадан, Нгаи и т.д. Это, вроде, можно и за 1 день посмотреть (бегом, правда, и без ночевки). Булон...? - мне кажется он не сравним с Липе. Можно для общего развития на 1 день.


По первому посту и маршруту. Я бы выключила Ланту - или ее в начало. В конце она не понравится (на мой взгляд) совсем по сравнению с другими обозначенными местами. 
Вместо Ланты я бы съездила на острова Сурин (можно с Пукета, но удобнее с Као Лак) или на Симиланы (я ездила с Пукета на один день - мне хватило, но люди там и дольше остаются). Очень и очень красивые места



Советую Клонг Дао, отличный пляж и недалеко от Саладана, с кучей магазинов.


Рекомендую http://top.awd.ru/index.php?mode=4&hid=311, год назад в апреле 1200 бунгало (с завтраком)




Липе


http://kohlipethailand.com/


Липе можно смело выбрасывать. Нынче это тот же Пи-пи, но дальше, дороже и хуже в плане сервиса...




Не надо выбрасывать Липе. Просто у zibius такое индивидуальное мнение по поводу этого места :eek: . А мне все равно нравится (хотя и была там первый раз в 2006, когда отелей было всего ничего... и очень спартанские по 1000 бат max. с кондеем) и это ну ни как не Пи-Пи... То, что там прибавилось отелей - не лишило места своей прелести (имхо). Тем более, Вам не с чем сравнить, если там еще не были. Надо ехать и составить свое личное мнение. Лично мне и Пи-Пи безумно нравится. Просто настрой надо иметь позитивный на отдыхе. 


Наилучшим размещением на острове считаю Маунтан ресорт, даже не смотря на удаленность от тусы. 
Именно, вот в этих бунгало за 2200 бат  
http://forum.awd.ru/viewtopic.php?t=47489


был там уже в третий! раз и обнаружил изменения в худшую сторону во всех отношениях. Только и всего...
Однако,по прежнему это одно из лучших мест Тая!



Трансфер до Хат Яй  http://forum.awd.ru/viewtopic.php?f=836&t=100753&p=1425836&hilit=%D0%A2%D0%B0%D1%80%D1%83%D1%82%D0%B0%D0%BE#p1425836

Таким образом, вы едите от автобусной станции Hat Yai на регулярном большом автобусе до города Satun. Билет стоит 60 бат. В городе Satun можно переночевать и утром отправится в порт на тук-туке или такси. Стоить это будет на тук туке 50 бат. Порт называется Tammalang. Оттуда же ходят такие же скоростные паромы на малайский остров Langkawi, поэтому не перепутайте! Вам надо до островов Ko Lipeh, Adang Это написано в билетах...


Тарутао


http://awd.ru/lipe.htm


напоминал Байкал



Вышли мы на пристань, посмотрели на ту тоску зелёную, что царит на Тарутао и пошли обратно на баркас тире паром. Пляж грязно жёлтого песка пустой, кое-где мелькают силуэты бэкпекеров с книжками...

http://www.kohtarutaoisland.com

В Хат Яй лучше всего, прямо в аэропорту взять такси до порта Pakbara (Пакбара). Стоит около 1500 бат машина. Таксисты торгуются плохо, ну может бат 100 скинут и то хорошо. Есть другой вариант, ехать из аэропорта в город на станцию минибасов. Минибас из города в Пакбару стоит 150 бат, но дело осложняется тем, что расписание движения минибасов дурацкое. После 15-00 минибасы туда не ходят. Всё потому, что они подстраиваются под расписание парома или спидбота, уходящего из Пакбары на Тарутао. В итоге вы вынуждены ехать на том же такси за те же деньги, что и из аэропорта. Только времени больше потеряете. Короче: если хотите сэкономить, вы должны быть в Хат Яй утром, тогда вы успеете на минибас, если приезжаете после обеда - берите такси прямо в аэропорту до Пакбары и не парьтесь, всё равно ничего не выиграете.
На такси до Пакбары ехать часа три. Дороги хорошие, как и везде в Таиланде. В Пакбару мы приехали уже под вечер. На паром, конечно, не успели. Ходят они в высокий сезон два раза в день, в 10 утра и в 2 часа дня. В низкий сезон, а были мы в мае, паромы туда вообще не ходят, т.к. народу набирается человек 10-15 и их прекрасно переправляют на спидботе. Билеты на спидбот продают прямо в порту в любой забегаловке, также как и отели. Отели в порту НЕ ПОКУПАЙТЕ!!!! Стоят на 20 процентов дороже чем по месту. Поступаете просто - приезжаете в Пакбару, если опоздали на паром или спидбот, то останавливаетесь в гостинице прямо в порту, стоит 600 бат отдельный домик. Я оба раза останавливался в одном и том же домике. Приятно, тихо, есть все удобства. Затем утром без проблем, отправляетесь паромом и обходите по месту все гостиницы, выбираете понравившуюся и все дела.

А отправляетесь вы на о. Тарутао, он первый по пути, затем на о. Липе. это конечная остановка. Тарутао больше по рамерам Липе, но народу там меньше, он носит статус заповедника. Гостиниц с бунгало там очень мало.


http://kurgan.spira.ru/world/tarutao.htm


High-quality two-person tents can be rented and pitched on prime spots along the white sand, and it's a relatively comfortable night's sleep on the beach. Bungalows without bathrooms or fans are the next step up, and contain little other than four hard mattresses on the floor. The shared bathrooms are simple but well-maintained with sinks, squat toilets, and cold showers. 


http://www.travelfish.org/accommodation_profile/thailand/southern_thailand/satun/ko_tarutao/all/2363

электричество с 18 до 23, вода холодная


Другие


Судя по фоткам Булон, Крадан, Нгай -- все интересные острова. Но вот как на самом деле -- хз.

Прожили на Koh Surin 3 ночи и 4 дня. 
Нам тут очень понравилось! 
По красоте в Тае я бы поставил в один ряд Сурин, Симилианы и Липе. Последний пока непревзойден по совокупности факторов..Тут все в одном флаконе..И любого комфорта жилье и еда, красота такого же класса и туса… 

Khao Lak