최근 인기를 끌고 있는 게임 블랙 서바이벌 영원회귀의 steam 리뷰글에 대한 분석을 해보고자 한다. 전에 했던 보겸 유튜브 제목 EDA와 비슷한 방식으로 진행해보고자 한다. 실제 코드들은 아래 아래 글에서 확인해 볼 수 있다.
한국어 사용자가 올린 리뷰글은 9000여개 정도 되는 거 같은데, 크롤링으로 5000여개 정도만 뽑아봤다. 전체적인 분위기만 찾고자 해서 이정도면 충분할 듯하다.
스팀 게임 리뷰 페이지를 보며 굉장히 놀라웠던 게 각 작성자들의 플레이 시간을 확인할 수 있고, 유용한 리뷰, 재밌는 리뷰에 대한 평가도 가능하며 이를 기준으로 정렬하여 리뷰를 확인할 수도 있다.
글자 수 통계
0~100 글자까지만 시각화 범위로 설정하였다. 2000자가 넘는 글도 있었다. 가장 많은 빈도수는 역시 10글자 내외의 짧은 글들이었다.
토큰(어절) 수 통계
역시 10개 내외의 토큰 수가 가장 높은 빈도 수를 보였다. 역시 짧은 글들이 다수임을 알 수 있다.
토큰 별 길이 평균
토큰별 길이 평균은 3-4글자 정도의 토큰(어절)이 가장 많이 쓰였음을 알 수 있다.
사실 이와 같은 토큰, 글자 수 통계는 그리 큰 정보를 주지 못한다고 생각된다. 리뷰글의 최장 길이나 평균 길이 정도는 나중에 처리할 때 의미가 될 수 있을 것 같긴하나 이를 제외하고는 자연어 처리 내에서 큰 의미를 찾기 어렵다고 본다.
명사 통계
이 내용부터가 그래도 어느 정도 의미를 찾을 수 있으며, 실제 내용과도 연관지어 볼 수 있는 부분이라고 생각된다.
좀 놀라웠던 게, '스킨'에 대한 얘기가 이정도로 많은가와 '신연숙'이라는 전혀 관련성 없어 보이는 생뚱맞은 이름이 있어서이다. 의존명사를 제외하고 살펴보고 싶어 두 글자 이상의 명사들만 따로 살펴보았다.
두 글자 이상 명사
리뷰 감성 분석의 평가 자질로 볼만한 파밍, 밸런스, 아이템, 루트, 플레이, 티밍, 스킬, 패치, 캐릭, 버그, 진입, 장벽 등등의 단어들을 살펴볼 수 있었다.
2-gram 통계
2-gram 통계를 보니 뭔가 이상한 느낌이 들었다. '스킨 내줘'와 '내줘 스킨'처럼 'a b', 'b a'가 같은 패턴으로 상위를 차지한 점, 뭔가 한 리뷰 내에서 반복되는 패턴이 있음을 예상해 볼 수 있었다.
3-gram 통계
3-gram 통계를 보니 더 많은 반복 패턴들을 찾아볼 수 있었다.
그래서 실제 데이터 내에서 이런 반복된 패턴의 글들을 찾아보았다. 우선 '스킨 내줘'를 키워드로 찾아보니. 아래 사진 도배(?)가 된 글이 있었다. 이런 형태의 글은 리뷰나 온라인 댓글에서 자주 찾아볼 수 있다. 그리고 토큰 단위의 키워드 빈도 분석 시에 큰 영향을 끼친다. 따라서 이런 글들을 찾아내어 따로 처리해보고자 한다.
우선 이런 글들의 특징을 살펴보면,
- 같은 짧은 패턴들의 반복된다.
- 글의 길이가 매우 길다.
위와 같은 특징들을 갖고 있다. 이를 수치적으로 나타내보면,
- 짧은 패턴들의 반복 -> 글자의 종류가 적다. (글자의 종류 수)
- 글의 길이가 매우 길다 -> 전체 길이가 일정 길이 이상이다. (전체 리뷰 길이 계산)
으로 나타낼 수 있으나, 글의 길이의 경우 이 지표로만 판단하기엔 무리가 있다. (1)실제로 매우 길게 풀어 쓴 글일 수도 있고, (2)짧은 길이임에도 패턴 자체가 짧아서 여럿 반복되어 나타날 수 있기 때문이다.
(1)
(2)
굿굿굿굿굿굿굿굿굿굿굿굿굿굿굿굿굿굿굿굿굿굿굿굿굿굿굿굿.
이처럼 (1)은 제외하고 (2)를 발견해내기 위해선 글자의 종류 수와 글자의 길이 사이의 비(ratio)를 고려할 필요가 있다.
즉, 다양한 내용이 담긴 긴 글이라면, 글자의 종류 수(a)와 글자 수(b)가 비례하여 증가할 것이다. 반면, 하나의 내용만 담긴 단순 글자만 긴 글이라면, 글자의 종류 수(a)보다 글자 수(b)가 훨씬 많을 것이다. 이를 식으로 정리해 보면,
$\frac{a_{글자 종류 수}}{b_{글자 수}}$ 가 작을수록 도배, 중복된 내용이 많은 글일 가능성이 높다.
추가적으로, 토큰 종류 수(c)까지 식에 추가하고자 한다. 아무리 리뷰글의 길이가 길다고 하더라도 글자 종류 수의 길이도 이에 비례하여 증가하진 않을 것이다. 조사나 어미, 접사 같은 경우는 반복적으로 쓰일 가능성이 높기 때문이다. 따라서 토큰 종류 수(type)도 수식에 추가하고자 한다. 최종 식은 다음과 같다.
$\frac{a_{글자 종류 수}+c_{토큰 종류 수}}{b_{글자 수}}$
이를 이용하여, 한계 값을 선정하여 한계값 미만의 리뷰글들을 추출해 보았다.
*10 글자 미만의 글은 토큰 종류가 큰 의미가 없다고 생각되어 글자 종류만 고려하였다.
def check_dup(string):
a = len(set(list(string))) # 글자 종류
b = len(string) # 길이
a = len(set(string.split())) # 토큰 종류
if c>10: #대부분이 10글자 이하의 글, 이때 토큰, 글자 종류 하나하나가 큰 비중(0.1), 여기서 나올 수 있는 도배 패턴은 한, 두글자 패턴인 경우가 대부분, 따라서 이를 잡아내고자 글자 종류만 metric으로 삼음
return a, b, c, (a+c)/b
else:
return a, b, c, a/b
res = []
res_idx = []
for i, r in enumerate(r_data): #r_data는 리뷰 텍스트
_, _, _, metric = check_dup(r)
if metric < 0.3: #한계값 0.3
res.append(r)
res_idx.append(i)
30개 정도의 중복, 도배 글들을 잡아낼 수 있었다.
물론 이 중에는 잘못 추출된 내용들도 있었다.
1) 영어
이 경우엔 '영어'임을 고려해 따로 처리해 주던가 글자 수 종류(a)를 제한하는 방법이 있겠다. 영어의 경우 소문자만 따지면 26글자가 최대 글자 종류 수이다. 도배, 중복글의 경우에는 글자 수가 이보다 적을 것이기에 종류 수를 10글자 내외로 제한한다면 위와 같은 패턴을 배제할 수 있을 것이다.
2) 문장부호의 중복, 도배
이 경우는 정규표현식 등을 통해 문장부호를 사전에 정규화 시켜줌으로써 해결할 수 있을 것이다.
도배, 중복글 제외 후 분석
제거보다는 하나로 정규화하는 게 더 좋겠지만, 30개 정도밖에 되지 않기에 우선은 제거하기로 한다.
*pandas에서 행을 제외하는 방법은 아래 링크에서 살펴볼 수 있다. (인덱스를 구한 후 제거)
skyjwoo.tistory.com/entry/python-pandas-%EA%B8%B0%EB%B3%B8-%EC%A0%95%EB%A6%AC
명사 통계2
1위였던 '스킨'이 사라졌음을 알 수 있다.
2-gram 통계2
'스킨 내줘' 패턴이 사라지고 최대 빈도수가 2000가량에서 100 정도로 줄었으며 재밌다는 내용이 많이 확인되었다.
이상으로 블랙서바이벌 영원회귀 스팀 리뷰를 간단하게 살펴보고 중복, 도배글(뭐라 해야하지????)에 대한 처리도 해보았다. 이후에는 자질, 감성 어휘, 실제 게임 내용과 관련한 온톨로지 구축 등을 이용한 지식표현 등 더 자세한 분석을 해보고 싶다.
'컴퓨터' 카테고리의 다른 글
Porter Stemmer(포터 스테머)를 만들어보자! (1) | 2021.04.22 |
---|---|
[알고리즘] 백준. 행렬 제곱 #10830 (0) | 2021.01.19 |
자연어 처리 EDA(Exploratory Data Analysis) (3) | 2020.12.17 |
python pandas 기본 정리 (0) | 2020.12.11 |
pyinstaller FileNotFoundError: [Errno 2] No such file or directory: [16716] Failed to execute script 오류 (0) | 2020.12.06 |
댓글