コード例 #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)
コード例 #2
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'))
コード例 #3
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)
コード例 #4
0
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)
コード例 #5
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)
コード例 #6
0
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)
コード例 #7
0
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'))