Working with text in Python
Original Source: https://www.coursera.org/specializations/data-science-python
텍스트 관련 기본 내장 함수
text = " Ethics are built into the ideals of the UN here. \n지금 시각은 3 시 30분이다. "
text
' Ethics are built into the ideals of the UN here. \n지금 시각은 3 시 30분이다. '
1. String Operations
len(text) #문자열의 길이를 반환한다.
69
text_list = text.split(' ') # 문자열을 ' '로 나눈 단어들의 리스트를 반환한다.
text_list
['',
'Ethics',
'are',
'built',
'into',
'the',
'ideals',
'of',
'the',
'UN',
'here.',
'\n지금',
'시각은',
'3',
'시',
'30분이다.',
'']
' '.join(text_list) # 문자열들을 ' '을 사이에 끼고 연결한다.
' Ethics are built into the ideals of the UN here. \n지금 시각은 3 시 30분이다. '
text.lower() #change all characters to lower
' ethics are built into the ideals of the un here. \n지금 시각은 3 시 30분이다. '
text.upper() #모두 다 대문자로 바꾼다.
' ETHICS ARE BUILT INTO THE IDEALS OF THE UN HERE. \n지금 시각은 3 시 30분이다. '
text.splitlines() # \n을 기준으로 나눈 문장들의 리스트를 반환한다.
[' Ethics are built into the ideals of the UN here. ', '지금 시각은 3 시 30분이다. ']
text.strip() # 문장 맨 앞과 맨 뒤에 있는 빈 공간을 모두 없앤다.
'Ethics are built into the ideals of the UN here. \n지금 시각은 3 시 30분이다.'
text.rstrip() # 문장 맨 뒤에 있는 빈 공간을 없앤다.
' Ethics are built into the ideals of the UN here. \n지금 시각은 3 시 30분이다.'
text.find('the') # 문자열에 있는 'the' 중 가장 앞에 있는 것의 인덱스를 반환한다.
23
text.rfind('the') #문자열에 있는 'the' 중 가장 뒤에 있는 것의 인덱스를 반환한다.
37
text.replace(' ', '빈칸') #문자열에 있는 모든 ' '를 '빈칸'으로 바꾼 문자열을 반환한다.
'빈칸Ethics빈칸are빈칸built빈칸into빈칸the빈칸ideals빈칸of빈칸the빈칸UN빈칸here.빈칸\n지금빈칸시각은빈칸3빈칸시빈칸30분이다.빈칸'
2. True / False를 반환하는 내장 함수
[w for w in text_list if w.startswith('i')] #'i'로 시작하는 단어들의 리스트를 반환한다.
['into', 'ideals']
[w for w in text_list if w.endswith('t')] #'t'로 끝나는 단어들의 리스트를 반환한다.
['built']
[w for w in text_list if w.istitle()] #맨 앞 글자만 대문자인 단어들의 리스트를 반환한다.
['Ethics']
[w for w in text_list if w.isupper()] #대문자로 이루어진 단어들의 리스트를 반환한다.
['UN']
[w for w in text_list if w.islower()] #소문자로 이루어진 단어들의 리스트를 반환한다.
['are', 'built', 'into', 'the', 'ideals', 'of', 'the', 'here.']
[w for w in text_list if w.isalpha()] #숫자가 아닌 글자로 이루어진 단어들의 리스트를 반환한다.
['Ethics',
'are',
'built',
'into',
'the',
'ideals',
'of',
'the',
'UN',
'시각은',
'시']
[w for w in text_list if w.isdigit()] #숫자로 이루어진 단어들의 리스트를 반환한다.
['3']
[w for w in text_list if w.isalnum()] #특수문자를 제외한 숫자와 글자로 이루어진 단어들의 리스트를 반환한다.
['Ethics',
'are',
'built',
'into',
'the',
'ideals',
'of',
'the',
'UN',
'시각은',
'3',
'시']
3. 텍스트 파일 읽기
f = open('1.txt', 'r') # 파일을 열어 작업할 준비를 한다.
f.readline() # 파일의 첫 번째 줄을 읽는다. 현재 커서는 두 번째 줄 맨 앞에 있다.
'안녕하세요.\n'
f.seek(0) # 커서를 첫 번째 줄 맨 앞에 놓는다.
f.read() # 파일의 모든 줄을 읽는다.
'안녕하세요.\n123456\n?!@#가나다'
f.seek(0)
f.read(3) # 3번째 글자까지 읽는다.
'안녕하'
f.close() # 파일을 닫는다.
pandas로 텍스트 처리하기
import pandas as pd
time_sentences = ["Monday: The doctor's appointment is at 2:45pm.",
"Tuesday: The dentist's appointment is at 11:30 am.",
"Wednesday: At 7:00pm, there is a basketball game!",
"Thursday: Be back home by 11:15 pm at the latest.",
"Friday: Take the train at 08:10 am, arrive at 09:00am."]
df = pd.DataFrame(time_sentences, columns=['text'])
df
text | |
---|---|
0 | Monday: The doctor's appointment is at 2:45pm. |
1 | Tuesday: The dentist's appointment is at 11:30... |
2 | Wednesday: At 7:00pm, there is a basketball game! |
3 | Thursday: Be back home by 11:15 pm at the latest. |
4 | Friday: Take the train at 08:10 am, arrive at ... |
# df['text']의 각 문자열의 길이의 리스트를 반환한다.
# Series.str.function()은 시리즈의 각 문자열에 function()을 적용한 결과를 반환한다.
df['text'].str.len()
0 46
1 50
2 49
3 49
4 54
Name: text, dtype: int64
# df['text']의 각 문자열의 단어 개수의 리스트를 반환한다.
df['text'].str.split().str.len()
0 7
1 8
2 8
3 10
4 10
Name: text, dtype: int64
# 특정 단어를 포함하고 있는지의 여부를 반환한다.
df['text'].str.contains('appointment')
0 True
1 True
2 False
3 False
4 False
Name: text, dtype: bool
# 각 문자열의 숫자 개수를 반환한다.
#r은 'regular expression', 즉 정규표현식으로 찾겠다는 뜻이고, '\d'는 숫자를 의미하는 정규표현식이다.
df['text'].str.count(r'\d')
0 3
1 4
2 3
3 4
4 8
Name: text, dtype: int64
# 각 문자열에서 정규표현식을 만족하는 부분 중 정규표현식에서 괄호 안에 있는 부분을 반환한다.
# 여기서는 시각과 분을 반환한다.
df['text'].str.findall(r'(\d?\d):(\d\d)')
0 [(2, 45)]
1 [(11, 30)]
2 [(7, 00)]
3 [(11, 15)]
4 [(08, 10), (09, 00)]
Name: text, dtype: object
# 각 문자열에서 요일을 3 글자 축약형으로 바꾼다.
df['text'].str.replace(r'(\w+day\b)', lambda x: x.group()[:3])
0 Mon: The doctor's appointment is at 2:45pm.
1 Tue: The dentist's appointment is at 11:30 am.
2 Wed: At 7:00pm, there is a basketball game!
3 Thu: Be back home by 11:15 pm at the latest.
4 Fri: Take the train at 08:10 am, arrive at 09:...
Name: text, dtype: object
# ?P<time>은 해당 부분의 열 이름을 'time'으로 하겠다는 것이다.
# 정규표현식을 만족하는 부분 중 정규표현식에서 괄호 안에 있는 부분을 반환한다.
# 한 문장에 두 부분이 정규표현식을 만족시킬 수 있으므로, match라는 두 번째 index가 만들어진다.
df['text'].str.extractall(r'(?P<time>(?P<hour>\d?\d):(?P<minute>\d\d) ?(?P<period>[ap]m))')
time | hour | minute | period | ||
---|---|---|---|---|---|
match | |||||
0 | 0 | 2:45pm | 2 | 45 | pm |
1 | 0 | 11:30 am | 11 | 30 | am |
2 | 0 | 7:00pm | 7 | 00 | pm |
3 | 0 | 11:15 pm | 11 | 15 | pm |
4 | 0 | 08:10 am | 08 | 10 | am |
1 | 09:00am | 09 | 00 | am |
Leave a Comment