Пример #1
0
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)
Пример #3
0
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'))
Пример #4
0
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)
Пример #5
0
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)
Пример #6
0
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)
Пример #8
0
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'))