인공지능이 생성한 문장 분리하는 코드인데 수정이 필요합니다

코드 실행 조건은 다음과 같습니다.
python *.py 폴더명 으로 실행합니다.
예를들어 python 문장분리.py 소설
import os
import re
import argparse

def split_sentences(content):
sentences = re.split(r'(?<=[.?!])', content)
return sentences

def save_sentences(sentences, output_path):
with open(output_path, 'w', encoding='utf-8') as file:
for sentence in sentences:
file.write(sentence.strip() + '\n')

def process_files(folder_path):
for file_name in os.listdir(folder_path):
if file_name.endswith('.txt'):
file_path = os.path.join(folder_path, file_name)

        try:
            with open(file_path, 'r', encoding='utf-8') as file:
                content = file.read()
        except UnicodeDecodeError:
            # UTF-8로 열 수 없는 경우 다른 인코딩으로 시도
            encodings = ['utf-8', 'cp949']  # 여기에 사용 가능한 인코딩 추가
            for encoding in encodings:
                try:
                    with open(file_path, 'r', encoding=encoding) as file:
                        content = file.read()
                    break
                except UnicodeDecodeError:
                    continue
            else:
                print("파일을 열 수 없습니다:", file_path)
                continue

        sentences = split_sentences(content)
        output_path = os.path.join(
            folder_path, file_name[:-4] + '_sentences.txt')
        save_sentences(sentences, output_path)

if name == 'main':
parser = argparse.ArgumentParser()
parser.add_argument("folder_path", help="폴더 경로")
args = parser.parse_args()

process_files(args.folder_path)

문제를 설명하겠습니다.
이 코드는 소설 폴더의 모든 txt 파일을 불러와 문장을 분리하도록 요청한 코드입니다.
문장을 분리하는 이유는 언어모델에 적용하기 위해서입니다.
그런데 이 코드를 실행하면 다음과 같은 문제가 발생합니다.
소설 1개만 불러와 이름만 바꾼채 복사 붙여넣기를 합니다.
모든 txt 파일을 불러와야하지만 1개의 파일만 불러옵니다.
문장 분리는 되지 않는 거 같습니다.
그냥 이름만 a_sentences.txt 이지 내용은 a.txt와 같은 내용입니다.
b.txt의 내용은 어디에도 없습니다.
저는 코딩을 배운적은 있지만 겨우 c언어 30분을 배운 게 전부입니다.
그것도 int가 뭔지 어떻게해야 c언어를 시작하는지 뭐 그런것입니다.
지금은 하나도 생각이 안 나지만요.
이 코드를 제가 원하는대로 실행하도록 수정하려면 어떻게 해야합니까?
이 코드 자체도 몇번 수정한 거지만 수정이 전혀 안 된거나 마찬가지입니다.

  • 아래 답변은 Anthropic의 Claude-2 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요 kbuwel 님,

문제를 잘 이해했다고 생각합니다. 코드에서 소설 폴더의 모든 txt 파일을 불러와 문장을 분리하려고 했지만, 결과적으로 하나의 파일만 처리되고 문장 분리도 제대로 되지 않았다는 것을 알겠습니다.

코드를 정상적으로 동작하도록 수정하는 방법은 다음과 같습니다.

import os

for file_name in os.listdir(folder_path):
    # 파일 이름이 .txt로 끝나는 파일만 처리
    if file_name.endswith('.txt'): 
        file_path = os.path.join(folder_path, file_name)
        
        # 파일 읽기
        with open(file_path, 'r', encoding='utf-8') as f:
            content = f.read()

        # 문장 분리 
        sentences = split_sentences(content)

        # 결과 저장 
        output_path = os.path.join(folder_path, file_name[:-4] + '_sentences.txt') 
        save_sentences(sentences, output_path)
  • 폴더의 모든 파일을 순회할 수 있도록 os.listdirfor 문을 사용합니다.
  • 파일 이름이 .txt로 끝나는 파일만 처리합니다.
  • 각 파일의 전체 경로를 만들어 파일을 엽니다.
  • 문장 분리 함수를 호출합니다.
  • 결과를 새로운 이름의 파일에 저장합니다.

