Update app-backup2.py
Browse files- app-backup2.py +90 -33
app-backup2.py
CHANGED
@@ -119,29 +119,62 @@ def upload_parquet(file_path: str) -> Tuple[str, str, str]:
|
|
119 |
def text_to_parquet(text: str) -> Tuple[str, str, str]:
|
120 |
try:
|
121 |
from io import StringIO
|
122 |
-
|
123 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
124 |
df = pd.read_csv(
|
125 |
-
|
126 |
sep=',',
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
engine='python', # Python 엔진 사용
|
131 |
-
header=None, # 첫 번째 행을 열 이름으로 사용하지 않음
|
132 |
-
names=['id', 'text', 'label', 'metadata'] # 열 이름 지정
|
133 |
)
|
|
|
134 |
# 데이터 유형 최적화
|
135 |
df = df.astype({'id': 'int32', 'text': 'string', 'label': 'string', 'metadata': 'string'})
|
|
|
136 |
# Parquet 파일로 변환
|
137 |
parquet_filename = 'text_to_parquet.parquet'
|
138 |
df.to_parquet(parquet_filename, engine='pyarrow', compression='snappy')
|
|
|
139 |
# Parquet 파일 내용 미리보기
|
140 |
parquet_content = load_parquet(parquet_filename)
|
|
|
141 |
return f"{parquet_filename} 파일이 성공적으로 변환되었습니다.", parquet_content, parquet_filename
|
|
|
142 |
except Exception as e:
|
143 |
-
error_message = f"텍스트 변환 중 오류가 발생했습니다: {str(e)}
|
144 |
-
print(error_message)
|
145 |
return error_message, "", ""
|
146 |
|
147 |
def preprocess_text_with_llm(input_text: str) -> str:
|
@@ -154,26 +187,36 @@ def preprocess_text_with_llm(input_text: str) -> str:
|
|
154 |
1. 출력 형식: id,text,label,metadata
|
155 |
2. id: 1부터 시작하는 순차적 번호
|
156 |
3. text: 의미 있는 단위로 분리된 텍스트
|
157 |
-
4. label: 텍스트의 주제나
|
158 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
159 |
|
160 |
주의사항:
|
161 |
-
-
|
162 |
- 큰따옴표는 백슬래시로 이스케이프 처리
|
163 |
- 각 행은 새로운 줄로 구분
|
164 |
-
-
|
165 |
|
166 |
-
|
167 |
-
"""
|
168 |
-
|
169 |
-
full_prompt = f"{system_prompt}\n\n{input_text}\n\n출력:"
|
170 |
|
171 |
try:
|
172 |
response = ""
|
173 |
stream = hf_client.text_generation(
|
174 |
prompt=full_prompt,
|
175 |
-
max_new_tokens=4000,
|
176 |
-
temperature=0.
|
177 |
top_p=0.9,
|
178 |
stream=True,
|
179 |
)
|
@@ -182,12 +225,27 @@ def preprocess_text_with_llm(input_text: str) -> str:
|
|
182 |
if msg:
|
183 |
response += msg
|
184 |
|
185 |
-
#
|
186 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
187 |
|
188 |
# CSV 형식 검증
|
189 |
try:
|
190 |
-
# StringIO를 사용하여 CSV 형식 검증
|
191 |
from io import StringIO
|
192 |
import csv
|
193 |
csv.reader(StringIO(processed_text))
|
@@ -196,7 +254,7 @@ def preprocess_text_with_llm(input_text: str) -> str:
|
|
196 |
return "LLM이 올바른 CSV 형식을 생성하지 못했습니다. 다시 시도해주세요."
|
197 |
|
198 |
except Exception as e:
|
199 |
-
error_message = f"전처리 중 오류가 발생했습니다: {str(e)}
|
200 |
print(error_message)
|
201 |
return error_message
|
202 |
|
@@ -393,7 +451,7 @@ with gr.Blocks(css=css) as demo:
|
|
393 |
outputs=[convert_status, parquet_preview_convert, download_parquet_convert]
|
394 |
)
|
395 |
|
396 |
-
#
|
397 |
with gr.Tab("Text Preprocessing with LLM"):
|
398 |
gr.Markdown("### 텍스트를 입력하면 LLM이 데이터셋 형식에 맞게 전처리하여 출력합니다.")
|
399 |
with gr.Row():
|
@@ -407,7 +465,7 @@ with gr.Blocks(css=css) as demo:
|
|
407 |
with gr.Row():
|
408 |
preprocess_button = gr.Button("전처리 실행", variant="primary")
|
409 |
clear_button = gr.Button("초기화")
|
410 |
-
|
411 |
preprocess_status = gr.Textbox(
|
412 |
label="전처리 상태",
|
413 |
interactive=False,
|
@@ -421,12 +479,11 @@ with gr.Blocks(css=css) as demo:
|
|
421 |
)
|
422 |
|
423 |
# Parquet 변환 및 다운로드 섹션
|
424 |
-
|
425 |
-
|
426 |
-
|
427 |
-
|
428 |
-
|
429 |
-
)
|
430 |
|
431 |
def handle_text_preprocessing(input_text: str):
|
432 |
if not input_text.strip():
|
|
|
119 |
def text_to_parquet(text: str) -> Tuple[str, str, str]:
|
120 |
try:
|
121 |
from io import StringIO
|
122 |
+
import csv
|
123 |
+
|
124 |
+
# 입력 텍스트 정제
|
125 |
+
lines = text.strip().split('\n')
|
126 |
+
cleaned_lines = []
|
127 |
+
|
128 |
+
for line in lines:
|
129 |
+
# 빈 줄 건너뛰기
|
130 |
+
if not line.strip():
|
131 |
+
continue
|
132 |
+
|
133 |
+
# 쌍따옴표 정규화
|
134 |
+
line = line.replace('""', '"') # 중복 쌍따옴표 처리
|
135 |
+
|
136 |
+
# CSV 파싱을 위한 임시 StringIO 객체 생성
|
137 |
+
temp_buffer = StringIO(line)
|
138 |
+
try:
|
139 |
+
# CSV 라인 파싱 시도
|
140 |
+
reader = csv.reader(temp_buffer, quoting=csv.QUOTE_ALL)
|
141 |
+
parsed_line = next(reader)
|
142 |
+
if len(parsed_line) == 4: # id, text, label, metadata
|
143 |
+
# 각 필드를 적절히 포맷팅
|
144 |
+
formatted_line = f'{parsed_line[0]},"{parsed_line[1]}","{parsed_line[2]}","{parsed_line[3]}"'
|
145 |
+
cleaned_lines.append(formatted_line)
|
146 |
+
except:
|
147 |
+
continue
|
148 |
+
finally:
|
149 |
+
temp_buffer.close()
|
150 |
+
|
151 |
+
# 정제된 CSV 데이터 생성
|
152 |
+
cleaned_csv = '\n'.join(cleaned_lines)
|
153 |
+
|
154 |
+
# DataFrame 생성
|
155 |
df = pd.read_csv(
|
156 |
+
StringIO(cleaned_csv),
|
157 |
sep=',',
|
158 |
+
quoting=csv.QUOTE_ALL,
|
159 |
+
escapechar='\\',
|
160 |
+
names=['id', 'text', 'label', 'metadata']
|
|
|
|
|
|
|
161 |
)
|
162 |
+
|
163 |
# 데이터 유형 최적화
|
164 |
df = df.astype({'id': 'int32', 'text': 'string', 'label': 'string', 'metadata': 'string'})
|
165 |
+
|
166 |
# Parquet 파일로 변환
|
167 |
parquet_filename = 'text_to_parquet.parquet'
|
168 |
df.to_parquet(parquet_filename, engine='pyarrow', compression='snappy')
|
169 |
+
|
170 |
# Parquet 파일 내용 미리보기
|
171 |
parquet_content = load_parquet(parquet_filename)
|
172 |
+
|
173 |
return f"{parquet_filename} 파일이 성공적으로 변환되었습니다.", parquet_content, parquet_filename
|
174 |
+
|
175 |
except Exception as e:
|
176 |
+
error_message = f"텍스트 변환 중 오류가 발생했습니다: {str(e)}"
|
177 |
+
print(f"{error_message}\n{traceback.format_exc()}")
|
178 |
return error_message, "", ""
|
179 |
|
180 |
def preprocess_text_with_llm(input_text: str) -> str:
|
|
|
187 |
1. 출력 형식: id,text,label,metadata
|
188 |
2. id: 1부터 시작하는 순차적 번호
|
189 |
3. text: 의미 있는 단위로 분리된 텍스트
|
190 |
+
4. label: 텍스트의 주제나 카테고리를 아래 기준으로 정확하게 한 개만 선택
|
191 |
+
- Historical_Figure (역사적 인물)
|
192 |
+
- Military_History (군사 역사)
|
193 |
+
- Technology (기술)
|
194 |
+
- Politics (정치)
|
195 |
+
- Culture (문화)
|
196 |
+
5. metadata: 날짜, 출처 등 추가 정보
|
197 |
+
|
198 |
+
중요:
|
199 |
+
- 동일한 텍스트를 반복해서 출력하지 말 것
|
200 |
+
- 각 텍스트는 한 번만 처리하여 가장 적합한 label을 선택할 것
|
201 |
+
- 입력 텍스트를 의미 단위로 적절히 분리할 것
|
202 |
+
|
203 |
+
예시:
|
204 |
+
1,"이순신은 조선 중기의 무신이다.","Historical_Figure","조선시대, 위키백과"
|
205 |
|
206 |
주의사항:
|
207 |
+
- text에 쉼표가 있으면 큰따옴표로 감싸기
|
208 |
- 큰따옴표는 백슬래시로 이스케이프 처리
|
209 |
- 각 행은 새로운 줄로 구분
|
210 |
+
- 불필요한 반복 출력 금지"""
|
211 |
|
212 |
+
full_prompt = f"{system_prompt}\n\n입력텍스트:\n{input_text}\n\n출력:"
|
|
|
|
|
|
|
213 |
|
214 |
try:
|
215 |
response = ""
|
216 |
stream = hf_client.text_generation(
|
217 |
prompt=full_prompt,
|
218 |
+
max_new_tokens=4000,
|
219 |
+
temperature=0.1, # 더 결정적인 출력을 위해 낮춤
|
220 |
top_p=0.9,
|
221 |
stream=True,
|
222 |
)
|
|
|
225 |
if msg:
|
226 |
response += msg
|
227 |
|
228 |
+
# <EOS_TOKEN> 이전까지만 추출하고 정제
|
229 |
+
if "<EOS_TOKEN>" in response:
|
230 |
+
processed_text = response.split("<EOS_TOKEN>")[0].strip()
|
231 |
+
else:
|
232 |
+
processed_text = response.strip()
|
233 |
+
|
234 |
+
# 중복 출력 제거
|
235 |
+
lines = processed_text.split('\n')
|
236 |
+
unique_lines = []
|
237 |
+
seen_texts = set()
|
238 |
+
|
239 |
+
for line in lines:
|
240 |
+
line = line.strip()
|
241 |
+
if line and '출력:' not in line and line not in seen_texts:
|
242 |
+
unique_lines.append(line)
|
243 |
+
seen_texts.add(line)
|
244 |
+
|
245 |
+
processed_text = '\n'.join(unique_lines)
|
246 |
|
247 |
# CSV 형식 검증
|
248 |
try:
|
|
|
249 |
from io import StringIO
|
250 |
import csv
|
251 |
csv.reader(StringIO(processed_text))
|
|
|
254 |
return "LLM이 올바른 CSV 형식을 생성하지 못했습니다. 다시 시도해주세요."
|
255 |
|
256 |
except Exception as e:
|
257 |
+
error_message = f"전처리 중 오류가 발생했습니다: {str(e)}"
|
258 |
print(error_message)
|
259 |
return error_message
|
260 |
|
|
|
451 |
outputs=[convert_status, parquet_preview_convert, download_parquet_convert]
|
452 |
)
|
453 |
|
454 |
+
# 네번째 탭의 UI 부분 수정
|
455 |
with gr.Tab("Text Preprocessing with LLM"):
|
456 |
gr.Markdown("### 텍스트를 입력하면 LLM이 데이터셋 형식에 맞게 전처리하여 출력합니다.")
|
457 |
with gr.Row():
|
|
|
465 |
with gr.Row():
|
466 |
preprocess_button = gr.Button("전처리 실행", variant="primary")
|
467 |
clear_button = gr.Button("초기화")
|
468 |
+
|
469 |
preprocess_status = gr.Textbox(
|
470 |
label="전처리 상태",
|
471 |
interactive=False,
|
|
|
479 |
)
|
480 |
|
481 |
# Parquet 변환 및 다운로드 섹션
|
482 |
+
convert_to_parquet_button = gr.Button("Parquet으로 변환")
|
483 |
+
download_parquet = gr.File(label="변환된 Parquet 파일 다운로드")
|
484 |
+
|
485 |
+
|
486 |
+
|
|
|
487 |
|
488 |
def handle_text_preprocessing(input_text: str):
|
489 |
if not input_text.strip():
|