ginipick commited on
Commit
06ef6db
·
verified ·
1 Parent(s): 56d3d16

Update app-backup2.py

Browse files
Files changed (1) hide show
  1. 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
- # CSV 데이터를 StringIO를 통해 읽기
123
- csv_data = StringIO(text)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
124
  df = pd.read_csv(
125
- csv_data,
126
  sep=',',
127
- dtype=str,
128
- quoting=csv.QUOTE_ALL, # 모든 필드를 큰따옴표로 감싸는 것으로 처리
129
- escapechar='\\', # 이스케이프 문자 설정
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)}\n{traceback.format_exc()}"
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
- 5. metadata: 추가 정보(날짜, 출처 등)
 
 
 
 
 
 
 
 
 
 
 
 
 
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.3, # 더 결정적인 출력을 위해 낮춤
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
- processed_text = response.strip()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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)}\n{traceback.format_exc()}"
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
- with gr.Row():
425
- convert_to_parquet_button = gr.Button("Parquet으로 변환", visible=True)
426
- download_parquet = gr.File(
427
- label="변환된 Parquet 파일 다운로드",
428
- visible=False
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():