이렇게 하면 폴더의 모든 텍스트 파일을 처리할 수 있습니다.

문장 분리가 제대로 되지 않는다면 정규표현식을 수정해야 할 수도 있습니다.

sentences = re.split(r'[^.!?]', content)

제 글이 도움이 되었기를 바랍니다. 코딩 경험이 적어 어려움이 있다면 주저하지 마시고 문의해 주세요. 같이 고민하여 문제를 해결해나가겠습니다!


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!
1개의 좋아요
  • 아래 답변은 OpenAI의 GPT-4-Turbo 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요! 문장 분리 코드에 문제가 생겨 고민이 많으시겠네요. 문제를 해결하는 데 도움을 드리겠습니다.

문제를 정리해보면, 주어진 코드는 특정 폴더 내의 모든 .txt 파일을 읽어서 문장으로 분리한 후, 각 파일명에 _sentences.txt를 붙여 새로운 파일로 저장해야 하는데, 현재는 한 파일만 처리하고 있으며, 문장 분리도 제대로 이루어지지 않고 있는 상황으로 보입니다.

이 문제를 해결하기 위해 몇 가지 수정을 해야 할 것 같습니다. 먼저, 문장 분리를 위한 정규 표현식이 문장의 끝을 정확히 인식하지 못하고 있을 수 있습니다. 또한, 파일을 읽고 쓰는 과정에서 예외 처리를 좀 더 명확히 해주면 좋을 것 같습니다.

아래는 수정된 코드입니다. 주석을 달아 코드를 이해하기 쉽도록 했습니다.

import os
import re
import argparse

def split_sentences(content):
    # 문장의 끝을 나타내는 마침표, 물음표, 느낌표 뒤에 공백이 하나 이상 있을 경우를 기준으로 분리합니다.
    sentences = re.split(r'(?<=[.?!])\s+', content)
    return sentences

def save_sentences(sentences, output_path):
    with open(output_path, 'w', encoding='utf-8') as file:
        for sentence in sentences:
            file.write(sentence.strip() + '\n')

def process_files(folder_path):
    for file_name in os.listdir(folder_path):
        if file_name.endswith('.txt'):
            file_path = os.path.join(folder_path, file_name)
            try:
                with open(file_path, 'r', encoding='utf-8') as file:
                    content = file.read()
            except UnicodeDecodeError:
                # UTF-8로 열 수 없는 경우 다른 인코딩으로 시도
                encodings = ['utf-8', 'cp949']  # 여기에 사용 가능한 인코딩 추가
                for encoding in encodings:
                    try:
                        with open(file_path, 'r', encoding=encoding) as file:
                            content = file.read()
                        break
                    except UnicodeDecodeError:
                        continue
                else:
                    print("파일을 열 수 없습니다:", file_path)
                    continue

            sentences = split_sentences(content)
            output_path = os.path.join(
                folder_path, file_name[:-4] + '_sentences.txt')
            save_sentences(sentences, output_path)

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument("folder_path", help="폴더 경로")
    args = parser.parse_args()
    process_files(args.folder_path)

이 코드를 실행하기 전에, 명령줄에서 python 문장분리.py 소설과 같이 실행하시면 됩니다. 여기서 소설은 문장을 분리하고자 하는 텍스트 파일들이 있는 폴더명입니다.

문장 분리에 사용된 정규 표현식은 문장의 끝을 나타내는 부호 뒤에 공백이 하나 이상 있을 경우를 기준으로 분리하도록 수정했습니다. 이렇게 하면 문장의 끝을 더 정확히 인식할 수 있습니다.

만약 이 코드를 실행했을 때 여전히 문제가 발생한다면, 문장 분리 정규 표현식을 조정하거나 파일 인코딩을 확인하는 등의 추가적인 디버깅이 필요할 수 있습니다.

참고로, 파이썬과 관련된 더 자세한 정보는 공식 파이썬 문서(3.12.0 Documentation)에서 확인하실 수 있습니다. PyTorch와 관련된 내용은 필요하지 않아 보이지만, PyTorch에 대한 자세한 정보는 공식 PyTorch 튜토리얼(Welcome to PyTorch Tutorials — PyTorch Tutorials 2.1.1+cu121 documentation)에서 확인하실 수 있습니다.

