Время прочтения: 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 на основании набора ключевых слов.