Data-Driven System Development/절차서 검증을 위한 자연어처리 기술 개발

절차서 검증을 위한 자연어처리 기술 개발(문서 검증)

Data Jun 2024. 6. 29. 10:14

 

형식 검증

  1. 순위 검증

 


import pandas as pd
import numpy as np

def check_sequence_and_start_order(data):
    """
    주어진 번호 매기기(numbering sequence) 값을 이용하여 형식검증을 진행합니다.

    Args:
        data (DataFrame): 업데이트할 데이터 프레임.

    Returns:
        DataFrame: 업데이트된 데이터 프레임.
    """
    # 'None' 값이 있는 행 제거
    data = data.dropna(subset=['Numbering Sequence'])
    data['Verification Content'] = 'Normal'
    data['Verification Result'] = True

    data = refine_numbering_sequence(data)

    # 데이터가 비어 있는 경우를 확인
    if data.empty:
        return True, "None Type pass", []

    return data

def refine_numbering_sequence(data):
    """
    번호 매기기 순서를 정제합니다.
    """
    data['Numbering Sequence'] = data['Numbering Sequence'].astype(str)

    # 숫자 시퀀스 추출
    numeric_part = data['Numbering Sequence'].str.extract(r'(\d+)')[0].dropna().astype(int)
    # 알파벳 시퀀스 추출
    alphabetic_part = data['Numbering Sequence'].str.extract(r'([a-zA-Z]+)')[0].dropna()

    data.loc[~numeric_part.index.isin(data.index), 'Verification Content'] = 'No numeric part'
    data.loc[~alphabetic_part.index.isin(data.index), 'Verification Content'] = 'No alphabetic part'

    return data

def is_numeric_sequence_ordered(sequence):
    """
    숫자 시퀀스가 올바른 순서인지 확인합니다.
    """
    first_index = sequence.index[0]
    if sequence['Numbering Sequence'].iloc[0] != 1:
        sequence.at[first_index, 'Verification Content'] = 'The beginning of the Numeric sequence was wrong.'
        sequence.at[first_index, 'Verification Result'] = False

def is_alphabetic_sequence_ordered(sequence):
    """
    알파벳 시퀀스가 올바른 순서인지 확인합니다.
    """
    first_index = sequence.index[0]
    if sequence['Numbering Sequence'].iloc[0] != 'A':
        sequence.at[first_index, 'Verification Content'] = 'The beginning of the Alphabetic sequence was wrong.'
        sequence.at[first_index, 'Verification Result'] = False

# 예제 데이터
data = pd.DataFrame({
    'Numbering Sequence': ['A1', 'B2', 'C3', np.nan, 'D4']
})

# 함수 호출
updated_data = check_sequence_and_start_order(data)
print(updated_data)

 

 

개발된 알고리즘은 같은 부모의 문단에 속한 시퀀스를 활용하여 문단 구조를 세밀하게 분석하고, 이를 통해 데이터 형식 검증의 결과로 전환함. 이 과정을 통해 추출된 데이터는 체계적이고 자동화된 방식으로 데이터베이스(DB)에 저장됨.

 

  2. 레벨과 넘버링 타입의 일관성 검증

import pandas as pd

def verification_level_numberingtype(data, level_bowl):
    """
    데이터 프레임에서 'Level'과 'Numbering Type'의 일관성을 검증합니다.

    Args:
        data (DataFrame): 검증할 데이터 프레임.
        level_bowl (list): 검증할 레벨들을 포함하는 리스트.

    Returns:
        DataFrame: 검증 결과가 업데이트된 데이터 프레임.
    """
    # 제외할 타입 정의
    exclude_types = ['NOTE', 'Bullet', 'No Type', 'NOTE:n']
    point_five_exclude_types = ['NOTE:', 'NOTE:n', 'NOTE:n.']
    section_types = ['CoverPage', 'RevisionSummary', 'TOC']

    # 초기 검증 결과값 설정
    data['Verification Content'] = 'Normal'
    data['Verification Result'] = True
    data['Numbering Type Change'] = data['Numbering Type']

    # 각 레벨에 대해 검증 수행
    for level in level_bowl:
        level_dataset = data[data['Level'] == level]

        # 특정 숫자 콤보에 대한 처리
        if level != 1:
            filtered_data = level_dataset[~level_dataset['Numbering Type'].isin(exclude_types)]
            mode_series = filtered_data['Numbering Type'].mode()
        else:
            filtered_data = level_dataset[~level_dataset['Numbering Type'].isin(point_five_exclude_types)]
            mode_series = filtered_data['Numbering Type'].mode()

        # 모든 값이 같은 경우 검증 결과 업데이트
        if not mode_series.empty:
            level_mode = mode_series.iloc[0]

            for index, row in filtered_data.iterrows():
                if row['Numbering Type'] not in exclude_types and row['Numbering Type'] != level_mode and 'SECTION' not in row:
                    data.at[index, 'Verification Content'] = 'Level and numbering type don\'t match.'
                    data.at[index, 'Verification Result'] = False
                    data.at[index, 'Numbering Type Change'] = level_mode
                elif row['Numbering Type'] not in point_five_exclude_types and row['Numbering Type'] not in level_mode and 'SECTION' not in row:
                    data.at[index, 'Verification Content'] = 'Level and numbering type don\'t match.'
                    data.at[index, 'Verification Result'] = False
                    data.at[index, 'Numbering Type Change'] = level_mode + ':NOTE' + 'NOTE:n' + 'NOTE:n.'

    data['Verification Type'] = 'Verifying the Level and Numbering'

    return data

# 예제 데이터 프레임
data = pd.DataFrame({
    'Level': [1, 1, 2, 2, 3],
    'Numbering Type': ['A1', 'B2', 'C3', 'D4', 'E5']
})

# 함수 호출
level_bowl = [1, 2, 3]
updated_data = verification_level_numberingtype(data, level_bowl)
print(updated_data)

 

 

개발된 알고리즘은 문단에 속한 레벨과 넘버링 타입을 활용하여 문단 계층 구조가 규칙적이고 체계적으로 이루어졌는지 면밀하게 검토하고 이를 통해 데이터 형식 검증의 결과로 전환함. 이 과정을 통해 추출된 데이터는 체계적이고 자동화된 방식으로 데이터베이스(DB)에 저장됨.