Время прочтения: 3 мин.

В качестве входного файла у нас был файл excel с большим количеством строк, выбор информации из которого нужно было произвести, как водится, «еще вчера». Обработка посредством SQL, а уж тем более вручную не представлялась возможной, в связи с чем было принято решение о разработке своего средства.

Так же было решено применить методы nlp к анализируемым данным. Но для чего это делать? Необходимость такой обработки обусловлена наличием в тексте различных форм одного и того же слова. Например, нам необходимо найти информацию о инкассаторах, для этого мы выбираем ключевое слово ИНКАССАТОР, но при этом из нашей выборки будут утеряны строки с употреблением слов ИНКАССАТОРА, ИНКАССАТОРЫ. Вводить огромное количество различных форм одного и того же слова, особенно при поиске по нескольким ключевым словам довольно сложно, ведь можно пропустить необходимую форму слова.

Импортируем необходимые для обработки библиотеки:

import re
import nltk
from nltk.corpus import stopwords
import pymorphy2
import pandas as pd

Далее разработаем класс для считывания данных и записи результатов в итоговый файл:

class ExcelWorker:

Конструктор класса принимает в себя имена excel-файла, рабочего листа и итогового файла.

    def __init__(self, excel_name, file_sheetname, result_excel_name):
        self.excel_name = excel_name
        self.file_sheetname = file_sheetname
        self.result_excel_name = result_excel_name

Считаем данные из excel-файла в DataFrame pandas:

def read_excel(self):
        data_frame = pd.read_excel(self.excel_name, sheet_name =self.file_sheetname)
        return data_frame

Произведем запись итогового DataFrame в новый excel-файл

    def write_excel(self, data_frame):
        data_frame.to_excel(self.result_excel_name)

Для удобного использования и дальнейшего применения разрабатываемых методов, реализуем их в качестве методов класса NLPWorker:

class NLPWorker:
    def __init__(self, search_words): #конструктор класса, в качестве аргумента принимает список слов для поиска
        self.morph = pymorphy2.MorphAnalyzer()
        self.search_words = search_words

Для дальнейшей обработки нам необходимо разбить текст на список употребляемых в нем слов. Для этого будем использовать метод word_tokenize библиотеки nltk.

def tokenize_string(self, string):
        return nltk.word_tokenize(string)

Так же, для увеличения скорости при дальнейшем поиске по тексту, можно удалить из него так называемые «стоп-слова». К таким словам можно отнести предлоги, союзы, частицы, междометия.

 def del_stopwords(self, tokens):
        stop_words = stopwords.words("russian") #выбираем список русских «стоп-слов»
        without_stopwords = [token for token in tokens if token not in stop_words]
        return without_stopwords

Самым важным методом для нашего поиска является приведение к нормальной форме списка слов (например, форма единственного числа, именительного падежа для существительных). Для этого применяем метод morph_parse:

def normal_form(self, tokens):
        normal_form_tokens = [self.morph.parse(token)[0].normal_form for token in tokens]
        return normal_form_tokens

После преобразования списка слов собираем их в новый текст:

 def join_tokens(self,tokens):
        return ' '.join(tokens)

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

def search_words(self, strings_list):
        search_strings_indexes = []
        for i,string in enumerate(strings_list):
            for search_word in self.search_words:
                if string.find(search_word)!=-1:
                    search_strings_indexes.append(i)
        return search_strings_indexes

Собираем разработанные методы в итоговый код в классе MainWorker:

class MainWorker:
    def __init__(self, excel_name,sheetname,result_filename, search_words):
        self.excel_name = excel_name
        self.excel_sheetname = sheetname
        self.result_filename = result_filename
        self.search_words = search_words        
    def search_in_file(self, column_name):
        ew = ExcelWorker(self.excel_name, self.excel_sheetname, self.result_filename)
        nlp = NLPWorker(self.search_words)
        work_data = ew.read_excel()
        descriptions = work_data[column_name].tolist()
        strings_for_searching = []
        for description in descriptions:
            tokens = nlp.tokenize_string(str(description).lower())
            w_sw = nlp.del_stopwords(tokens)    
            n_f = nlp.normal_form(w_sw)
            result_string = nlp.join_tokens(tokens)
            strings_for_searching.append(result_string)
        indexes = nlp.search_theft(strings_for_searching)
        result_data = work_data.loc[indexes, :]
        ew.write_excel(result_data)

В итоге мы разработали программное средство, позволяющее производить быстрый и точный поиск в файлах excel на основании набора ключевых слов.