Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 5, 2017 17:59:50

ewro
Зарегистрирован: 2017-11-03
Сообщения: 39
Репутация: +  0  -
Профиль   Отправить e-mail  

Нечеткий поиск

Часто нужен поиск в таблице Excel по слову. Строчек много. В данных часто бывают ошибки. Поэтому сам Excel находит не все. Поискав в инете толком ничего не нашел. Может и есть. Пришлось полюбить Питон (круче него ничего не видел в плане обилия специальных библиотек на все случаи жизни). Сам не программист, хотя приходилось иногда от нужды .
Вот что наваял. Может кому сгодится. Нужен файлик Exel в котором будем искать. В какой-то ячейке вбиваем - что искать. Это можно и из Питона делать (просто пробую как удобнее). В коде соответственно выбираем по какой колонке искать и из каких выводить найденное. Выведет в другой файл.
Если кто поможет советом по улучшению - буду признателен.

 import re                       
from Levenshtein import ratio
from openpyxl import load_workbook
from openpyxl import Workbook
import subprocess
from array import array
####################### ДВИГАЕТ ИСКОМОЕ СЛОВО ПО ПРОВЕРЯЕМОМУ
def Dvigatel(Ftho, Fr):
    mm = []#
    s=0#
    dlinaA=len(Ftho)#
    dlinaB=len(Fr)#
    step=0#
    while step <= dlinaB:
        vesslova = ratio(Ftho, Fr[step:])# Вес слова
        s=vesslova
        mm.append(s)# Добавляем в массив
        step=step+1
    maxim=max(mm)# Максимальный вес
    indexm=mm.index(maxim)# Индекс максимального веса
    f=Fr[indexm:]
    dlinaC=len(f)
    if dlinaA > dlinaB:
        e=f[:]
    else:
        ost=dlinaC-dlinaA   
        e=f[:-ost]
    if dlinaA >= dlinaC:
        e=f
    v=0
    v = ratio(Ftho, e)    
    return v
##############################################################
book = Workbook()   # Создаем поток-книгу
sheet1 = book.active    # Выбираем активный лист
wb = load_workbook(filename='Ob2017.xlsx')    # ВЫБЕРИ ФАЙЛ
sheet = wb.get_sheet_by_name('Лист1')   # Имя активного листа
thot = sheet.cell(row=1, column=7)   # В этой ячейке в файле задаем что искать
tho = thot.value    # Присваиваем Значение ячейки переменной
stroki = 1  # Начало счета строк в КОЛОНКЕ поиска
strvyvoda = 1   # Начало счета Строки для Вывода в файл
while stroki < 21074:   # ЦИКЛ КОЛОНКИ ПОИСКА СКОЛЬКО СТРОК В ФАЙЛЕ ПЛЮС 1
        a = sheet.cell(row=stroki, column=1)  # колонка
        c = sheet.cell(row=stroki, column=2)  # колонка
        bb = sheet.cell(row=stroki, column=4)    # Поисковая колонка
        bbb = bb.value  # Значение ячейки анализа
        b = bbb.lower()  # Приводим все к нижнему регистру
        zamenasimvolov = re.sub(r'[^\w\s]+|[\d]+', r' ', b)     # Оставляем только текст
        scolkoslov = len(zamenasimvolov.split())    # Сколько слов в ячейке анализа
        r = re.findall(r'\w+', zamenasimvolov)  # Записываем список слов из ячейки
                
        slov = 0    # Начало счета слов в ЯЧЕЙКЕ поиска
        while slov < scolkoslov:    # ЦИКЛ ПОДСЧЕТА СЛОВ В ЯЧЕЙКЕ
            Ftho = tho
            Fr = r[slov]
            v=0
            v = Dvigatel(Ftho,Fr)
            if v > 0.75:  # УСЛОВИЕ ВЫБОРА ПОДОБРАТЬ КАКОЙ ВЕС НУЖЕН
               print (Fr)
               sheet1.cell(row=strvyvoda, column=1).value = a.value   # Колонка вывода 
               sheet1.cell(row=strvyvoda, column=3).value = bb.value  # Колонка вывода 
               sheet1.cell(row=strvyvoda, column=2).value = c.value   # Колонка вывода 
               book.save("Vyvod.xlsx")  # Запись в файл
               strvyvoda = strvyvoda+1
            slov = slov + 1
        stroki = stroki + 1
subprocess.call("Vyvod.xlsx", shell=True)   # Открываем файл результата поиска
wb.close()  # Закрываем поток

Офлайн

#2 Ноя. 5, 2017 18:40:46

ewro
Зарегистрирован: 2017-11-03
Сообщения: 39
Репутация: +  0  -
Профиль   Отправить e-mail  

Нечеткий поиск

Вот в принципе показывает как в слове происходит поиск сдвигом (для ленивых и бестолковых как я ))
Это конечно для поиска в очень “зашумленных” данных. Однако, в некоторых случаях показывает наиболее лучший результат чем просто Левенштейн или поиск в Excel, например.

 from Levenshtein import ratio
from array import array
a = "паровоз" #Искомое слово
b = "sdfgsdfggjhjdjпоровоздиипрелятjkhjkkhjghh" # Внутри есть что-то похожее
c=[]
mm = []
s=0
dlinaA=len(a)
print (dlinaA)
dlinaB=len(b)
print (dlinaB)
otrez=0
step=0
while step <= dlinaB:
    edit_dist = ratio(a, b[step:])
    s=edit_dist
    mm.append(s)
    print (step,b[step:],mm[step])
    step=step+1
maxim=max(mm)
indexm=mm.index(maxim)
c=b[indexm:]
dlinaC=len(c)
if dlinaA > dlinaB:     
    e=c[:]
else:
    ost=dlinaC-dlinaA   
    e=c[:-ost]
if dlinaA >= dlinaC:
    e=c                 
edit_dist2 = ratio(a, e)
print (indexm, a, e, edit_dist2, indexm )

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version