Форум сайта python.su
75
agiz
ну я думаю опечатка это когда одно в слове одна две буквы отличаются, ну так вот можно считать процент
от количества букв с определенным процентом
например есть слово abc и abr и вот у нас будет 66% совпадения. И например там где процент выше 50-80 заменять эти строки.
Да я знаю что это не эффективно 
Еще можно использовать http://api.yandex.ru/speller/doc/dg/concepts/api-overview.xml если есть интернет
Офлайн
Первое что в голову пришло
# -*- 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('Читвэрг'))
Офлайн
0
Singularity, да-да, я опечатку себе представляю точно также
объясните мне, пожалуйста, по шагам как работают способы Singularity и dimy44, они меня вполне устраивают, но я не совсем понимаю как оно работает
Офлайн
Ну я принцип показал, если устроит, то уже доработать можно. Суть в том, что проверяется количество НЕобщих символов у проверяемого дня недели и у образцов, и возвращается вариант (взятый из списка образцов), где оказалось таких символов меньше всего.
set('среда') ^ set('сридда')
Отредактировано dimy44 (Ноя. 6, 2013 21:11:07)
Офлайн
47
т.е. в условии задачи не оговаривается, тогда идем в википедию
Чаще всего, в результате опечатки нарушается порядок букв в слове (быьт вместо быть), одна буква исчезает из слова (чловек вместо человек) или одна буква заменяется другой (чтатья вместо статья).
Офлайн
0
dimy44, спасибо, с множествами разобрался, но такой вариант не подходит для поиска опечаток в предложениях, так как по такому принципу слова могут меняться на совсем не предсказуемые и не подходящие.
Может, еще есть варианты у кого-нибудь?
Наверное, такое
sum( True for x in u"понельник" if (x in u"понедельник"))/1.0*len(u"понельник")
Отредактировано agiz (Ноя. 6, 2013 22:14:56)
Офлайн
как оно работает, понять несложно, а вот каким боком оно вам подходит ума не приложу. Например при
sum(True for x in u"иииииииии" if (x in u"понедельник" )) /1.0* len ( u"иииииииии" )
Офлайн
0
В процессе гугления и чтения статьи от Lexander я понял, что самым простым и действенным способом в моей ситуации будет использование алгоритма поиска расстояния Левенштейна (либо реализация от dimy44) с линейным поиском.
Офлайн
0
Не стоит искать опечаток.. просто меняй все дни недели..
Офлайн
32
Мне такой алгоритм больше нравится, по 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)
Офлайн