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

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

Еще можно использовать http://api.yandex.ru/speller/doc/dg/concepts/api-overview.xml если есть интернет
dimy44
Первое что в голову пришло
# -*- 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('Читвэрг'))
agiz
Singularity, да-да, я опечатку себе представляю точно также
объясните мне, пожалуйста, по шагам как работают способы Singularity и dimy44, они меня вполне устраивают, но я не совсем понимаю как оно работает
dimy44
Ну я принцип показал, если устроит, то уже доработать можно. Суть в том, что проверяется количество НЕобщих символов у проверяемого дня недели и у образцов, и возвращается вариант (взятый из списка образцов), где оказалось таких символов меньше всего.
set('среда') ^ set('сридда')
возвратит один символ ‘и’ например.
bismigalis
т.е. в условии задачи не оговаривается, тогда идем в википедию

Чаще всего, в результате опечатки нарушается порядок букв в слове (быьт вместо быть), одна буква исчезает из слова (чловек вместо человек) или одна буква заменяется другой (чтатья вместо статья).
agiz
dimy44, спасибо, с множествами разобрался, но такой вариант не подходит для поиска опечаток в предложениях, так как по такому принципу слова могут меняться на совсем не предсказуемые и не подходящие.
Может, еще есть варианты у кого-нибудь?
Наверное, такое
sum( True for x in u"понельник"  if (x in u"понедельник"))/1.0*len(u"понельник")
решение более подходящее, но я пока, к сожалению, с трудом понимаю как оно работает
dimy44
как оно работает, понять несложно, а вот каким боком оно вам подходит ума не приложу. Например при
sum(True for x in u"иииииииии" if (x in u"понедельник" )) /1.0* len ( u"иииииииии" )
вы получите тот-же результат. И что он значит кстати?
agiz
В процессе гугления и чтения статьи от Lexander я понял, что самым простым и действенным способом в моей ситуации будет использование алгоритма поиска расстояния Левенштейна (либо реализация от dimy44) с линейным поиском.
Ellis
Не стоит искать опечаток.. просто меняй все дни недели..
o7412369815963
Мне такой алгоритм больше нравится, по 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
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB