def show(): """ KH Coder """ # 基本情報 basic_data = get_basic_data(title='KH Coder', active_url='KH-coder') # 江戸川乱歩作品関連の情報 novels_data = get_novels_tuple(col1='name', col2='file_name') # リクエストがGETならば if request.method == 'GET': session.clear() return render_template('khcoder/index.html', basic_data=basic_data, novels_data=novels_data) # 利用者から送られてきた情報を基にデータ整理 name, file_name = request.form['name'].split('-') # csvダウンロード設定 dl_data = dict(file_name=file_name, dl_type='khcoder', new_name=file_name) # 送信するデータの作成 sent_data = dict(name=name, file_name=file_name, df=get_khcoder_df(file_name)) return render_template('khcoder/index.html', basic_data=basic_data, novels_data=novels_data, sent_data=sent_data, dl_data=dl_data)
def full_screen(target): # 基本情報 basic_data = get_basic_data(title='共起ネットワーク:結果全画面', active_url='co_oc_network') return render_template('co_oc_network/full_screen.html', basic_data=basic_data, target=target)
def result(): """ データの集計 """ # 基本情報 basic_data = get_basic_data(title='データの集計', active_url='aggregation') # 形態素解析器の説明文 description = dict(mrph=morphological_analysis_description(), csv_sample=csv_file_description()) # 江戸川乱歩作品関連の情報 edogawa_data = dict(hinshi_dict=get_hinshi_dict(), name_file=get_novels_tuple(col1='name', col2='file_name')) # 入力データの形式 input_data = InputAggregation(request, session) # セッション切れの場合 if not input_data.data_type: session.clear() flash('セッションが切れました。再度データを選択してください。', 'error') return render_data_selection(basic_data, edogawa_data, description) # 利用者から送られてきた情報の取得 option = OptionAggregation(request) # 品詞の含有数でソート input_data.hinshi_sort() # 品詞が1つも選択されていない場合 if not option.hinshi_jpn: flash('品詞が選択されていません。', 'error') option.set_errors('hinshi', '品詞が選択されていません。') return render_options(basic_data, input_data, option=option.__dict__) # データの集計処理 try: result_df, file_name = create_aggregation( input_data.mrph_type, input_data.csv_name, target_hinshi=option.hinshi_jpn) except: flash('ファイル形式が正しくありません。(入力形式に沿ってください)', 'error') input_data.set_errors('csv_file_invalid', 'ファイル形式が正しくありません。(入力形式に沿ってください)') return render_data_selection(basic_data, edogawa_data, description, input_data=input_data.__dict__) # csvダウンロード設定 dl_data = dict(file_name=file_name, dl_type='result', new_name=f'{input_data.name}の集計結果') # 結果情報を格納 result_data = dict(file_name=file_name, html_file_name=file_name, df=result_df[:51]) try: return render_result(basic_data, result_data, dl_data, input_data.get_table_dict(), option.get_table_dict()) except: return redirect(url_for('aggregation.data_selection'))
def options(): """ データの集計 設定画面 """ # 基本情報 basic_data = get_basic_data(title='データの集計', active_url='aggregation') # 形態素解析器の説明文 description = dict(mrph=morphological_analysis_description(), csv_sample=csv_file_description()) # 江戸川乱歩作品関連の情報 edogawa_data = dict(hinshi_dict=get_hinshi_dict(), name_file=get_novels_tuple(col1='name', col2='file_name')) # 入力データの設定 input_data = InputAggregation(request, session) # セッション切れの場合 if not input_data.data_type: session.clear() flash('セッションが切れました。再度データを選択してください。', 'error') return render_data_selection(basic_data, edogawa_data, description) # errorがあれば if input_data.__dict__.get('errors'): return render_data_selection(basic_data, edogawa_data, description, input_data=input_data.__dict__) # 入力CSVの列名チェック if input_data.data_type == 'csv' and not valid_agg_columns( input_data.csv_name): flash('集計に必要なデータがありません。', 'error') input_data.set_errors('csv_file_invalid', '集計に必要なデータがありません。') return render_data_selection(basic_data, edogawa_data, description, input_data=input_data.__dict__) # 品詞がない場合 if not input_data.hinshi: flash('品詞がありません。入力データの形式を確認してください。', 'error') input_data.set_errors('csv_file_invalid', '品詞がありません。入力データの形式を確認してください。') return render_data_selection(basic_data, edogawa_data, description, input_data=input_data.__dict__) # 品詞の含有数でソート input_data.hinshi_sort() # sessionの登録 session['data_type'] = input_data.data_type session['input_name'] = input_data.name session['input_csv_name'] = input_data.csv_name session['mrph_type'] = input_data.mrph_type return render_options(basic_data, input_data)
def show(): """ テキストの前処理 """ # 基本情報 basic_data = get_basic_data(title='テキストの前処理', active_url='preprocessing') # その他設定の項目取得 other_option = get_other_option_dict() # 詳細説明追加 description = dict(other_options=preprocessing_other_options_description()) if request.method == 'GET': return render_index(basic_data, other_option, description) # 利用者から送られてきた情報を取得 texts = request.form.get('texts') # textsがない場合 if not texts: flash('テキストが入力されていません。', 'error') error = dict(texts='テキストが入力されていません。') return render_index(basic_data, other_option, description, dict(errors=error)) input_data = dict(texts=texts) remove_words = request.form['remove_texts'] remove_word_in_texts = request.form['remove_text_in_texts'] replace_words = request.form['replace_texts'] other_options = request.form.getlist('other_option') # 選択されたその他設定を取得 selected_option = [other_option.get(k) for k in other_options] # 送られてきた情報を基にテキストを前処理 preprocessed_text, errors = texts_preprocessing(texts, remove_words, remove_word_in_texts, replace_words, other_options) # 送るデータの辞書 option = dict( remove_texts=remove_words, replace_texts=replace_words, remove_text_in_texts=remove_word_in_texts, other_option=selected_option, ) # エラーがある場合 if errors: for error in errors.values(): flash(error, 'error') option['errors'] = errors return render_index(basic_data, other_option, description, input_data, option) # 送るデータをまとめる result = dict(preprocessed_texts=preprocessed_text) return render_result(basic_data, other_option, description, input_data, option, result)
def show(): """ 作品情報 """ # 基本情報 basic_data = get_basic_data(title='作品情報', active_url='information') # 江戸川乱歩作品関連の情報 edogawa_merge_df = get_edogawa_merge_df(drop_duplicates=True) return render_template('information/index.html', basic_data=basic_data, edogawa_merge_df=edogawa_merge_df, mrphs=['MeCab', 'Jumanpp'])
def options(): """ 共起ネットワーク 設定画面 """ # 基本情報 basic_data = get_basic_data(title='共起ネットワーク:設定画面', active_url='co_oc_network') # 形態素解析器の説明文 description = dict(mrph=morphological_analysis_description(), categorization=categorization_description(), co_oc_strength=co_oc_strength_description(), csv_sample=csv_file_description()) # 江戸川乱歩作品関連の情報 edogawa_data = dict(hinshi_dict=get_hinshi_dict(), name_file=get_novels_tuple(col1='name', col2='file_name')) # 入力データの設定 input_data = InputCoOcNetwork(request, session) # セッション切れの場合 if not input_data.data_type: session.clear() flash('セッションが切れました。再度データを選択してください。', 'error') return render_data_selection(basic_data, edogawa_data, description) # errorがあれば if input_data.__dict__.get('errors'): return render_data_selection(basic_data, edogawa_data, description, input_data=input_data.__dict__) # 品詞がない場合 if not input_data.hinshi: flash('品詞がありません。入力データの形式を確認してください。', 'error') input_data.set_errors('csv_file_invalid', '品詞がありません。入力データの形式を確認してください。') return render_data_selection(basic_data, edogawa_data, description, input_data=input_data.__dict__) # sessionの登録 session['data_type'] = input_data.data_type session['input_name'] = input_data.name session['input_csv_name'] = input_data.csv_name session['is_used_category'] = input_data.is_used_category session['mrph_type'] = input_data.mrph_type session['has_category'] = input_data.has_category_list() return render_options(basic_data, edogawa_data, description, input_data)
def data_selection(): """ データの集計 データの選択画面 """ # 基本情報 basic_data = get_basic_data(title='データの集計', active_url='aggregation') # 形態素解析器の説明文 description = dict(mrph=morphological_analysis_description(), csv_sample=csv_file_description()) # 江戸川乱歩作品関連の情報 edogawa_data = dict( name_file=get_novels_tuple(col1='name', col2='file_name')) session.clear() return render_data_selection(basic_data, edogawa_data, description)
def data_selection(): """ 共起ネットワーク データの選択画面 """ # 基本情報 basic_data = get_basic_data(title='共起ネットワーク:データ選択', active_url='co_oc_network') # 形態素解析器の説明文 description = dict(mrph=morphological_analysis_description(), categorization=categorization_description(), csv_sample=csv_file_description()) # 江戸川乱歩作品関連の情報 edogawa_data = dict( name_file=get_novels_tuple(col1='name', col2='file_name')) # セッションをクリア session.clear() return render_data_selection(basic_data, edogawa_data, description)
def show(): """ 形態素解析 """ # 基本情報 basic_data = get_basic_data(title='形態素解析', active_url='morph_analysis') # 形態素解析器の説明文 description = dict(mrph=morphological_analysis_description(), categorization=categorization_description(), csv_sample=csv_file_description()) # リクエストがGETならば if request.method == 'GET': session.clear() return render_index(basic_data, description) # 送信されたデータの取得と形態素解析器の種類 text = request.form.get('words') mrph_type = request.form.get('mrph_type') # テキストが入力されなかった場合 if not text: flash('テキストが入力されていません。', 'error') return render_index(basic_data, description) option = dict(text=text, mrph_type=mrph_type) # 形態素解析 mrph_df = mrph_analysis(mrph_type, text) # 形態素解析の結果が返ってこなかった場合 if mrph_df.empty: flash('解析に失敗しました。テキストデータが大きすぎます。', 'error') return render_index(basic_data, description, option) # mrph_dfをcsvとして保存し、csv_nameを取得 csv_name = save_df(mrph_df) # 結果のデータ群 result = dict(df=mrph_df, file_name=csv_name, dl_type='result', new_name=f'{mrph_type}による形態素解析結果') return render_result(basic_data, description, option, result)
def result(): """ 共起ネットワーク 結果表示画面 """ # 基本情報 basic_data = get_basic_data(title='共起ネットワーク:結果画面', active_url='co_oc_network') # 形態素解析器の説明文 description = dict(mrph=morphological_analysis_description(), categorization=categorization_description(), co_oc_strength=co_oc_strength_description(), csv_sample=csv_file_description()) edogawa_data = dict(hinshi_dict=get_hinshi_dict(), name_file=get_novels_tuple(col1='name', col2='file_name')) # 入力データの形式 input_data = InputCoOcNetwork(request, session) # セッション切れの場合 if not input_data.data_type: session.clear() flash('セッションが切れました。再度データを選択してください。', 'error') return render_data_selection(basic_data, edogawa_data, description) # 利用者から送られてきた情報の取得 option = OptionCoOcNetwork(request) # 品詞が1つも選択されなかった場合 if not option.hinshi: flash('「可視化対象の品詞」が1つも選択されていません。', 'error') option.set_errors('hinshi', '品詞が選択されていません。') # 共起数が0以下だった場合 if option.number < 1: flash('「共起関係上位」は1以上で設定してください。', 'error') option.set_errors('number', '1以上で設定してください。') # 共起頻度の最小値が0以下だった場合 if option.co_oc_freq_min < 1: flash('「共起頻度の最小値」は1以上で設定してください。', 'error') option.set_errors('co_oc_freq_min', '1以上で設定してください。') # edogawa選択、カテゴリごとの表示選択、章がある作品において、チェックが一つもなかった場合 if input_data.data_type == 'edogawa' and input_data.is_used_category and int( session.get('has_category')) and not option.category: flash('「カテゴリー選択(3Dのみ)」が1つも選択されていません。', 'error') option.set_errors('category', 'カテゴリーが選択されていません。') # errorがあれば if option.__dict__.get('errors'): return render_options(basic_data, edogawa_data, description, input_data, option=option.__dict__) # 共起ネットワーク作成 try: csv_file_name, co_oc_df = create_network( file_name=input_data.csv_name, target_hinshi=option.hinshi, target_num=option.number, remove_words=option.remove_words, remove_combi=option.remove_combi, target_words=option.target_words, data_type=input_data.data_type, is_used_3d=option.is_3d, used_category=input_data.is_used_category, synonym=option.synonym, selected_category=option.category, target_coef=option.target_coef, strength_max=option.strength_max, mrph_type=input_data.mrph_type, co_oc_freq_min=option.co_oc_freq_min, dimension=option.dimension) if option.is_3d: html_file_name = create_3d_network( co_oc_df, target_num=option.number, used_category=input_data.is_used_category, category_list=option.category, target_coef=option.target_coef) else: html_file_name = csv_file_name except: import traceback traceback.print_exc() flash('ファイル形式が正しくありません。(入力形式に沿ってください)', 'error') input_data.set_errors('csv_file_invalid', 'ファイル形式が正しくありません。(入力形式に沿ってください)') return render_data_selection(basic_data, edogawa_data, description, input_data=input_data.__dict__) # 設定項目の保存 options_filename = create_random_string(32) options_dict = dict(**input_data.get_table_dict(), **option.get_table_dict()) pd.DataFrame(options_dict.items(), columns=['入力項目', '設定項目']).to_csv(f'tmp/{options_filename}.csv', index=False, encoding='utf_8_sig') # データダウンロード設定 dl_data = dict( file_name=csv_file_name, dl_type='result', new_name=f'{input_data.name}_{"-".join(option.hinshi)}_{option.number}', options_filename=options_filename) # 結果情報を格納 result_data = dict(file_name=csv_file_name, html_file_name=html_file_name, co_oc_df=co_oc_df[:option.number]) try: return render_result(basic_data, result_data, dl_data, input_data.get_table_dict(), option.get_table_dict()) except: return redirect(url_for('network.data_selection'))