def get_texts_stat(self, mode='train'): # Готовим данные env = Environment() if mode == 'train': file_res = env.filename_results_csv() if mode == 'test': file_res = env.filename_stat_test_csv() authors = pd.read_csv(env.filename_authors_csv(), index_col='idauthor', encoding='utf-8') data = pd.read_csv(file_res, index_col='idstat', encoding='utf-8') data.drop(columns=['file', 'idchunk'], inplace=True) columns = data.columns group = data.groupby(['idtext', 'idauthor', 'author', 'name']) group = group.agg({ 'sentences_text': ['mean'], 'words_text': ['mean'], 'sentence_mean': ['mean'], 'sentences_chunk': ['mean'], 'words_chunk': ['mean'], 'words_uniq_chunk': ['mean'], 'uniq_per_sent_chunk': ['mean'], 'uniq_per_words_chunk': ['mean'], 'NOUN': ['mean'], 'ADJF': ['mean'], 'ADJS': ['mean'], 'COMP': ['mean'], 'VERB': ['mean'], 'INFN': ['mean'], 'PRTF': ['mean'], 'PRTS': ['mean'], 'GRND': ['mean'], 'NUMR': ['mean'], 'ADVB': ['mean'], 'NPRO': ['mean'], 'PRED': ['mean'], 'PREP': ['mean'], 'CONJ': ['mean'], 'PRCL': ['mean'], 'INTJ': ['mean'], 'predict': ['sum'] }) group.columns = columns[4:] group.reset_index(inplace=True) data = pd.merge(group, authors, on='idauthor', how='left', suffixes=('', '_author')) if mode == 'test': data['predict'] = data['predict'].astype(int) data = pd.merge(data, authors, left_on='predict', right_on='idauthor', how='left', suffixes=('', '_predict')) return data
def authors(self, mode=0): env = Environment() df = pd.DataFrame() filename = env.filename_authors_csv() try: df = pd.read_csv(filename, index_col='idauthor', encoding='utf-8') except: env.debug(1, ['Failed to load authors CSV file', filename]) else: env.debug(1, ['Load authors CSV file', filename]) if mode == 1: return df.to_dict().get('name') else: return df
def analyze_text(self, columns, text_to_analyze, index=0, idauthor=0, name='', file_txt='', max_words=0): env = Environment() t_start = timer() env.debug( 1, ['Analyzer', 'analyze_text', 'START file TXT: %s' % file_txt]) enc = Word_Encoder() postg = POSTagger() corpus = OpenCorpus() dfgram = corpus.grammemes() file_authors = env.filename_authors_csv() #Информация об авторах authors = pd.read_csv(file_authors, index_col='idauthor', encoding='utf-8') dfres = pd.DataFrame() #Пустой dataframe для сохранения результат #Preprocessing: выполнить прдварительную обработку текста #max_words = 6000 achunks = self.preprocessor(text_to_analyze, max_words) #print(achunks) n_chunks = len(achunks) # на сколько частей разделён текст #на выходе получили массив, каждывй элемент которого содеоржит число предложений, число слов в тексте, массив со словами env.debug(1, [ 'Analyzer', 'analyze_text', '%s sentences %s words in %s chunks' % (achunks[0][0], achunks[0][1], n_chunks) ]) #print(n_chunks) a_text_corp = [] id_chunk = 0 for chunk in achunks: t_start = timer() #prepare data n_sent_all = chunk[0] n_words_all = chunk[1] n_sent_len_mean = chunk[2] n_sent_chunk = chunk[3] n_words_chunk = chunk[4] a_text_words = chunk[5] #print(n_sent_all, n_words_all, n_sent_len_mean, n_sent_chunk, n_words_chunk, a_text_words) #print(len(a_text_words)) # Vectorize - к каждой части относимся как к индивидуальному тексту vectorizer = CountVectorizer(encoding='utf-8', token_pattern=r"(?u)\b\w+\b") #Преобразуем все слова в матрицу из одной строки (0) и множества колонок, где каждому слову соотвествует # колонка, а количество вхождений слова в документе - значение в этой колонке #print([' '.join(map(str,a_text_words))]) X = vectorizer.fit_transform([' '.join(map(str, a_text_words))]) #print(X) n_words_chunk_check = X.sum( ) #Сколько всего слов в документе, который обрабатываем #print(n_words_chunk, n_words_chunk_check) #print(vectorizer.get_stop_words()) env.debug(1, [ 'Analyzer', 'analyze_text', 'START process chunk %s/%s with %s words' % (id_chunk, n_chunks - 1, n_words_chunk) ]) word_freq = np.asarray(X.sum(axis=0)).ravel( ) #для каждого слова его суммарное число (т.к. у нас одна строка == числу в ней) #print(vectorizer.get_feature_names()) #print(X) zl = zip(vectorizer.get_feature_names(), word_freq) # words, count #print(list(zl)) data_cols = ['gram', 'gram_voc', 'gram_ml'] data = pd.DataFrame(list(zl), columns=['word', 'count']) for col in data_cols: data[col] = '' t_end = timer() env.debug( 1, ['Ready for POS:', 'time:', env.job_time(t_start, t_end)]) t_start = timer() data = postg.pos(data) #print(data) t_end = timer() env.debug(1, ['POS tagged:', 'time:', env.job_time(t_start, t_end)]) t_start = timer() grouped = data.sort_values('gram').groupby(['gram']).agg( {'count': ['sum']}) grouped.columns = ['n_POS'] grouped.reset_index(inplace=True) grouped['f_POS'] = grouped['n_POS'] / n_words_chunk #grouped.drop(columns=['n_POS'], inplace=True) #print(grouped) #print(grouped.set_index('gram').T) grouped = pd.merge( dfgram, grouped, left_on='name', right_on='gram', how='left').drop( columns=['alias', 'description', 'name', 'n_POS']).fillna( 0).set_index('gram').T #grouped = pd.merge(dfgram, grouped, left_on='name', right_on='gram', how='left').fillna(0).set_index('gram') #print(grouped) #print(grouped.values.ravel()) index_author = authors.index.get_loc(idauthor) n_uniq_words = data.shape[0] s_chunk = pd.Series({ 'idtext': index, 'idchunk': id_chunk, 'idauthor': idauthor, 'author': authors.at[index_author, 'shortname'], 'name': name, 'file': file_txt, 'sentences_text': np.int64(n_sent_all), 'words_text': np.int64(n_words_all), 'sentence_mean': n_sent_len_mean, 'sentences_chunk': np.int64(n_sent_chunk), 'words_chunk': np.int64(n_words_chunk), 'words_uniq_chunk': np.int64(n_uniq_words), 'uniq_per_sent_chunk': round(n_uniq_words / n_sent_chunk, 4), 'uniq_per_words_chunk': round(n_uniq_words / n_words_chunk, 4) }) s_chunk = pd.concat( [s_chunk, pd.Series(grouped.values.ravel())], ignore_index=True) s_chunk = pd.concat([s_chunk, pd.Series([np.nan])], ignore_index=True) #print(s_chunk) #print(grouped) t_end = timer() env.debug(1, ['Analyzed', 'time:', env.job_time(t_start, t_end)]) dfres = dfres.append(s_chunk, ignore_index=True) #dfres = env.downcast_dtypes(dfres) id_chunk = id_chunk + 1 print(dfres) print(columns) dfres.columns = columns return dfres