제 답변이 도움이 되었으면 좋겠습니다. 만약 추가적인 질문이나 문제가 발생한다면 언제든지 질문해 주세요.


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!
1개의 좋아요
  • 아래 답변은 OpenAI의 GPT-4 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요, kbuwel님. 문장 분리를 위한 코드에 문제가 있어서 고민하시는 것 같습니다. 제가 이해한 바로는, 주어진 코드가 특정 폴더 내의 모든 텍스트 파일을 읽어 각각의 문장으로 분리하고, 그 결과를 새로운 파일에 저장하는 것이 목표인데, 현재는 한 파일만 읽고 그 내용을 그대로 복사하는 문제가 있으며, 실제로 문장 분리가 이루어지지 않는다는 것입니다.

이 문제를 해결하기 위해 코드를 살펴보면, split_sentences 함수에서 문장을 분리하는 부분이 있습니다. 이 부분에서 정규 표현식을 사용하여 문장을 분리하려고 하지만, 현재의 정규 표현식은 문장의 끝을 정확히 찾지 못하는 것 같습니다. 문장의 끝은 일반적으로 마침표(.), 물음표(?), 느낌표(!) 등으로 판단할 수 있지만, 이들 문자 뒤에 공백 문자가 하나 이상 오는 경우를 고려해야 합니다. 따라서 정규 표현식을 (?<=[.?!])\s+로 수정하면 문장 분리가 제대로 이루어질 것입니다.

또한, process_files 함수에서 모든 텍스트 파일을 처리하는 부분이 있는데, 현재는 파일을 읽은 후에 문장 분리를 수행하지 않고 바로 다음 파일을 읽는 것 같습니다. 이 부분에서 split_sentences 함수를 호출하여 문장 분리를 수행하고, 그 결과를 save_sentences 함수를 통해 저장해야 합니다.

아래에 수정된 코드를 제공드립니다:

import os
import re
import argparse

def split_sentences(content):
    sentences = re.split(r'(?<=[.?!])\s+', content)
    return sentences

def save_sentences(sentences, output_path):
    with open(output_path, 'w', encoding='utf-8') as file:
        for sentence in sentences:
            file.write(sentence.strip() + '\n')

def process_files(folder_path):
    for file_name in os.listdir(folder_path):
        if file_name.endswith('.txt'):
            file_path = os.path.join(folder_path, file_name)
            try:
                with open(file_path, 'r', encoding='utf-8') as file:
                    content = file.read()
            except UnicodeDecodeError:
                # UTF-8로 열 수 없는 경우 다른 인코딩으로 시도
                encodings = ['utf-8', 'cp949']  # 여기에 사용 가능한 인코딩 추가
                for encoding in encodings:
                    try:
                        with open(file_path, 'r', encoding=encoding) as file:
                            content = file.read()
                        break
                    except UnicodeDecodeError:
                        continue
                else:
                    print("파일을 열 수 없습니다:", file_path)
                    continue

            sentences = split_sentences(content)
            output_path = os.path.join(
                folder_path, file_name[:-4] + '_sentences.txt')
            save_sentences(sentences, output_path)

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument("folder_path", help="폴더 경로")
    args = parser.parse_args()
    process_files(args.folder_path)

이 코드를 실행하면 폴더 내의 모든 텍스트 파일을 읽어 각각의 문장으로 분리하고, 그 결과를 새로운 파일에 저장합니다.

이 코드는 Python의 표준 라이브러리만을 사용하므로 PyTorch의 공식 문서를 참조할 필요는 없습니다. 하지만 Python의 정규 표현식에 대해 더 알고 싶다면 Python의 공식 문서인 re — Regular expression operations를 참조하시면 좋을 것 같습니다.

제가 제공한 해결 방법이 kbuwel님의 문제를 해결하는 데 도움이 되길 바랍니다. 그럼에도 불구하고 문제가 계속된다면, 추가적인 정보와 함께 다시 질문해 주시기 바랍니다. 제가 제공한 답변이 틀릴 수도 있으니, 이 점을 염두에 두고 코드를 수정해 주시기 바랍니다.


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!
1개의 좋아요