NLP + Excel для быстрого поиска информации

Довольно часто при работе с большими объёмами данных, возникает необходимость в быстром поиске информации. Расскажем: как мы применяли методы NLP к анализируемым данным.

В качестве входного файла у нас был файл 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 на основании набора ключевых слов.

11
1 комментарий

Работает только с теми словами, которые есть в словаре?