086 문자열이 알파벳 또는 숫자인지 검사하기(isalnum)
알파벳(한글)과 숫자를 동시에 확인하는 문자열 함수
a = 'A story is 2003'
for i in a:
if i.isalnum() == True:
print(i)
# A
# s
# t
# o
# r
# y
# i
# s
# 2
# 0
# 0
# 3
ㅇ감정분석 > 특정 주제에 대해 말하거나 글을 쓴 사람의 감정을 분석하는 것
ex) 새로운 환불정책에 대한 고객의 평가는 어떠한가?
예제1. 긍정단어(positive-word.txt)를 파이썬으로 읽어서 리스트에 담으시오.
positive = open("c:\\data\\positive-words.txt")
pos = positive.read().split('\n')
print(pos)
positive.read() 까지 하면 read()함수로 인해 문자열로 변경됨.
split('\n')는 문자열을 엔터로 구분하여서 pos라는 리스트 변수를 구성함.
예제2. 부정단어(negative-word.txt)를 파이썬으로 읽어서 리스트에 담으시오.(리스트 이름은 nag)
negative = open("c:\\data\\negative-words.txt")
neg =negative.read().split('\n')
# print(pos)
예제3. 스티브 잡스 연설문을 어절별로 분리해서 stev라는 리스트에 담으시오.
jobs = open("c:\\data\\jobs.txt", encoding = 'utf8')
jobs2 = jobs.read().lower().replace('\n',' ').split(' ')
stev =[]
for i in jobs2:
stev.append(i.strip('"').strip('.,:;?!-'))
print(stev)
예제4. 스티브잡스 연설문에는 긍정단어가 몇 개가 들어있는가?
jobs = open("c:\\data\\jobs.txt", encoding='utf8')
jobs2 = jobs.read().lower().replace('\n',' ').split(' ')
stev = []
for i in jobs2:
stev.append(i.strip('"').strip(',.:;!?-')) # 스티브 잡스 연설문을 정제해서 어절별로 분리해서
# stev 라는 리스트에 넣고
pos.remove('')
stev.remove('')
기호를 삭제하는 과정에서 생긴 결측치를 제거. 제거하지 않으면 pos에도 결측치는 나타내는 ''가 있어서 stev와 pos를 비교하면 245개의 긍정단어가 나옴.
cnt = 0
for i in stev: # stev 리스트에서 요소를 하나씩 불러와서
if i in pos: # 만약에 그 요소가 pos 리스트에 있는 요소중에 존재한다면
cnt += 1 # cnt 를 하나 증가시켜라 ~
print(cnt) #87
문제310. 긍정단어는 87개가 나왔는데 부정단어는 몇개가 나오는지 카운트하시오.
negative = open("c:\\data\\negative-words.txt")
neg= negative.read().split('\n')
jobs = open("c:\\data\\jobs.txt", encoding='utf8')
jobs2 = jobs.read().lower().replace('\n',' ').split(' ')
stev = []
for i in jobs2:
stev.append(i.strip('"').strip('.,:;!?-'))
jobs = open("c:\\data\\jobs.txt", encoding='utf8')
jobs2 = jobs.read().lower().replace('\n',' ').split(' ')
stev = []
for i in jobs2:
stev.append(i.strip('"').strip(',.:;!?-'))
neg.remove('')
stev.remove('')
cnt = 0
for i in stev:
if i in neg:
cnt += 1
print(cnt) # 50
문제311. stev리스트에 결측치('')를 remove시킬때 stev.remove('')로 하는데, 이렇게 하면 결측치('')가 하나만 지워지고 모두 지워지지 않습니다. 그런지 확인해보세요.
stev.remove('')
stev.count('')
문제312. stev리스트에서 결측치('')를 모두 한꺼번에 remove 시키시오.
stev2 = list(filter(lambda x:x != '',stev))
stev2.count('')
stev 리스트의 요소를 x에 입력하고 출력할 때에 요소들중에 ''가 아닌것들만 출력해라 하고 나온 결과를 list라는 자료구조에 담아줘야함.
for i in stev:
if '' in stev:
stev.remove('')
stev.count('')
087 문자열에서 대소문자 변환하기(upper, lower)
문자열 객체의 upper() 메소드는 문자열에 있는 모든 알파벳을 대문자로 변환한 결과를 리턴함.
문자열 객체의 lower() 메소드는 문자열에 있는 모든 알파벳을 대문자로 변환한 결과를 리턴함.
txt = 'A lot of things occur each day'
print(txt.upper())
print(txt.lower())
# A LOT OF THINGS OCCUR EACH DAY
# a lot of things occur each day
문제313. emp의 이름과 직업을 출력하는데 둘 다 소문자로 출력하시오.
-- SQL
select lower(ename),lower(job)
from emp;
# 판다스
import pandas as pd
emp = pd.read_csv("c:\\data\\emp2.csv")
emp['ename_lo'] = emp['ename'].apply(lambda x : x.lower())
emp['job_lo'] =emp['job'].apply(lambda x : x.lower())
emp[['ename_lo','job_lo']]
# 또는
pd.concat([emp.ename.str.lower(),emp.job.str.lower()], axis =1)
pd.concat은 두 개의 시리즈(컬럼)을 연결해서 출력할때 사용하는 함수이고 emp.ename(또는 emp['ename'])을 emp.ename.str을 쓰면 emp.ename시리즈를 문자형으로 변경하겠다는 것. 따라서 문자형함수인 lower()를 사용해서 소문자로 변환할 수 있음. pd.concat의 옵션인 axis = 1은 두 개의 시리즈를 양옆으로 붙여서 출력하겠다는 의미.
088 문자열에서 좌우 공백 제거하기(lstrip, rstrip, strip)
함수 | 설명 |
lstrip | 문자열에서 존재하는 왼쪽 공백 제거 |
rstrip | 문자열에서 존재하는 오른쪽 공백 제거 |
strip | 문자열에서 존재하는 양쪽 공백을 제거 |
text7 = ' A story is 2003 '
print(text7)
print(text7.lstrip())
print(text7.rstrip())
print(text7.strip())
# A story is 2003
# A story is 2003
# A story is 2003
# A story is 2003
문제314. 아래의 SQL을 판다스로 구현하시오.
-- SQL
select ename, job
from emp
where trim(ename) == 'scott';
# 판다스
import pandas as pd
emp = pd.read_csv('c:\\data\\emp2.csv')
emp[['ename','job'][emp['ename'].str.strip()=='SCOTT']
문제315. 스티브 잡스 연설문에는 정관사 the가 몇 번 나오는가?
jobs = open("c:\\data\\jobs.txt", encoding='utf8')
jobs2 = jobs.read().lower().replace('\n',' ').split(' ')
stev = []
for i in jobs2:
stev.append(i.strip('"').strip(',.:;!?-'))
jobs = open("c:\\data\\jobs.txt", encoding='utf8')
jobs2 = jobs.read().lower().replace('\n',' ').split(' ')
stev = []
for i in jobs2:
stev.append(i.strip('"').strip(',.:;!?-'))
stev.count('the')
089 문자열에서 문자 개수 구하기 (count)
문자열 객체의 count() 메소드는 문자열에서 특정 문자의 갯수를 리턴함.
txt = 'A lot of things occur each day. Today is beautiful day.'
print(txt.count('day'))
리스트에서 사용하게 되면 동일한 문자로만 검색되고 Today같은건 검색되지 않음. 따라서 반듯이 문자열로 검색할 것.
텍스트 마이닝? 텍스트 마이닝이란 대량의 텍스트 데이터로부터 패턴 또는 관계를 추출하여 의미있는 정보를 찾아내는 기법. 비정형/반정형 데이터에 대하여 자연어/문서 처리 기술을 적용하여 의미있는 정보를 추출하는 기법.
문제316. (알고리즘 문제) 1부터 10000까지의 숫자 중에는 8이 몇번들어가있을까요?
result=[]
for i in range(1,10001):
result.append(i)
str(result).count('8')
090 문자열에서 특정 문자(열) 위치 찾기 (find)
문자열 객체의 find()함수는 문자열에서 특정 문자나 문자열이 위치하는 인덱스를 리턴함.
find()에서 찾고자 하는 문자를 입력하면 해당 문자나 문자열이 최초로 나타나는 위치에 대한 "인덱스"를 리턴.
txt = 'A lot of things occur each day'
print(txt.find('o')) # 3
print(txt.find('day')) # 27
문제317. 우리반 emp14.csv를 판다스 데이터프레임으로 만드세요.
import pandas as pd
emp14 = pd.read_csv("c:\\data\\emp14.csv")
emp14
문제318. 우리반 emp14 데이터프레임의 이메일에서 @의 위치 인덱스 번호를 출력하시오.
emp14['email'].str.find('@')
#또는
empr14.email.apply(lambda x: x.find('@') )
문제319. (점심시간 문제) 우리반 emp14 데이터프레임의 이메일에서 . 의 위치 인덱스 번호를 출력하시오.
emp14['email'].str.find('.')
# 또는
empr14.email.apply(lambda x: x.find('@') )
문제320. 우리반 테이블에서 이메일의 도메인명, 건수를 출력하시오.
import pandas as pd
emp14 = pd.read_csv("c:\\data\\emp14.csv")
emp14['e_domain'] = emp14['email'].apply(lambda x: x[x.find('@')+1:x.find('.')])
emp14.groupby('e_domain')['ename'].count().reset_index()
# 또는
emp14['email'].apply(lambda x: x[x.find('@')+1:x.find('.')]).value_counts().reset_index()
문제322. 위의 결과를 다시 출력하는데 건수가 높은 것부터 출력하시오.
a = emp14['email'].apply(lambda x: x[x.find('@')+1:x.find('.')]).value_counts().reset_index()
a.columns = ['도메인','건수']
a.sort_values(by = '건수',ascending = False)
091 문자열을 특정 문자(열)로 분리하기(split)
코드를 작성할 때 가장 많이 접하게 되는 경우가 구분자(separator)로 구분되어 있는 문자열 파싱(parsing)을 하는 일. 이때 문자열 객체의 split()을 활용하면 구분자를 기준으로 문자열을 쉽게 분리하여 파싱할 수 있음.
예제. 스티브 잡스 연설문을 어절별로 분리해서 리스트에 담는 코드
jobs=open("c:\\data\\jobs.txt", encoding = 'utf8')
jobs2 = jobs.read().lower().split(' ') # 공백으로 분리
jobs2
텍스트 데이터에 \n이 들어가있어서 제대로 걸러지지 않음. 따라서 replace()로 \n을 다른값으로 치환 후 텍스트 분리
jobs=open("c:\\data\\jobs.txt", encoding = 'utf8')
jobs2 = jobs.read().lower().replace('\n',' ').split(' ') # 공백으로 분리
jobs2
문제323. 영화 겨울왕국에는 elsa가 더 많이 나오는가? anna가 더 많이 나오는가?
# 등장기준
winter=open("c:\\data\\winter.txt")
winter2 = winter.read()
anna = winter2.count('ANNA')
elsa = winter2.count('ELSA')
print('ANNA :',anna)
print('ELSA :',elsa)
#ANNA : 347
#ELSA : 129
# 단어 언급 횟수 기준
winter=open("c:\\data\\winter.txt")
winter2 = winter.read().lower()
anna = winter2.count('anna')
elsa = winter2.count('elsa')
print('ANNA :',anna)
print('ELSA :',elsa)
#ANNA : 685
#ELSA : 329
.replace('\n',' ') 를 쓰는 경우는 리스트에 담는 경우에만 제거해주면 됨. 문자를 검색할 경우에는 굳이 리스트에 담을 필요가 없으므로 정제할 필요 없음.
092 문자열을 특정 문자(열)로 결합하기(join)
문자열 객체의 join() 메소드는 split과는 반대로 문자열이 요소인 리스트를 인자로 받아 리스트의 모든 요소를 특정 문자열로 연결하여 새로운 문자열로 만들어 리턴.
a = ['d','e','f','g','h','i']
bond = '/'
b = bond.join(a)
print(b)
#d/e/f/g/h/i
# 따로 변수 안만들고 '/'.join(a) 이렇게 작성해도 동일한 결과 출력됨.
문제324. 우리반 테이블의 이메일을 단체로 발송할 때 편하도록 아래와 같이 이메일 리스트를 출력하시오.
result = []
emp14['email'].apply(lambda x : result.append(x))
bond = ';'
bond.join(result)
# 또는
a = list(emp14.email) # Series로 넣어도 가능. list() 벗겨도 됨.
bond = ';'
bond.join(a)
문제325. 우리반 테이블에서 나이를 출력하는데 나이가 아래와 같이 출력되게 하시오.
24, 27, 31, 22, 29.......
리스트 요소들이 숫자이면 join함수를 쓸 수 없고 문자여야 join함수를 쓸 수 있음.
a = list(emp14['age']) # 리스트 요소들이 전부 int임.
b = list(map(str,a)) # 리스트 요소들을 전부 문자로 바꿈.
','.join(b)
# map사용하지 않고 리스트 문자로 변환할 때
# a = emp14.age.astype(str)
map(함수명, 리스트)를 실행하면 리스트 요소들을 하나씩 함수에 적용함.
093 문자열에서 특정 문자(열)를 다른 문자(열)로 바꾸기(replace)
문자열 객체의 replace() 메소드는 문자열에서 특정 문자나 문자열을 다른 문자열로 변경함.
txt = 'My password is 1234'
txt.replace('1','0') #'My password is 0234'
문제326. 이름과 월급을 출력하는데 월급을 출력할때에 숫자 0 대신에 *로 출력하시오.
import pandas as pd
emp = pd.read_csv("c:\\data\\emp2.csv")
pd.concat([emp.ename, emp.sal.apply(lambda x : str(x).replace('0','*'))], axis = 1)
문제327. 아래의 sql을 판다스로 구현하시오
-- SQL
select ename, regexp_replace(sal,'[0-3]','*')
from emp;
# 판다스
import pandas as pd
emp = pd.read_csv("c:\\data\\emp2.csv")
pd.concat([emp.ename, emp.sal.apply(lambda x : re.sub('[0123]','*',str(x)))], axis = 1)
+) 데이터 정제 전문 모듈 re
import re
print(re.sub('0','*','3000')) #3***
print(re.sub('[012]','*','3120')) #3***
문제328. 우리반 테이블에서 이름을 출력하는데 아래처럼 출력되게 하시오.
전*호
최*연
:
:
emp14['ename'].apply(lambda x : x.replace(x[1],'*')).reset_index()
문제329. 위의 결과를 다시 출력하는데 이름이 4글자인 경우 중간 2글자를 *처리 하시오.
def anon(ename):
a = len(ename)
return ename.replace(ename[1:a-1],'*'*(a-2))
emp14['ename'].apply(anon).reset_index()
# 또는
emp14.ename.apply(lambda x: x.replace(x[1:len(x)-1],'*'*(len(x)-2)))
094 문자열을 바이트 객체로 바꾸기(encode)
인코딩이란?
인코딩이란 사람이 인지할 수 있는 형태의 데이터를 약속된 규칙에 의해 컴퓨터가 사용하는 0과 1로 변환하는 과정.
컴퓨터의 발명, 발전이 미국의 학계와 기업을 중심으로 이루어지다 보니 문자집합(컴퓨터에서 문자를 담는 저장소)도 미국을 기준으로 제정. 미국에서 제정된 ASCII(미국 정보 교화 표준부호)는 1960년대 제정된 문자집합으로 이후에 개발된 문자집합의 토대를 이루고 있음.
AXCII는 7비트만을 이용해서 음이 아닌 수(0~127)의 문자 집합내의 문자 할당 약속. = ANSI
A 는 숫자 65. a는 숫자 97
예제. chr함수를 이용해서 숫자65부터 127까지는 어떤 문자인지 출력하시오.
for i in range(65,128):
print(i,chr(i))
chr() 함수는 컴퓨터가 이해하는 숫자가 사람에게는 어떤 문자인지 출력하는 함수.
최초로 만든 문자 집합이 아스키인데 이 아스키 코드표로 미국 엔지니어들은 편했지만 다른 나라 사람들은 그러지 못했음.
ex) 독일어의 움라우트, 스페인어의 물결표, 터키어의 시딜러, 프랑스어의 악센트는 7비트로 표현하지 못함. 또 한자, 일본어, 한글 등은 7비트 규격에 맞지 않음.
이 언어들을 담기 위해서는 더 큰 문자셋이 필요했고, 16비트로 된 문자 집합을 제공해서 해결함. 그 집합셋이 바로 euckr, cp949
x_train = pd.read_csv("c:\\data\\X_train.csv", encoding = 'euckr')
x_train
하지만, 이 또한 모든 문자를 담지 못함 ex) 샾
더 큰 문자셋이 필요했고, 그래서 나온 문자셋이 바로 utf8, utf16. 세계의 모든 문자를 다 컴퓨터로 표현할 수 있게 됨.
jobs = open("c:\\data\\jobs.txt", encoding='utf8')
jobs2 = jobs.read()
jobs2
문제330. (오늘의 마지막 문제) EBS 만화 프로그램 레이디버그 시청자 게시판에 긍정단어, 부정단어의 갯수는?
positive = open("c:\\data\\positive_kor.txt")
pos= positive.read().split('\n')
negative = open("c:\\data\\nagative_kor.txt")
neg= negative.read().split('\n')
lady = open("c:\\data\\ladybug5.txt", encoding = 'utf8')
lady2 = lady.read()
pos.remove('')
neg.remove('')
pos1 = 0
neg1 = 0
for i in pos:
if i in lady2:
pos1+=1
for i in neg:
if i in lady:
neg1+= 1
print('긍정단어 :',pos1) # 긍정단어 : 64
print('부정단어 :',neg1) # 부정단어 : 57
중복제거값으로 카운트됨.
positive = open("c:\\data\\positive_kor.txt")
pos= positive.read().split('\n')
negative = open("c:\\data\\nagative_kor.txt")
neg= negative.read().split('\n')
lady = open("c:\\data\\ladybug5.txt", encoding = 'utf8')
lady2 = lady.read()
pos.remove('')
neg.remove('')
# pos = list(filter(lambda x:x,pos)) filter 함수가 알아서 결측치를 걸러줌
# neg = list(filter(lambda x:x,neg))
pos1 = 0
neg1 = 0
for i in pos:
pos1 += lady2.count(i)
for i in neg:
neg1 += lady2.count(i)
print('긍정단어 :',pos1) # 긍정단어 : 275
print('부정단어 :',neg1) # 부정단어 : 368
'Study > class note' 카테고리의 다른 글
python / 리스트(range,index, 슬라이싱, reverse(d),합치기(+),반복(*),append,insert,del,remove,len ,count) (0) | 2021.12.27 |
---|---|
python / decode (0) | 2021.12.27 |
python / 문자열(슬라이싱, 스텝,+,*, in, len,isalpha,isdigit) (0) | 2021.12.23 |
python / 커피 키오스크 + data_add 따로 빼기 (0) | 2021.12.22 |
python / 문자열(인덱싱, 슬라이싱) (0) | 2021.12.22 |