Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
 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
Ejemplo n.º 3
0
    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