python replace를 파일을 불러와 하는 방법 질문드립니다.

조회수 525회

기초적인 질문 죄송합니다.

파이썬 텍스트 클리닝 과정에서 아래와 같이 하나하나 내용을 바꾸는 작업을

df['sentence'] = df["sentence"].str.replace("볼펜", "펜")
df['sentence'] = df["sentence"].str.replace("싸인펜", "펜")
df['sentence'] = df["sentence"].str.replace("매직", "펜")

아래와 같이 불용어 처리하는 것처럼 파일을 불러와서 하고 싶습니다.

stopwords = []
f = open('/content/khaiii/rsc/src/불용어.txt')
lines = f.readlines()
for line in lines:
    line = line.strip()
    stopwords.append(line)
f.close()

df['sentence'] = df['sentence'].apply(lambda x : [item for item in x if item not in stopwords])

방법이 있을까요?

  • 1. sentence 에는 단어의 리스트가 들어 있나요? 아니면 그냥 str 타입의 텍스트가 들어있나요? 2. 불러올 파일에는 볼펜 싸인펜 매직... 이런 게 어떤 형태로 들어있나요? nowp 2021.2.2 02:20
  • 1. sentence에는 str 타입의 문장이 들어있습니다. 2. 불러올 파일은 아직 만들지 않았고, 변경전 tab 변경후 이렇게 만들고자 합니다. orange 2021.2.2 15:46
  • @오리 : 아래 불용어 처리 예에서는 df['sententce'] 가 word들의 리스트로 들어있는 것처럼 보이는데요. nowp 2021.2.2 15:59
  • 아 네. 죄송합니다. 불용어 파일은 word 리스트로 되어 있는데, 이것은 파일을 불러와 적용시키는 방법에 대한 예시로 말씀드린 것입니다. 불용어 예시는 무시하셔도 될것같습니다. orange 2021.2.2 16:07
  • 이전 글에도 전부 코드 없이 이미지로 올리는 것으로 보이는데, 도와주시는 분들은 시간이 남아돌아서 누군가 캡쳐해서 업로드한 이미지를 보고 질문자에 의도에 맞는 코드를 예측해서 만들어주는 사람들이 아닙니다. 초보자 2021.2.2 17:45

2 답변

  • 좋아요

    0

    싫어요
    채택 취소하기
    바꾸기리스트 = []
    
    # 파일을 읽어서, 바꾸기리스트를 만든다.
    with open(바꿀단어리스트파일패쓰, "r") as f:
      for line in f:
        바꾸기전, 바꾼후 = line.split('\t')
        바꾸기리스트.append((바꾸기전, 바꾼후))
    
    # 리스트의 단어쌍을 불러서, 바꾸기를 실행한다.
    for 성형전, 성형후 in 바꾸기리스트:
      df["내용"] = df["내용"].str.replace(성형전, 성형후)
    

    이렇게 하면 됩니다. 파일 읽을 때, 파일의 인코딩 잘 확인하고요. 파일 마지막에 쓸데없는 줄바꿈있으면, 그거 잘 처리해야 할 거구요.

    • 감사합니다! 파일을 읽어와 적용하는 데까지 성공했습니다. 그런데 말씀하신 인코딩 부분에 문제가 있는 것 같습니다. text 파일을 utf8로 저장하여 불러왔는데 공백은 \xa0 문자처리가 되고 line 마지막에 줄바꿈 표시가 생깁니다. 공백은 살리고 싶은데 어떻게 바꿀 수 있을까요? orange 2021.2.4 17:51
    • 그렇네요. 라인마다 마지막에 줄바꿈 문자가 있습니다. 제거해주시면 됩니다. 마지막 문자 하나만 슬라이싱으로 빼주던가 strip 메소드 쓰던가. 스플릿하기 전에해도 되고 나중에 해도 되고요. 수고하세요. nowp 2021.2.5 04:21
    • 슬라이싱과 replace 사용해서 해결했습니다!! 정말 감사드립니다! orange 2021.2.5 14:26
  • 견식이 짧아 제대로 이해한 것인지 모르겠으나..

    다음과 같이 하면 되지 않나 생각되서 남겨봅니다

    with open('/content/khaiii/rsc/src/불용어.txt', 'r') as f:
        lines =  f.readlines()
        stopwords = [line.strip() for line in lines]
    
    for fd in df['sentence']:
        if fd in stopwords:
            break
        for r in ['볼펜', '싸인펜', '매직']:
            fd = fd .replace(r, '펜')
    또는
    fd = str(df['sentence'])
    if fd not in stopword:
        for r in ['볼펜', '싸인펜', '매직']:
            fd = fd.replace(r, '펜')
    
    • 몇가지 문제가 있어요. 1. 질문자의 df 는 pandas dataframe 일 겁니다. 그냥 사전이 아니에요. 2. for df in df["sentence"]: 이 과정에서 df 변수의 내용이 의도치 않게 엉뚱하게 바뀌어 버립니다. nowp 2021.2.2 07:57
    • 글을 작성하기 전에 apply 명령어가 판다스 모듈에서 사용하는 명령어라는 것을 알게 되었습니다. 하지만 아시는 것처럼 리스트가 아니어도 리스트로 변경하는 것이 어려운 작업도 아니고, 리스트가 아니더라도 해당 예시를 보고 활용하는게 어려운 것이 아니라고 생각했습니다. 또한 그 정도 활용은 가능하기 때문에 질문자가 df['sentence']가 정확히 무엇인지 정확하게 알려주지 않았다고 생각했습니다. 질문자의 replace 예시를 봤을 때, 제 생각에 목적은 기존 데이터 형식의 유지보다는 각각의 객체를 수정하는 것이라고 생각되었거든요. 초보자 2021.2.2 10:51
    • @초보: a. 넵. 질문자의 질문에 설명이 부족합니다. b. 하지만 2번은 여전히 문제입니다. 단순 오타일 수도 있는데, for df ... 부분 루프를 거친 이후에 df 가 망가져요. nowp 2021.2.2 11:06
    • 일단 다른 형식으로 내용을 추가해봤습니다. df..아, 그러네요. 평소 버릇대로 했더니.. 부끄럽습니다. 해당 부분 다시 수정했습니다. 좋은 지적 감사합니다. daewon님께 늘 배우기만 하는 것 같아 부끄럽고, 또 가르쳐주셔서 감사합니다 ㅎㅎ 초보자 2021.2.2 11:11

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)