Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 6, 2013 20:05:20

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

Исправление опечаток

agiz
ну я думаю опечатка это когда одно в слове одна две буквы отличаются, ну так вот можно считать процент
от количества букв с определенным процентом
например есть слово abc и abr и вот у нас будет 66% совпадения. И например там где процент выше 50-80 заменять эти строки.

Да я знаю что это не эффективно

Еще можно использовать http://api.yandex.ru/speller/doc/dg/concepts/api-overview.xml если есть интернет

Офлайн

#2 Ноя. 6, 2013 20:15:49

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

Исправление опечаток

Первое что в голову пришло

# -*- coding: utf-8 -*-
week = ['понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота', 'воскресенье']
def is_day(day):
    day = set(day.lower())
    return min((len(set(d) ^ day), d) for d in week)[1]
print(is_day('Читвэрг'))

Офлайн

#3 Ноя. 6, 2013 20:27:24

agiz
Зарегистрирован: 2013-11-06
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Исправление опечаток

Singularity, да-да, я опечатку себе представляю точно также
объясните мне, пожалуйста, по шагам как работают способы Singularity и dimy44, они меня вполне устраивают, но я не совсем понимаю как оно работает

Офлайн

#4 Ноя. 6, 2013 21:07:13

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

Исправление опечаток

Ну я принцип показал, если устроит, то уже доработать можно. Суть в том, что проверяется количество НЕобщих символов у проверяемого дня недели и у образцов, и возвращается вариант (взятый из списка образцов), где оказалось таких символов меньше всего.

set('среда') ^ set('сридда')
возвратит один символ ‘и’ например.

Отредактировано dimy44 (Ноя. 6, 2013 21:11:07)

Офлайн

#5 Ноя. 6, 2013 21:44:17

bismigalis
Зарегистрирован: 2010-10-02
Сообщения: 449
Репутация: +  47  -
Профиль   Отправить e-mail  

Исправление опечаток

т.е. в условии задачи не оговаривается, тогда идем в википедию

Чаще всего, в результате опечатки нарушается порядок букв в слове (быьт вместо быть), одна буква исчезает из слова (чловек вместо человек) или одна буква заменяется другой (чтатья вместо статья).

Офлайн

#6 Ноя. 6, 2013 22:11:56

agiz
Зарегистрирован: 2013-11-06
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Исправление опечаток

dimy44, спасибо, с множествами разобрался, но такой вариант не подходит для поиска опечаток в предложениях, так как по такому принципу слова могут меняться на совсем не предсказуемые и не подходящие.
Может, еще есть варианты у кого-нибудь?
Наверное, такое

sum( True for x in u"понельник"  if (x in u"понедельник"))/1.0*len(u"понельник")
решение более подходящее, но я пока, к сожалению, с трудом понимаю как оно работает

Отредактировано agiz (Ноя. 6, 2013 22:14:56)

Офлайн

#7 Ноя. 6, 2013 22:53:23

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

Исправление опечаток

как оно работает, понять несложно, а вот каким боком оно вам подходит ума не приложу. Например при

sum(True for x in u"иииииииии" if (x in u"понедельник" )) /1.0* len ( u"иииииииии" )
вы получите тот-же результат. И что он значит кстати?

Офлайн

#8 Ноя. 6, 2013 23:07:19

agiz
Зарегистрирован: 2013-11-06
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Исправление опечаток

В процессе гугления и чтения статьи от Lexander я понял, что самым простым и действенным способом в моей ситуации будет использование алгоритма поиска расстояния Левенштейна (либо реализация от dimy44) с линейным поиском.

Офлайн

#9 Ноя. 9, 2013 21:54:58

Ellis
Зарегистрирован: 2013-08-06
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Исправление опечаток

Не стоит искать опечаток.. просто меняй все дни недели..

Офлайн

#10 Ноя. 10, 2013 14:30:22

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Исправление опечаток

Мне такой алгоритм больше нравится, по 3 символа, он легко на sphinx-search делается.
Но вместо set() лучше list() использовать, т.е. учитывать повторяющиеся “тройки”.

# coding: utf8
def weight(word):
    def get(n):
        if 0 <= n < len(word):
            return word[n]
        return '_'
    r = set()
    for i in xrange(len(word)+2):
        r.add(get(i-2) + get(i-1) + get(i))
    return r
word = weight(u'понХедеХьник')
for w in [u'понедельник', u'вторник', u'среда', u'четверг', u'пятница', u'суббота', u'воскресенье']:
    print w, len(weight(w) & word)
понедельник 8
вторник 3
среда 0
четверг 0
пятница 1
суббота 0
воскресенье 0

Отредактировано o7412369815963 (Ноя. 10, 2013 14:31:53)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version