{"id":324509,"date":"2021-06-07T15:01:18","date_gmt":"2021-06-07T15:01:18","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=324509"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=324509","title":{"rendered":"\u0410\u043d\u0430\u043b\u0438\u0437 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0447\u0430\u0442\u0430 \u043d\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 nlp"},"content":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e42\/1c7\/b4e\/e421c7b4e89d4894ea77c9de0890484a.jpeg\" width=\"1280\" height=\"720\"><figcaption><\/figcaption><\/figure>\n<p>\u0417\u0430\u0434\u0430\u0447\u0430 \u2013 \u00ab\u041f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0430\u043d\u0430\u043b\u0438\u0437 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0447\u0430\u0442\u0430 \u043d\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u043c \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438\u00bb<\/p>\n<p><strong>\u041d\u0430 \u0432\u0445\u043e\u0434\u0435: \u043b\u043e\u0433 \u0447\u0430\u0442\u043e\u0432 \u0441 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0432 csv \u0444\u043e\u0440\u043c\u0430\u0442\u0435:<\/strong><\/p>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p>\u0414\u0430\u0442\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438<\/p>\n<\/td>\n<td>\n<p>\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<td>\n<p>\u041a\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b<\/p>\n<\/td>\n<td>\n<p>\u041d\u043e\u043c\u0435\u0440 \u0437\u0430\u044f\u0432\u043a\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>yyyy-mm-dd hh-mm-ss<\/p>\n<\/td>\n<td>\n<p>\u0422\u0435\u043a\u0441\u04421<\/p>\n<\/td>\n<td>\n<p>\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c1<\/p>\n<\/td>\n<td>\n<p>\u041d\u043e\u043c\u0435\u04401<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>yyyy-mm-dd hh-mm-ss<\/p>\n<\/td>\n<td>\n<p>\u0422\u0435\u043a\u0441\u04422<\/p>\n<\/td>\n<td>\n<p>\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c2<\/p>\n<\/td>\n<td>\n<p>\u041d\u043e\u043c\u0435\u04402<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>yyyy-mm-dd hh-mm-ss<\/p>\n<\/td>\n<td>\n<p>\u0422\u0435\u043a\u0441\u04423<\/p>\n<\/td>\n<td>\n<p>\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c3<\/p>\n<\/td>\n<td>\n<p>\u041d\u043e\u043c\u0435\u04403<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>yyyy-mm-dd hh-mm-ss<\/p>\n<\/td>\n<td>\n<p>\u0422\u0435\u043a\u0441\u04424<\/p>\n<\/td>\n<td>\n<p>\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c4<\/p>\n<\/td>\n<td>\n<p>\u041d\u043e\u043c\u0435\u04404<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>yyyy-mm-dd hh-mm-ss<\/p>\n<\/td>\n<td>\n<p>\u0442\u0435\u043a\u0441\u0442N<\/p>\n<\/td>\n<td>\n<p>\u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044cN<\/p>\n<\/td>\n<td>\n<p>\u041d\u043e\u043c\u0435\u0440N<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p><strong>\u041f\u043b\u0430\u043d \u0440\u0435\u0448\u0435\u043d\u0438\u044f:<\/strong><\/p>\n<p>1. \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<p>2. \u0412\u044b\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0445\u043e\u0436\u0438\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0447\u0430\u0442\u0430<\/p>\n<p>3. \u0410\u043d\u0430\u043b\u0438\u0437 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432<\/p>\n<p>4. \u041f\u043e\u0434\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0438\u0442\u043e\u0433\u043e\u0432<\/p>\n<p><strong>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445<\/strong><\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b:<\/p>\n<pre><code>%matplotlib inline import matplotlib.pyplot as plt import seaborn as sns import tqdm import pandas as pd import numpy as np import re import time from nltk.tokenize import sent_tokenize, word_tokenize import pymorphy2 morph = pymorphy2.MorphAnalyzer(lang='ru')  from nltk import edit_distance import editdistance import textdistance from jellyfish import levenshtein_distance<\/code><\/pre>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 CSV \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 DataFrame. \u0424\u043e\u0440\u043c\u0430\u0442\u044b \u0434\u0430\u0442 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043b\u043e\u0433\u0430\u0445 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u043a \u0435\u0434\u0438\u043d\u043e\u043c\u0443 \u0432\u0438\u0434\u0443. \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u043f\u043e \u043d\u043e\u043c\u0435\u0440\u0430\u043c \u0447\u0430\u0442\u043e\u0432 \u0438 \u0434\u0430\u0442\u0430\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0441\u0431\u0440\u043e\u0441\/\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432.  <\/p>\n<pre><code>df = pd.DataFrame() counter = 1 for path_iter in PATH:     print(path_iter)     df_t = pd.read_csv(path_iter, sep=';', encoding='cp1251', dtype='str', engine = 'python')     if counter == 1:         df_t['\u0414\u0430\u0442\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438'] = pd.to_datetime(df_t['\u0414\u0430\u0442\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438'], format='%d.%m.%y %H:%M')     else:         df_t['\u0414\u0430\u0442\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438'] = pd.to_datetime(df_t['\u0414\u0430\u0442\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438'], format= '%Y-%m-%d %H:%M:%S')     df = df.append(df_t)     counter += 1  df.sort_values(by=['\u041d\u043e\u043c\u0435\u0440 \u0437\u0430\u044f\u0432\u043a\u0438', '\u0414\u0430\u0442\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438'], inplace=True) df.reset_index(drop=True, inplace=True) print('\u0420\u0430\u0437\u043c\u0435\u0440 DF, rows =', len(df)) df.head()<\/code><\/pre>\n<p>&gt;&gt;&gt;&nbsp;<\/p>\n<p><em>\u0420\u0430\u0437\u043c\u0435\u0440 DF, rows = 144584<\/em><\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e73\/4f4\/ad5\/e734f4ad5c7cc19364d4049c0637d0ab.png\" width=\"624\" height=\"154\"><figcaption><\/figcaption><\/figure>\n<p>\u041d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438 \u0434\u0435\u043b\u0430\u0435\u043c \u0432\u044b\u0432\u043e\u0434, \u0447\u0442\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0447\u0430\u0442\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u0438 \u043a\u043e\u043d\u0441\u0443\u043b\u044c\u0442\u0430\u043d\u0442\u043e\u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438. \u0418\u0437\u0440\u0435\u0434\u043a\u0430 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u044e\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b.  <\/p>\n<pre><code>df['\u041a\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b'].value_counts() &gt;&gt;&gt; ['AGENT']         \t43137 ['CONSULTANT']   \t 33040 ['USER']          \t29463 ['MANAGER']       \t21257 []                \t\t13939 ['BOT']            \t3748 Name: \u041a\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b, dtype: int64<\/code><\/pre>\n<pre><code>print('\u041a\u043e\u043b-\u0432\u043e \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0447\u0430\u0442\u043e\u0432', len(set(df['\u041d\u043e\u043c\u0435\u0440 \u0437\u0430\u044f\u0432\u043a\u0438'].tolist()))) &gt;&gt;&gt; \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0447\u0430\u0442\u043e\u0432 5406<\/code><\/pre>\n<p>\u0420\u0430\u0437\u043c\u0435\u0440 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0447\u0430\u0442\u043e\u0432 \u2013 25 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439.  <\/p>\n<pre><code>df['\u041d\u043e\u043c\u0435\u0440 \u0437\u0430\u044f\u0432\u043a\u0438'].value_counts().hist(bins = 40)<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9e4\/434\/431\/9e44344310b3ca43b7805a39bc888f9a.jpeg\" width=\"843\" height=\"541\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0442\u0435\u043a\u0441\u0442\u0430: \u043d\u0438\u0436\u043d\u0438\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440, \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0441 \u043e\u0434\u043d\u0438\u043c \u0441\u043b\u043e\u0432\u043e\u043c, \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0443\u0441\u0441\u043a\u0438\u0435 \u0431\u0443\u043a\u0432\u044b, \u043f\u0440\u043e\u0431\u0435\u043b \u0438 \u0442\u0438\u0440\u0435. \u0423\u0434\u0430\u043b\u0435\u043d\u044b \u0438\u0437 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0442\u0435\u043a\u0441\u0442\u044b \u043e \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u0438\u0434\u0430 \u00ab\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430.jpg\u00bb.  <\/p>\n<pre><code>def filter_text(text):     '''     \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442,     \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0435 \u0442\u0435\u043a\u0441\u0442.          \u0432 \u0442\u0435\u043a\u0441\u0442\u0435 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0440\u0443\u0441\u0441\u043a\u043e\u0433\u043e \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u0430, \u0442\u0438\u0440\u0435, \u043f\u0440\u043e\u0431\u0435\u043b     '''     text = text.lower()     if len(re.findall(r'[\\w]+', text)) == 1:         #print(re.findall(r'[\\w]+', text), '---', len(re.findall(r'[\\w]+', text)))         return ''     #\u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0438\u0437 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0442\u0435\u043a\u0441\u0442\u044b \u0441 \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u0438\u0434\u0430 \"\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430.jpg\"     text = re.sub(r'(.+[.]jpg)|(.+[.]pdf)', '', text)     text = [c for c in text if c in '\u0430\u0431\u0432\u0433\u0434\u0435\u0451\u0436\u0437\u0438\u0439\u043b\u043a\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u044f- ']     text = ''.join(text)     return text  df['work_text'] = df.apply(lambda row: filter_text(row['\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435']), axis = 1)<\/code><\/pre>\n<p>\u0417\u0430\u043c\u0435\u043d\u044f\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432 \u043e\u0434\u043d\u0438\u043c \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u043c.  <\/p>\n<pre><code>df['work_text'] = df.apply(lambda row: re.sub(r'\\s+', ' ', row['work_text']) , axis = 1)<\/code><\/pre>\n<p>\u0427\u0438\u0441\u0442\u0438\u043c \u043e\u0442 \u0447\u0430\u0441\u0442\u043e\u0442\u043d\u044b\u0445\/\u043d\u0435 \u0437\u043d\u0430\u0447\u0438\u043c\u044b\u0445 \u0441\u043b\u043e\u0432\u043e\u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0439:  <\/p>\n<pre><code>STOP_WORDS = [     '-', '--', '-\u0430', '-\u0431', '-\u0432', '-\u0435', '-\u0439', '-\u043a', '-\u043c', '-\u0442', '-\u0443', '-\u0445', '-\u044e', '-\u044f', '\u0430', '\u0430-', '\u0430\u0430', '\u0430\u0431',      '\u0430\u0432', '\u0430\u0434', '\u0430\u0435', '\u0430\u0436', '\u0430\u043a', '\u0430\u043c', '\u0430\u043d', '\u0430\u043e', '\u0430\u043f', '\u0430\u0441', '\u0430\u0443', '\u0430\u0447', '\u0431', '\u0431\u0430', '\u0431\u0432', '\u0431\u0434', '\u0431\u0435\u0437', '\u0431\u044b',      '\u0432', '\u0432-', '\u0432\u0430', '\u0432\u0431', '\u0432\u0432', '\u0432\u0433', '\u0432\u0438', '\u0432\u043c', '\u0432\u043d', '\u0432\u043e', '\u0432\u043f', '\u0432\u0441', '\u0432\u0442', '\u0432\u0445', '\u0432\u0449', '\u0432\u044b', '\u0432\u044e', '\u0433',      '\u0433-', '\u0433\u0430', '\u0433\u0432', '\u0433\u043a', '\u0433\u043c', '\u0433\u043e', '\u0433\u043f', '\u0433\u0443', '\u0434', '\u0434\u0430', '\u0434\u0431', '\u0434\u0432', '\u0434\u0434', '\u0434\u0435', '\u0434\u0435\u043d\u044c', '\u0434\u0438', '\u0434\u043a', '\u0434\u043b\u044f',      '\u0434\u043e', '\u0434\u043e\u0431\u0440\u043e\u0435', '\u0434\u043e\u0431\u0440\u044b\u0439', '\u0434\u0440', '\u0434\u0441', '\u0434\u0443', '\u0434\u044e', '\u0434\u044f', '\u0435', '\u0435\u0430', '\u0435\u0432', '\u0435\u0435', '\u0435\u0439', '\u0435\u043d', '\u0435\u0441', '\u0435\u044e', '\u0435\u0451',      '\u0436', '\u0436\u0435', '\u0436\u043a', '\u0436\u0440', '\u0437', '\u0437\u0430', '\u0437\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435', '\u0437\u043f', '\u0437\u0443', '\u0438', '\u0438\u0430', '\u0438\u0437', '\u0438\u043a', '\u0438\u043b', '\u0438\u043b\u0438', '\u0438\u043c', '\u0438\u043d',      '\u0438\u043e', '\u0438\u043f', '\u0438\u0443', '\u0438\u0445', '\u0439', '\u043a', '\u043a\u0430', '\u043a\u0430\u043a', '\u043a\u0432', '\u043a\u0434', '\u043a\u043a', '\u043a\u043c', '\u043a\u043e', '\u043a\u043f', '\u043a\u0440', '\u043a\u0441', '\u043b', '\u043b\u0430',      '\u043b\u0434', '\u043b\u0438', '\u043b\u043a', '\u043b\u044f', '\u043c', '\u043c\u0430', '\u043c\u0431', '\u043c\u0432', '\u043c\u0433', '\u043c\u0437', '\u043c\u0438', '\u043c\u043a', '\u043c\u043b', '\u043c\u043c', '\u043c\u043d\u0435', '\u043c\u043e', '\u043c\u0440', '\u043c\u0441',      '\u043c\u0442', '\u043c\u0443', '\u043c\u044b', '\u043c\u044d', '\u043c\u044e', '\u043c\u044f', '\u043d', '\u043d\u0430', '\u043d\u0432', '\u043d\u0435', '\u043d\u0438', '\u043d\u043d', '\u043d\u043e', '\u043d\u043f', '\u043d\u0441', '\u043d\u0443', '\u043d\u0444', '\u043d\u044b',      '\u043d\u044f', '\u043e', '\u043e\u0430', '\u043e\u0431', '\u043e\u0432', '\u043e\u0434', '\u043e\u0435', '\u043e\u0439', '\u043e\u043a', '\u043e\u043c', '\u043e\u043d', '\u043e\u043e', '\u043e\u043f', '\u043e\u0441', '\u043e\u0442', '\u043e\u0445', '\u043e\u0447', '\u043e\u044e',      '\u043f', '\u043f\u0432', '\u043f\u0438', '\u043f\u043a', '\u043f\u043b', '\u043f\u043c', '\u043f\u043d', '\u043f\u043e', '\u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430', '\u043f\u043f', '\u043f\u0440', '\u043f\u0440\u0438', '\u043f\u0441', '\u043f\u0442', '\u043f\u0444', '\u043f\u0448',      '\u043f\u044e', '\u0440', '\u0440\u0430', '\u0440\u0431', '\u0440\u0432', '\u0440\u0434', '\u0440\u0438', '\u0440\u043d', '\u0440\u043e', '\u0440\u043f', '\u0440\u0440', '\u0440\u0441', '\u0440\u0442', '\u0440\u0443', '\u0440\u0444', '\u0441', '\u0441\u0430', '\u0441\u0431',      '\u0441\u0432', '\u0441\u0433', '\u0441\u0435', '\u0441\u0436', '\u0441\u043a', '\u0441\u043b', '\u0441\u043c', '\u0441\u043d', '\u0441\u043e', '\u0441\u043f', '\u0441\u043f\u0430\u0441\u0438\u0431\u043e', '\u0441\u0440', '\u0441\u0442', '\u0441\u0443', '\u0441\u0445', '\u0441\u0447', '\u0442',      '\u0442-', '\u0442\u0430', '\u0442\u0431', '\u0442\u0432', '\u0442\u0433', '\u0442\u0434', '\u0442\u0435', '\u0442\u0438', '\u0442\u043a', '\u0442\u043d', '\u0442\u043e', '\u0442\u043f', '\u0442\u0440', '\u0442\u0443', '\u0442\u0446', '\u0442\u0447', '\u0442\u044b', '\u0443',      '\u0443\u0432', '\u0443\u0436', '\u0443\u043a', '\u0443\u043b', '\u0443\u0440', '\u0443\u0442\u0440\u043e', '\u0443\u0445', '\u0443\u0447', '\u0443\u044f', '\u0444', '\u0444\u0433', '\u0444\u0434', '\u0444\u0437', '\u0444\u043d', '\u0444\u0444', '\u0444\u0446', '\u0445', '\u0445\u0433',      '\u0445\u043c', '\u0445\u043e', '\u0446', '\u0446\u0431', '\u0446\u043d', '\u0447', '\u0447\u0431', '\u0447\u0435', '\u0447\u043f', '\u0447\u0441', '\u0447\u0442', '\u0447\u0442\u043e', '\u0448', '\u044b', '\u044c', '\u044d', '\u044d\u0433', '\u044d\u043b', '\u044d\u043f',      '\u044d\u0440', '\u044d\u0442', '\u044d\u0445', '\u044e', '\u044e\u0430', '\u044e\u0432', '\u044e\u0433', '\u044e\u043b', '\u044e\u0440', '\u044e\u0441', '\u044f', '\u044f\u0433', '\u044f\u044f', '\u0451',     '\u044f', '\u0441\u0435\u0439\u0447\u0430\u0441', '\u044d\u0442\u043e', '\u0435\u0449\u0451', '\u043f\u043e\u043d\u044f\u0442\u043d\u043e', '\u043e\u0442\u043b\u0438\u0447\u043d\u043e', '\u0438\u0437\u0432\u0438\u043d\u0438\u0442\u044c','\u0438\u0437\u0432\u0438\u043d\u0438\u0442\u0435','\u0433\u0434\u0435' ]  #DF \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 df_users = df[df['\u041a\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b'] == '''['USER']'''] [df_users.work_text.replace(x, '', regex=True, axis = 1, inplace=True) for x in STOP_SENTS]<\/code><\/pre>\n<p>\u041f\u0440\u0438\u0432\u043e\u0434\u0438\u043c \u0441\u043b\u043e\u0432\u0430 \u043a \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0435, \u0443\u0434\u0430\u043b\u0438\u043c \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u0430 \u0447\u0430\u0441\u0442\u043e\u0442\u043d\u044b\u0435 \u0441\u043b\u043e\u0432\u0430  <\/p>\n<pre><code>def normalize_text(text):     '''     \u0438\u0434\u0435\u043c \u043f\u043e \u0432\u0441\u0435\u043c \u0442\u043e\u043a\u0435\u043d\u0430\u043c,      \u0442\u043e \u0447\u0442\u043e \u0432 STOP_WORDS - \u0432\u044b\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u043c,     \u043c\u0435\u043d\u044f\u0435\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u043d\u0430 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0444\u043e\u0440\u043c\u0443,     \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u043c,     \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0442\u0435\u043a\u0441\u0442     '''     ls = list()     for word in word_tokenize(text, language='russian'):         if word not in STOP_WORDS:             ls.append(morph.parse(word)[0].normal_form)      norm_text = ' '.join([x for x in ls])     return norm_text  df_users['clear_text'] = df_users.work_text df_users['clear_text'] = df_users.apply(lambda row: normalize_text(row.clear_text), axis = 1)<\/code><\/pre>\n<p><strong>\u0412\u044b\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e\u0445\u043e\u0436\u0438\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0447\u0430\u0442\u0430<\/strong><\/p>\n<p>\u041d\u0430\u0439\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u041b\u0435\u0432\u0435\u043d\u0448\u0442\u0435\u0439\u043d\u0430 \u0432\u0441\u0435\u0445 \u0437\u0430\u044f\u0432\u043e\u043a \u043f\u043e \u0432\u0441\u0435\u043c \u0442\u0435\u043a\u0441\u0442\u0430\u043c:<\/p>\n<pre><code>def get_edit_distance(sec_posts, val_leven):     '''     sec_posts - list \u0441 \u043f\u043e\u0441\u0442\u0430\u043c\u0438 \u0447\u0430\u0442\u0430     val_leven - \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0440\u0435\u0434\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043f\u043e \u041b\u0435\u0432\u0435\u043d\u0448\u0442\u0435\u0439\u043d\u0443:                  ratio_ed = editdistance \/ \u0434\u043b\u0438\u043d\u0443 \u0442\u0435\u043a\u0441\u0442\u0430     '''     ls = []     len_sec_posts = len(sec_posts)     sec_posts_iter = 0     for i in sec_posts:         sec_posts_iter += 1 #\u043d\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c \u043f\u043e \u0442\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0436\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u043b\u0438         for k in sec_posts[sec_posts_iter:]:             #ed = edit_distance(i, k)             #ed = textdistance.levenshtein(i, k)             #ed = levenshtein_distance(i, k)             ed = editdistance.eval(i, k)             if len(k) == 0:                 ratio_ed = 0             else:                 ratio_ed = ed \/ len(k)             if len(k) !=0 and len(i) != 0 and ratio_ed &lt;= val_leven:                 ls.append([i, k, ratio_ed, ed])     #list [post1, post2, ratio_ed, ed]     return ls   CURRENT_LEV_VALUE = 0.25  #\u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043d\u043e\u043c\u0435\u0440\u0430 \u0437\u0430\u044f\u0432\u043e\u043a: number_orders = set(df_users[(df_users['\u041a\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b'] == '''['USER']''')]['\u041d\u043e\u043c\u0435\u0440 \u0437\u0430\u044f\u0432\u043a\u0438'].tolist())  #\u041d\u0430\u0439\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u041b\u0435\u0432\u0435\u043d\u0448\u0442\u0435\u0439\u043d\u0430 \u043f\u043e \u0432\u0441\u0435\u043c \u0444\u0440\u0430\u0437\u0430\u043c, \u0432\u0441\u0435\u0445 \u0437\u0430\u044f\u0432\u043e\u043a: all_dic = {} for i_order in tqdm.tqdm(number_orders):       posts_list = df_users[(df_users['\u041a\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b'] == '''['USER']''') &amp; (df_users['\u041d\u043e\u043c\u0435\u0440 \u0437\u0430\u044f\u0432\u043a\u0438'] == i_order)]['clear_text'].tolist()     all_dic[i_order] = get_edit_distance(posts_list, CURRENT_LEV_VALUE)<\/code><\/pre>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u044b\u043b\u0430 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0430 \u0441\u0430\u043c\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u0440\u0435\u0434\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u041b\u0435\u0432\u0435\u043d\u0448\u0442\u0435\u0439\u043d\u0430 \u2013 editdistance.<\/p>\n<p>\u0420\u0430\u0441\u0447\u0435\u0442 \u0437\u0430\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445 \u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 29463 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0447\u0430\u0442\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043d\u0438\u0436\u0435. \u0412 \u0442\u0435\u0441\u0442\u0435 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0438&nbsp;<strong>import edit_distance, import editdistance, import textdistance, from jellyfish import<\/strong>:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0af\/15c\/d98\/0af15cd9865a8345c0952064ea27f344.png\" width=\"228\" height=\"126\"><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a09\/5b1\/ed1\/a095b1ed19eebb89b18be5b60e27b019.jpeg\" width=\"993\" height=\"597\"><figcaption><\/figcaption><\/figure>\n<p>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 editdistance \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u0435\u0435 \u0430\u043d\u0430\u043b\u043e\u0433\u043e\u0432 \u043e\u0442 18 \u0434\u043e 31 \u0440\u0430\u0437\u0430.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u0443\u044e \u0441\u0445\u043e\u0436\u0435\u0441\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u0435\u0442\u0440\u0438\u043a\u0443 CURRENT_LEVEN, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u0440\u0435\u0434\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044e \u0434\u0432\u0443\u0445 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u043a \u0434\u043b\u0438\u043d\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430 \u2014 editdistance (text1, text2)\/ \u0434\u043b\u0438\u043d\u0443 \u0442\u0435\u043a\u0441\u0442\u0430(text1).<\/p>\n<p>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 CURRENT_LEVEN \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043e\u043f\u044b\u0442\u043d\u044b\u043c \u043f\u0443\u0442\u0435\u043c. \u041f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u043e\u043f-\u0441\u043b\u043e\u0432. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0441\u0440\u0435\u0434\u043d\u0435\u0439 \u0434\u043b\u0438\u043d\u044b \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0438 \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u0443\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f. \u0412 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 CURRENT_LEVEN \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u043b 0.25.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8ef\/f6a\/50e\/8eff6a50e6eca718875ad11c87343438.jpeg\" width=\"858\" height=\"646\"><figcaption><\/figcaption><\/figure>\n<p><strong>\u0410\u043d\u0430\u043b\u0438\u0437 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432<\/strong><\/p>\n<p>\u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f dataframe \u0438\u0437 \u0440\u0430\u0441\u0447\u0435\u0442\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445:<\/p>\n<pre><code>df_rep_msg = pd.DataFrame(ls, columns=['id_order', 'clear_msg', 'clear_msg2', 'ratio_dist', 'ed_dist']) df_rep_msg['id_rep_msg'] =  df_rep_msg.reset_index()['index'] +1  df_rep_msg.head()<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2b0\/495\/9b1\/2b04959b1ff2d8054a9cf069505734a9.png\" width=\"624\" height=\"107\"><figcaption><\/figcaption><\/figure>\n<p>\u0420\u0430\u0437\u0432\u043e\u0440\u043e\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 \u0441\u0442\u0440\u043e\u043a\u0438:  <\/p>\n<pre><code>df1 = df_rep_msg[['id_order','clear_msg','ratio_dist','ed_dist', 'id_rep_msg']] df2 = df_rep_msg[['id_order','clear_msg2','ratio_dist','ed_dist', 'id_rep_msg']] df2.columns = ['id_order','clear_msg','ratio_dist','ed_dist','id_rep_msg'] df_rep_msg = pd.concat([df1, df2], axis=0).sort_values(by=['id_order'], ascending=[True]) del df1 del df2 df_rep_msg.drop_duplicates(inplace=True) df_rep_msg.head(10)<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/09d\/617\/15d\/09d61715da9d457545817e586bb386eb.png\" width=\"624\" height=\"279\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0438 \u043a \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c\u0443 df_users_rep_msg  <\/p>\n<pre><code>df_users_rep_msg = pd.merge(     df_users, df_rep_msg, how='left',      left_on=['clear_text','\u041d\u043e\u043c\u0435\u0440 \u0437\u0430\u044f\u0432\u043a\u0438'],     right_on=['clear_msg','id_order'] ) df_users_rep_msg[df_users_rep_msg.clear_msg.notnull()][     ['\u0414\u0430\u0442\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438', '\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435', '\u041a\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b', '\u041d\u043e\u043c\u0435\u0440 \u0437\u0430\u044f\u0432\u043a\u0438', 'clear_msg', 'ratio_dist', 'ed_dist','id_rep_msg'] ].head()<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d23\/cc2\/f15\/d23cc2f15c47ca6e00167bf6ee85a386.png\" width=\"623\" height=\"148\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 6 \u0440\u0430\u0437 \u0432 \u043e\u0434\u043d\u043e\u043c \u0447\u0430\u0442\u0435  <\/p>\n<pre><code>count_ser = df_users_rep_msg[df_users_rep_msg.id_rep_msg.notnull()]['id_rep_msg'].value_counts() filt = count_ser[count_ser &gt; 4] filt<\/code><\/pre>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0c1\/dc4\/fea\/0c1dc4feaf56b960b5184fb433641e9b.png\" alt=\"\" title=\"\" width=\"253\" height=\"227\"><figcaption><\/figcaption><\/figure>\n<pre><code>df_users_rep_msg[df_users_rep_msg.id_rep_msg.isin(filt.index)][['\u0414\u0430\u0442\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438','\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435','id_order']]<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0bb\/df7\/0ed\/0bbdf70edbd5198aedeaac50d214a2da.png\" width=\"575\" height=\"551\"><figcaption><\/figcaption><\/figure>\n<p>\u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u0443\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0447\u0430\u0442\u044b, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0447\u0430\u0441\u0442\u043e\u0442\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432, \u043a\u0430\u043a \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435, \u0438 \u0432\u044b\u044f\u0441\u043d\u0438\u0442\u044c \u043f\u0440\u0438\u0447\u0438\u043d\u0443 \u043d\u0430\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u0438 \u0438 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0451\u043d\u043d\u043e\u0441\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u043c.<\/p>\n<p>\u0420\u0430\u0437\u043c\u0435\u0442\u0438\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0434\u0430\u0442\u0430 \u0444\u0440\u0435\u0439\u043c<\/p>\n<pre><code>df_m = pd.merge(     df, df_users_rep_msg[df_users_rep_msg.id_rep_msg.notnull()],      how='left',      left_on  = ['\u0414\u0430\u0442\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438','\u041a\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b',  '\u041d\u043e\u043c\u0435\u0440 \u0437\u0430\u044f\u0432\u043a\u0438', '\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435'],     right_on =['\u0414\u0430\u0442\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438','\u041a\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b', '\u041d\u043e\u043c\u0435\u0440 \u0437\u0430\u044f\u0432\u043a\u0438', '\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435'] ) df_m = df_m[['\u0414\u0430\u0442\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438', '\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435', '\u041a\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b', '\u041d\u043e\u043c\u0435\u0440 \u0437\u0430\u044f\u0432\u043a\u0438','clear_msg',        'ratio_dist', 'ed_dist', 'id_rep_msg']] df_m.loc[18206:18216]<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2bf\/6a5\/321\/2bf6a5321f7e3116662d22912d68e7b8.png\" width=\"624\" height=\"302\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u043e\u043b\u0443\u0447\u0438\u043c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0441\u043e\u0432\u043f\u0430\u0432\u0448\u0435\u043c\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044e  <\/p>\n<pre><code>df_temp = df_m[df_m.id_rep_msg.notnull()][['id_rep_msg']] df_temp['id_row'] = df_temp.index.astype('int') df_temp.id_rep_msg = df_temp.id_rep_msg.astype('int') index_arr = df_temp.groupby(by = 'id_rep_msg')['id_row'].agg([np.min, np.max]).values index_arr[0:10] &gt;&gt;&gt; array([[ 36383,  36405],        [108346, 108351],        [    12,     43],        [ 99376,  99398],        [111233, 111235],        [121610, 121614],        [ 91234,  91252],        [ 11963,  11970],        [  7103,   7107],        [ 53010,  53016]], dtype=int64) df_m.loc[index_arr[194][0]:index_arr[194][1]]<\/code><\/pre>\n<p>\u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043d\u0438\u0436\u0435 \u0432\u0438\u0434\u043d\u043e, \u043a\u0430\u043a \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0438\u043b \u0431\u043e\u0442\/\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430, \u043a\u043b\u0438\u0435\u043d\u0442 \u043d\u0435 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d  <\/p>\n<pre><code>df_m.loc[index_arr[194][0]:index_arr[194][1]]<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ba2\/0d0\/cb0\/ba20d0cb0522ae238e1cd95ee5d9f6fa.png\" width=\"623\" height=\"126\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u043b\u0443\u0447\u0430\u0438  <\/p>\n<pre><code>#\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u043b\u0443\u0447\u0430\u0438 results = {'\u041e\u0442\u0432\u0435\u0442_\u043f\u043e\u043b\u0443\u0447\u0435\u043d':0, '\u041e\u0442\u0432\u0435\u0442_\u043f\u0440\u043e\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d':0, '\u0412\u0441\u0435\u0433\u043e_\u0433\u0440\u0443\u043f\u043f_\u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0445_\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439':0} results['\u0412\u0441\u0435\u0433\u043e_\u0433\u0440\u0443\u043f\u043f_\u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0445_\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439'] = len(index_arr) for i in range(len(index_arr)):     if len(set(df_m.loc[index_arr[i][0]:index_arr[i][1]]['\u041a\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b'].tolist()) - set([\"['USER']\"])) &gt; 0:         results['\u041e\u0442\u0432\u0435\u0442_\u043f\u043e\u043b\u0443\u0447\u0435\u043d'] += 1     elif len(set(df_m.loc[index_arr[i][0]:index_arr[i][1]]['\u041a\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b'].tolist()) - set([\"['USER']\"])) == 0:         results['\u041e\u0442\u0432\u0435\u0442_\u043f\u0440\u043e\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d'] += 1 print('\u0414\u043e\u043b\u044f \u043f\u0440\u043e\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439:', round(100*(results['\u041e\u0442\u0432\u0435\u0442_\u043f\u0440\u043e\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d']\/results['\u0412\u0441\u0435\u0433\u043e_\u0433\u0440\u0443\u043f\u043f_\u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0445_\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439']), 2), '%') results<\/code><\/pre>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/242\/416\/241\/242416241ca921e40ffa10d46d4bce81.png\" width=\"342\" height=\"86\"><figcaption><\/figcaption><\/figure>\n<p>\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439:  <\/p>\n<pre><code>N = 1 anw_yes = (236) anw_no = (103) ind = np.arange(N)     width = 0.35  p1 = plt.bar(ind, anw_yes, width) p2 = plt.bar(ind, anw_no, width, bottom=anw_yes)  plt.ylabel('\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0445_\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439') plt.title('\u0414\u043e\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439') plt.xticks(ind, ('')) plt.yticks(np.arange(0, 500, 50)) plt.legend((p1[0], p2[0]), ('\u041e\u0442\u0432\u0435\u0442_\u043f\u043e\u043b\u0443\u0447\u0435\u043d', '\u041e\u0442\u0432\u0435\u0442_\u043f\u0440\u043e\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d'))  plt.show()<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2e3\/e13\/e1b\/2e3e13e1bdc3330ecdcbb9f25b004fe5.jpeg\" width=\"933\" height=\"601\"><figcaption><\/figcaption><\/figure>\n<p><strong>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/strong><\/p>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e NLP \u043c\u043e\u0434\u0435\u043b\u0438, \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u043d\u0430 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0438 \u0440\u0435\u0434\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043f\u043e \u041b\u0435\u0432\u0435\u043d\u0448\u0442\u0435\u0439\u043d\u0443, \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u043a\u043e\u043b-\u0432\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u044b\u0445 \u0447\u0430\u0442\u043e\u0432 \u0441 5406 \u0435\u0434. \u0434\u043e 339 \u0435\u0434. \u0418\u0437 \u043d\u0438\u0445 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u043a\u043e-\u0440\u0438\u0441\u043a\u043e\u0432\u044b\u0435 \u0447\u0430\u0442\u044b \u2014 103 \u0435\u0434. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0440\u0430\u0441\u0447\u0435\u0442\u0430\u0445 \u0432\u044b\u0441\u043e\u043a\u043e\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0434\u043b\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u0434\u0438\u0441\u0442\u0430\u043d\u0446\u0438\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0442\u0435\u043a\u0441\u0442\u0430\u043c\u0438, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0443\u044e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043e\u0431\u044a\u0435\u043c\u044b \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438.<\/p>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/561386\/\"> https:\/\/habr.com\/ru\/post\/561386\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0417\u0430\u0434\u0430\u0447\u0430 \u2013 \u00ab\u041f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0430\u043d\u0430\u043b\u0438\u0437 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0447\u0430\u0442\u0430 \u043d\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u043c \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438\u00bb<\/p>\n<p><strong>\u041d\u0430 \u0432\u0445\u043e\u0434\u0435: \u043b\u043e\u0433 \u0447\u0430\u0442\u043e\u0432 \u0441 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0432 csv \u0444\u043e\u0440\u043c\u0430\u0442\u0435:<\/strong><\/p>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p>\u0414\u0430\u0442\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438<\/p>\n<\/td>\n<td>\n<p>\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<td>\n<p>\u041a\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b<\/p>\n<\/td>\n<td>\n<p>\u041d\u043e\u043c\u0435\u0440 \u0437\u0430\u044f\u0432\u043a\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>yyyy-mm-dd hh-mm-ss<\/p>\n<\/td>\n<td>\n<p>\u0422\u0435\u043a\u0441\u04421<\/p>\n<\/td>\n<td>\n<p>\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c1<\/p>\n<\/td>\n<td>\n<p>\u041d\u043e\u043c\u0435\u04401<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>yyyy-mm-dd hh-mm-ss<\/p>\n<\/td>\n<td>\n<p>\u0422\u0435\u043a\u0441\u04422<\/p>\n<\/td>\n<td>\n<p>\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c2<\/p>\n<\/td>\n<td>\n<p>\u041d\u043e\u043c\u0435\u04402<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>yyyy-mm-dd hh-mm-ss<\/p>\n<\/td>\n<td>\n<p>\u0422\u0435\u043a\u0441\u04423<\/p>\n<\/td>\n<td>\n<p>\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c3<\/p>\n<\/td>\n<td>\n<p>\u041d\u043e\u043c\u0435\u04403<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>yyyy-mm-dd hh-mm-ss<\/p>\n<\/td>\n<td>\n<p>\u0422\u0435\u043a\u0441\u04424<\/p>\n<\/td>\n<td>\n<p>\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c4<\/p>\n<\/td>\n<td>\n<p>\u041d\u043e\u043c\u0435\u04404<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>yyyy-mm-dd hh-mm-ss<\/p>\n<\/td>\n<td>\n<p>\u0442\u0435\u043a\u0441\u0442N<\/p>\n<\/td>\n<td>\n<p>\u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044cN<\/p>\n<\/td>\n<td>\n<p>\u041d\u043e\u043c\u0435\u0440N<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p><strong>\u041f\u043b\u0430\u043d \u0440\u0435\u0448\u0435\u043d\u0438\u044f:<\/strong><\/p>\n<p>1. \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<p>2. \u0412\u044b\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0445\u043e\u0436\u0438\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0447\u0430\u0442\u0430<\/p>\n<p>3. \u0410\u043d\u0430\u043b\u0438\u0437 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432<\/p>\n<p>4. \u041f\u043e\u0434\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0438\u0442\u043e\u0433\u043e\u0432<\/p>\n<p><strong>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445<\/strong><\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b:<\/p>\n<pre><code>%matplotlib inline import matplotlib.pyplot as plt import seaborn as sns import tqdm import pandas as pd import numpy as np import re import time from nltk.tokenize import sent_tokenize, word_tokenize import pymorphy2 morph = pymorphy2.MorphAnalyzer(lang='ru')  from nltk import edit_distance import editdistance import textdistance from jellyfish import levenshtein_distance<\/code><\/pre>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 CSV \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 DataFrame. \u0424\u043e\u0440\u043c\u0430\u0442\u044b \u0434\u0430\u0442 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043b\u043e\u0433\u0430\u0445 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u043a \u0435\u0434\u0438\u043d\u043e\u043c\u0443 \u0432\u0438\u0434\u0443. \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u043f\u043e \u043d\u043e\u043c\u0435\u0440\u0430\u043c \u0447\u0430\u0442\u043e\u0432 \u0438 \u0434\u0430\u0442\u0430\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0441\u0431\u0440\u043e\u0441\/\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432.  <\/p>\n<pre><code>df = pd.DataFrame() counter = 1 for path_iter in PATH:     print(path_iter)     df_t = pd.read_csv(path_iter, sep=';', encoding='cp1251', dtype='str', engine = 'python')     if counter == 1:         df_t['\u0414\u0430\u0442\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438'] = pd.to_datetime(df_t['\u0414\u0430\u0442\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438'], format='%d.%m.%y %H:%M')     else:         df_t['\u0414\u0430\u0442\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438'] = pd.to_datetime(df_t['\u0414\u0430\u0442\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438'], format= '%Y-%m-%d %H:%M:%S')     df = df.append(df_t)     counter += 1  df.sort_values(by=['\u041d\u043e\u043c\u0435\u0440 \u0437\u0430\u044f\u0432\u043a\u0438', '\u0414\u0430\u0442\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438'], inplace=True) df.reset_index(drop=True, inplace=True) print('\u0420\u0430\u0437\u043c\u0435\u0440 DF, rows =', len(df)) df.head()<\/code><\/pre>\n<p>&gt;&gt;&gt;&nbsp;<\/p>\n<p><em>\u0420\u0430\u0437\u043c\u0435\u0440 DF, rows = 144584<\/em><\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438 \u0434\u0435\u043b\u0430\u0435\u043c \u0432\u044b\u0432\u043e\u0434, \u0447\u0442\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0447\u0430\u0442\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u0438 \u043a\u043e\u043d\u0441\u0443\u043b\u044c\u0442\u0430\u043d\u0442\u043e\u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438. \u0418\u0437\u0440\u0435\u0434\u043a\u0430 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u044e\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b.  <\/p>\n<pre><code>df['\u041a\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b'].value_counts() &gt;&gt;&gt; ['AGENT']         \t43137 ['CONSULTANT']   \t 33040 ['USER']          \t29463 ['MANAGER']       \t21257 []                \t\t13939 ['BOT']            \t3748 Name: \u041a\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b, dtype: int64<\/code><\/pre>\n<pre><code>print('\u041a\u043e\u043b-\u0432\u043e \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0447\u0430\u0442\u043e\u0432', len(set(df['\u041d\u043e\u043c\u0435\u0440 \u0437\u0430\u044f\u0432\u043a\u0438'].tolist()))) &gt;&gt;&gt; \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0447\u0430\u0442\u043e\u0432 5406<\/code><\/pre>\n<p>\u0420\u0430\u0437\u043c\u0435\u0440 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0447\u0430\u0442\u043e\u0432 \u2013 25 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439.  <\/p>\n<pre><code>df['\u041d\u043e\u043c\u0435\u0440 \u0437\u0430\u044f\u0432\u043a\u0438'].value_counts().hist(bins = 40)<\/code><\/pre>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0442\u0435\u043a\u0441\u0442\u0430: \u043d\u0438\u0436\u043d\u0438\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440, \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0441 \u043e\u0434\u043d\u0438\u043c \u0441\u043b\u043e\u0432\u043e\u043c, \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0443\u0441\u0441\u043a\u0438\u0435 \u0431\u0443\u043a\u0432\u044b, \u043f\u0440\u043e\u0431\u0435\u043b \u0438 \u0442\u0438\u0440\u0435. \u0423\u0434\u0430\u043b\u0435\u043d\u044b \u0438\u0437 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0442\u0435\u043a\u0441\u0442\u044b \u043e \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u0438\u0434\u0430 \u00ab\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430.jpg\u00bb.  <\/p>\n<pre><code>def filter_text(text):     '''     \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442,     \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0435 \u0442\u0435\u043a\u0441\u0442.          \u0432 \u0442\u0435\u043a\u0441\u0442\u0435 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0440\u0443\u0441\u0441\u043a\u043e\u0433\u043e \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u0430, \u0442\u0438\u0440\u0435, \u043f\u0440\u043e\u0431\u0435\u043b     '''     text = text.lower()     if len(re.findall(r'[\\w]+', text)) == 1:         #print(re.findall(r'[\\w]+', text), '---', len(re.findall(r'[\\w]+', text)))         return ''     #\u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0438\u0437 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0442\u0435\u043a\u0441\u0442\u044b \u0441 \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u0438\u0434\u0430 \"\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430.jpg\"     text = re.sub(r'(.+[.]jpg)|(.+[.]pdf)', '', text)     text = [c for c in text if c in '\u0430\u0431\u0432\u0433\u0434\u0435\u0451\u0436\u0437\u0438\u0439\u043b\u043a\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u044f- ']     text = ''.join(text)     return text  df['work_text'] = df.apply(lambda row: filter_text(row['\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435']), axis = 1)<\/code><\/pre>\n<p>\u0417\u0430\u043c\u0435\u043d\u044f\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432 \u043e\u0434\u043d\u0438\u043c \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u043c.  <\/p>\n<pre><code>df['work_text'] = df.apply(lambda row: re.sub(r'\\s+', ' ', row['work_text']) , axis = 1)<\/code><\/pre>\n<p>\u0427\u0438\u0441\u0442\u0438\u043c \u043e\u0442 \u0447\u0430\u0441\u0442\u043e\u0442\u043d\u044b\u0445\/\u043d\u0435 \u0437\u043d\u0430\u0447\u0438\u043c\u044b\u0445 \u0441\u043b\u043e\u0432\u043e\u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0439:  <\/p>\n<pre><code>STOP_WORDS = [     '-', '--', '-\u0430', '-\u0431', '-\u0432', '-\u0435', '-\u0439', '-\u043a', '-\u043c', '-\u0442', '-\u0443', '-\u0445', '-\u044e', '-\u044f', '\u0430', '\u0430-', '\u0430\u0430', '\u0430\u0431',      '\u0430\u0432', '\u0430\u0434', '\u0430\u0435', '\u0430\u0436', '\u0430\u043a', '\u0430\u043c', '\u0430\u043d', '\u0430\u043e', '\u0430\u043f', '\u0430\u0441', '\u0430\u0443', '\u0430\u0447', '\u0431', '\u0431\u0430', '\u0431\u0432', '\u0431\u0434', '\u0431\u0435\u0437', '\u0431\u044b',      '\u0432', '\u0432-', '\u0432\u0430', '\u0432\u0431', '\u0432\u0432', '\u0432\u0433', '\u0432\u0438', '\u0432\u043c', '\u0432\u043d', '\u0432\u043e', '\u0432\u043f', '\u0432\u0441', '\u0432\u0442', '\u0432\u0445', '\u0432\u0449', '\u0432\u044b', '\u0432\u044e', '\u0433',      '\u0433-', '\u0433\u0430', '\u0433\u0432', '\u0433\u043a', '\u0433\u043c', '\u0433\u043e', '\u0433\u043f', '\u0433\u0443', '\u0434', '\u0434\u0430', '\u0434\u0431', '\u0434\u0432', '\u0434\u0434', '\u0434\u0435', '\u0434\u0435\u043d\u044c', '\u0434\u0438', '\u0434\u043a', '\u0434\u043b\u044f',      '\u0434\u043e', '\u0434\u043e\u0431\u0440\u043e\u0435', '\u0434\u043e\u0431\u0440\u044b\u0439', '\u0434\u0440', '\u0434\u0441', '\u0434\u0443', '\u0434\u044e', '\u0434\u044f', '\u0435', '\u0435\u0430', '\u0435\u0432', '\u0435\u0435', '\u0435\u0439', '\u0435\u043d', '\u0435\u0441', '\u0435\u044e', '\u0435\u0451',      '\u0436', '\u0436\u0435', '\u0436\u043a', '\u0436\u0440', '\u0437', '\u0437\u0430', '\u0437\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435', '\u0437\u043f', '\u0437\u0443', '\u0438', '\u0438\u0430', '\u0438\u0437', '\u0438\u043a', '\u0438\u043b', '\u0438\u043b\u0438', '\u0438\u043c', '\u0438\u043d',      '\u0438\u043e', '\u0438\u043f', '\u0438\u0443', '\u0438\u0445', '\u0439', '\u043a', '\u043a\u0430', '\u043a\u0430\u043a', '\u043a\u0432', '\u043a\u0434', '\u043a\u043a', '\u043a\u043c', '\u043a\u043e', '\u043a\u043f', '\u043a\u0440', '\u043a\u0441', '\u043b', '\u043b\u0430',      '\u043b\u0434', '\u043b\u0438', '\u043b\u043a', '\u043b\u044f', '\u043c', '\u043c\u0430', '\u043c\u0431', '\u043c\u0432', '\u043c\u0433', '\u043c\u0437', '\u043c\u0438', '\u043c\u043a', '\u043c\u043b', '\u043c\u043c', '\u043c\u043d\u0435', '\u043c\u043e', '\u043c\u0440', '\u043c\u0441',      '\u043c\u0442', '\u043c\u0443', '\u043c\u044b', '\u043c\u044d', '\u043c\u044e', '\u043c\u044f', '\u043d', '\u043d\u0430', '\u043d\u0432', '\u043d\u0435', '\u043d\u0438', '\u043d\u043d', '\u043d\u043e', '\u043d\u043f', '\u043d\u0441', '\u043d\u0443', '\u043d\u0444', '\u043d\u044b',      '\u043d\u044f', '\u043e', '\u043e\u0430', '\u043e\u0431', '\u043e\u0432', '\u043e\u0434', '\u043e\u0435', '\u043e\u0439', '\u043e\u043a', '\u043e\u043c', '\u043e\u043d', '\u043e\u043e', '\u043e\u043f', '\u043e\u0441', '\u043e\u0442', '\u043e\u0445', '\u043e\u0447', '\u043e\u044e',      '\u043f', '\u043f\u0432', '\u043f\u0438', '\u043f\u043a', '\u043f\u043b', '\u043f\u043c', '\u043f\u043d', '\u043f\u043e', '\u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430', '\u043f\u043f', '\u043f\u0440', '\u043f\u0440\u0438', '\u043f\u0441', '\u043f\u0442', '\u043f\u0444', '\u043f\u0448',      '\u043f\u044e', '\u0440', '\u0440\u0430', '\u0440\u0431', '\u0440\u0432', '\u0440\u0434', '\u0440\u0438', '\u0440\u043d', '\u0440\u043e', '\u0440\u043f', '\u0440\u0440', '\u0440\u0441', '\u0440\u0442', '\u0440\u0443', '\u0440\u0444', '\u0441', '\u0441\u0430', '\u0441\u0431',      '\u0441\u0432', '\u0441\u0433', '\u0441\u0435', '\u0441\u0436', '\u0441\u043a', '\u0441\u043b', '\u0441\u043c', '\u0441\u043d', '\u0441\u043e', '\u0441\u043f', '\u0441\u043f\u0430\u0441\u0438\u0431\u043e', '\u0441\u0440', '\u0441\u0442', '\u0441\u0443', '\u0441\u0445', '\u0441\u0447', '\u0442',      '\u0442-', '\u0442\u0430', '\u0442\u0431', '\u0442\u0432', '\u0442\u0433', '\u0442\u0434', '\u0442\u0435', '\u0442\u0438', '\u0442\u043a', '\u0442\u043d', '\u0442\u043e', '\u0442\u043f', '\u0442\u0440', '\u0442\u0443', '\u0442\u0446', '\u0442\u0447', '\u0442\u044b', '\u0443',      '\u0443\u0432', '\u0443\u0436', '\u0443\u043a', '\u0443\u043b', '\u0443\u0440', '\u0443\u0442\u0440\u043e', '\u0443\u0445', '\u0443\u0447', '\u0443\u044f', '\u0444', '\u0444\u0433', '\u0444\u0434', '\u0444\u0437', '\u0444\u043d', '\u0444\u0444', '\u0444\u0446', '\u0445', '\u0445\u0433',      '\u0445\u043c', '\u0445\u043e', '\u0446', '\u0446\u0431', '\u0446\u043d', '\u0447', '\u0447\u0431', '\u0447\u0435', '\u0447\u043f', '\u0447\u0441', '\u0447\u0442', '\u0447\u0442\u043e', '\u0448', '\u044b', '\u044c', '\u044d', '\u044d\u0433', '\u044d\u043b', '\u044d\u043f',      '\u044d\u0440', '\u044d\u0442', '\u044d\u0445', '\u044e', '\u044e\u0430', '\u044e\u0432', '\u044e\u0433', '\u044e\u043b', '\u044e\u0440', '\u044e\u0441', '\u044f', '\u044f\u0433', '\u044f\u044f', '\u0451',     '\u044f', '\u0441\u0435\u0439\u0447\u0430\u0441', '\u044d\u0442\u043e', '\u0435\u0449\u0451', '\u043f\u043e\u043d\u044f\u0442\u043d\u043e', '\u043e\u0442\u043b\u0438\u0447\u043d\u043e', '\u0438\u0437\u0432\u0438\u043d\u0438\u0442\u044c','\u0438\u0437\u0432\u0438\u043d\u0438\u0442\u0435','\u0433\u0434\u0435' ]  #DF \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 df_users = df[df['\u041a\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b'] == '''['USER']'''] [df_users.work_text.replace(x, '', regex=True, axis = 1, inplace=True) for x in STOP_SENTS]<\/code><\/pre>\n<p>\u041f\u0440\u0438\u0432\u043e\u0434\u0438\u043c \u0441\u043b\u043e\u0432\u0430 \u043a \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0435, \u0443\u0434\u0430\u043b\u0438\u043c \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u0430 \u0447\u0430\u0441\u0442\u043e\u0442\u043d\u044b\u0435 \u0441\u043b\u043e\u0432\u0430  <\/p>\n<pre><code>def normalize_text(text):     '''     \u0438\u0434\u0435\u043c \u043f\u043e \u0432\u0441\u0435\u043c \u0442\u043e\u043a\u0435\u043d\u0430\u043c,      \u0442\u043e \u0447\u0442\u043e \u0432 STOP_WORDS - \u0432\u044b\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u043c,     \u043c\u0435\u043d\u044f\u0435\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u043d\u0430 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0444\u043e\u0440\u043c\u0443,     \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u043c,     \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0442\u0435\u043a\u0441\u0442     '''     ls = list()     for word in word_tokenize(text, language='russian'):         if word not in STOP_WORDS:             ls.append(morph.parse(word)[0].normal_form)      norm_text = ' '.join([x for x in ls])     return norm_text  df_users['clear_text'] = df_users.work_text df_users['clear_text'] = df_users.apply(lambda row: normalize_text(row.clear_text), axis = 1)<\/code><\/pre>\n<p><strong>\u0412\u044b\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e\u0445\u043e\u0436\u0438\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0447\u0430\u0442\u0430<\/strong><\/p>\n<p>\u041d\u0430\u0439\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u041b\u0435\u0432\u0435\u043d\u0448\u0442\u0435\u0439\u043d\u0430 \u0432\u0441\u0435\u0445 \u0437\u0430\u044f\u0432\u043e\u043a \u043f\u043e \u0432\u0441\u0435\u043c \u0442\u0435\u043a\u0441\u0442\u0430\u043c:<\/p>\n<pre><code>def get_edit_distance(sec_posts, val_leven):     '''     sec_posts - list \u0441 \u043f\u043e\u0441\u0442\u0430\u043c\u0438 \u0447\u0430\u0442\u0430     val_leven - \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0440\u0435\u0434\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043f\u043e \u041b\u0435\u0432\u0435\u043d\u0448\u0442\u0435\u0439\u043d\u0443:                  ratio_ed = editdistance \/ \u0434\u043b\u0438\u043d\u0443 \u0442\u0435\u043a\u0441\u0442\u0430     '''     ls = []     len_sec_posts = len(sec_posts)     sec_posts_iter = 0     for i in sec_posts:         sec_posts_iter += 1 #\u043d\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c \u043f\u043e \u0442\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0436\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u043b\u0438         for k in sec_posts[sec_posts_iter:]:             #ed = edit_distance(i, k)             #ed = textdistance.levenshtein(i, k)             #ed = levenshtein_distance(i, k)             ed = editdistance.eval(i, k)             if len(k) == 0:                 ratio_ed = 0             else:                 ratio_ed = ed \/ len(k)             if len(k) !=0 and len(i) != 0 and ratio_ed &lt;= val_leven:                 ls.append([i, k, ratio_ed, ed])     #list [post1, post2, ratio_ed, ed]     return ls   CURRENT_LEV_VALUE = 0.25  #\u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043d\u043e\u043c\u0435\u0440\u0430 \u0437\u0430\u044f\u0432\u043e\u043a: number_orders = set(df_users[(df_users['\u041a\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b'] == '''['USER']''')]['\u041d\u043e\u043c\u0435\u0440 \u0437\u0430\u044f\u0432\u043a\u0438'].tolist())  #\u041d\u0430\u0439\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u041b\u0435\u0432\u0435\u043d\u0448\u0442\u0435\u0439\u043d\u0430 \u043f\u043e \u0432\u0441\u0435\u043c \u0444\u0440\u0430\u0437\u0430\u043c, \u0432\u0441\u0435\u0445 \u0437\u0430\u044f\u0432\u043e\u043a: all_dic = {} for i_order in tqdm.tqdm(number_orders):       posts_list = df_users[(df_users['\u041a\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b'] == '''['USER']''') &amp; (df_users['\u041d\u043e\u043c\u0435\u0440 \u0437\u0430\u044f\u0432\u043a\u0438'] == i_order)]['clear_text'].tolist()     all_dic[i_order] = get_edit_distance(posts_list, CURRENT_LEV_VALUE)<\/code><\/pre>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u044b\u043b\u0430 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0430 \u0441\u0430\u043c\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u0440\u0435\u0434\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u041b\u0435\u0432\u0435\u043d\u0448\u0442\u0435\u0439\u043d\u0430 \u2013 editdistance.<\/p>\n<p>\u0420\u0430\u0441\u0447\u0435\u0442 \u0437\u0430\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445 \u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 29463 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0447\u0430\u0442\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043d\u0438\u0436\u0435. \u0412 \u0442\u0435\u0441\u0442\u0435 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0438&nbsp;<strong>import edit_distance, import editdistance, import textdistance, from jellyfish import<\/strong>:<\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 editdistance \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u0435\u0435 \u0430\u043d\u0430\u043b\u043e\u0433\u043e\u0432 \u043e\u0442 18 \u0434\u043e 31 \u0440\u0430\u0437\u0430.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u0443\u044e \u0441\u0445\u043e\u0436\u0435\u0441\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u0435\u0442\u0440\u0438\u043a\u0443 CURRENT_LEVEN, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u0440\u0435\u0434\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044e \u0434\u0432\u0443\u0445 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u043a \u0434\u043b\u0438\u043d\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430 \u2014 editdistance (text1, text2)\/ \u0434\u043b\u0438\u043d\u0443 \u0442\u0435\u043a\u0441\u0442\u0430(text1).<\/p>\n<p>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 CURRENT_LEVEN \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043e\u043f\u044b\u0442\u043d\u044b\u043c \u043f\u0443\u0442\u0435\u043c. \u041f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u043e\u043f-\u0441\u043b\u043e\u0432. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0441\u0440\u0435\u0434\u043d\u0435\u0439 \u0434\u043b\u0438\u043d\u044b \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0438 \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u0443\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f. \u0412 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 CURRENT_LEVEN \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u043b 0.25.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p><strong>\u0410\u043d\u0430\u043b\u0438\u0437 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432<\/strong><\/p>\n<p>\u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f dataframe \u0438\u0437 \u0440\u0430\u0441\u0447\u0435\u0442\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445:<\/p>\n<pre><code>df_rep_msg = pd.DataFrame(ls, columns=['id_order', 'clear_msg', 'clear_msg2', 'ratio_dist', 'ed_dist']) df_rep_msg['id_rep_msg'] =  df_rep_msg.reset_index()['index'] +1  df_rep_msg.head()<\/code><\/pre>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0420\u0430\u0437\u0432\u043e\u0440\u043e\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 \u0441\u0442\u0440\u043e\u043a\u0438:  <\/p>\n<pre><code>df1 = df_rep_msg[['id_order','clear_msg','ratio_dist','ed_dist', 'id_rep_msg']] df2 = df_rep_msg[['id_order','clear_msg2','ratio_dist','ed_dist', 'id_rep_msg']] df2.columns = ['id_order','clear_msg','ratio_dist','ed_dist','id_rep_msg'] df_rep_msg = pd.concat([df1, df2], axis=0).sort_values(by=['id_order'], ascending=[True]) del df1 del df2 df_rep_msg.drop_duplicates(inplace=True) df_rep_msg.head(10)<\/code><\/pre>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0438 \u043a \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c\u0443 df_users_rep_msg  <\/p>\n<pre><code>df_users_rep_msg = pd.merge(     df_users, df_rep_msg, how='left',      left_on=['clear_text','\u041d\u043e\u043c\u0435\u0440 \u0437\u0430\u044f\u0432\u043a\u0438'],     right_on=['clear_msg','id_order'] ) df_users_rep_msg[df_users_rep_msg.clear_msg.notnull()][     ['\u0414\u0430\u0442\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438', '\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435', '\u041a\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b', '\u041d\u043e\u043c\u0435\u0440 \u0437\u0430\u044f\u0432\u043a\u0438', 'clear_msg', 'ratio_dist', 'ed_dist','id_rep_msg'] ].head()<\/code><\/pre>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 6 \u0440\u0430\u0437 \u0432 \u043e\u0434\u043d\u043e\u043c \u0447\u0430\u0442\u0435  <\/p>\n<pre><code>count_ser = df_users_rep_msg[df_users_rep_msg.id_rep_msg.notnull()]['id_rep_msg'].value_counts() filt = count_ser[count_ser &gt;<\/code><\/pre>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-324509","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/324509","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=324509"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/324509\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=324509"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=324509"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=324509"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}