본문 바로가기
투자x개발/암호화폐

암호화폐 비정형 데이터 분석

by didi0di 2023. 4. 3.
728x90

보유한 암호화폐

: 비트코인, 이더리움, 리플, 펀디엑스, 비체인, 체인링크, 솔라, 메디블록, , 비트코인캐쉬, 쎄타토큰, 쎄타퓨엘, 솔라나

* 볼드체로 표시한 화폐 : 업비트 가상화폐 국문 백서에 있는 화폐

 

암호화폐 백서 키워드 추출

1) 데이터 수집 

업비트 투자자보호센터 웹사이트에서 암호화폐 백서 파일 다운로드 가능.

 

https://upbitcare.com/academy/research?page=1&category=white_paper 

 

조사·연구 - 업비트 투자자보호센터

디지털자산의 발전방향에 대한 연구자료

upbitcare.com

 

1. 비트코인 (BTC)

[업비트 투자자보호센터] 비트코인 국문 백서.pdf
3.85MB

2. 리플 (XRP)

[업비트 투자자보호센터] 리플 국문 백서.pdf
3.58MB

3. 넴 (XEM)

[업비트 투자자보호센터] 넴 국문 백서.pdf
2.22MB

4. 쎄타퓨엘 (TFUEL)

[업비트 투자자보호센터] 쎄타퓨엘 국문 백서.pdf
6.57MB

5. 솔라나 (SOL)

[업비트 투자자보호센터] 솔라나 국문 백서.pdf
1.31MB

 

PDF 파일이므로, Python 라이브러리를 이용해 우선 text data로 변환해준다.

 

2) PDF to TEXT

 

 PyPDF2 라이브러리를 사용해 PDF 파일을 읽어와서 그 안에 있는 모든 텍스트를 추출

https://wooiljeong.github.io/python/pdf-to-text/

 

Python으로 PDF에서 텍스트 추출하기(pdf to text)

파이썬으로 PDF파일에서 텍스트 추출하는 방법

wooiljeong.github.io

 

다운로드 받은 PDF 파일들을 읽어오자.

import glob

# 암호화폐 백서 PDF 파일 경로
PDF_FILE_PATH = "/content/drive/MyDrive/Colab Notebooks/crypto/data"

target = PDF_FILE_PATH+'/*.pdf'
pdf_list = glob.glob(target)
pdf_list

>> ['/content/drive/MyDrive/Colab Notebooks/crypto/data/[업비트 투자자보호센터] 비트코인 국문 백서.pdf',
 '/content/drive/MyDrive/Colab Notebooks/crypto/data/[업비트 투자자보호센터] 리플 국문 백서.pdf',
 '/content/drive/MyDrive/Colab Notebooks/crypto/data/[업비트 투자자보호센터] 넴 국문 백서.pdf',
 '/content/drive/MyDrive/Colab Notebooks/crypto/data/[업비트 투자자보호센터] 솔라나 국문 백서.pdf',
 '/content/drive/MyDrive/Colab Notebooks/crypto/data/[업비트 투자자보호센터] 쎄타퓨엘 국문 백서.pdf']

 

PDF를 text 데이터로 변환해주는 함수를 만들고, 우선 리플 백서를 샘플 데이터로 이용

 

from PyPDF2 import PdfReader

def pdf_to_text(pdf_file) : 

    reader = PdfReader(pdf_file)
    pages = reader.pages
    text = ""
    for page in pages:
        sub = page.extract_text()
        text += sub

    return text

xrp = pdf_list[1]
print(pdf_to_text(xrp))

>> - 1 -  리플          해당 번역본은 투자자가 디지털 자산 관련 정보를 보다 편리하게 확인할 수 있도록 단순 참고용으로 작성된 것이며 번역본의 특성상 원문의 취지 등이 정확히 반영되지 않을 수 있습니다. 보다 정확한 정보 확인을 위해서는 원문을 참고하여 주시기 바랍니다. 번역본의 원본은 영어로 작성된 백서 혹은 디지털 자산 프로젝트의 소개서이며 원본 내용의 변경 등으로 인해 원본과 번역본 사이에 불일치가 발생할 수 있습니다. 두나무는 제공된 정보에 의한 투자 결과에 대해 법적인 책임을 지지 않으며, 백서 내용 등에 문의사항이 있는 경우 프로젝트 팀을 비롯하여 각 정보 제공 주체 측에 문의하여 주시기 바랍니다. (이하생략)

 

3) 키워드 추출

 

키워드 추출을 위해 토큰화를 진행해야 한다.

토큰화는

1) 공백으로 구분    2) Konlpy 토크나이저 사용 (Okt)

2가지 방식으로 진행해보았다. 

 

3-1) 공백으로 구분 

words = text.split()
print(words)

>> ['-', '1', '-', '리플', '해당', '번역본은', '투자자가', '디지털', '자산', '관련', '정보를', '보다', '편리하게', '확인할', ...]

 

  • 다빈도로 등장한 단어 카운트
from collections import Counter

c = Counter(text.split())
words = c.most_common()
words[:10]

>> [('수', 82),
 ('합의', 70),
 ('-', 37),
 ('있습니다.', 36),
 ('모든', 32),
 ('네트워크', 27),
 ('노드가', 23),
 ('경우', 22),
 ('있는', 21),
 ('각', 21)]

+ 한글자 짜리 단어는 제거

from collections import Counter

tokens = [ token for token in text.split() if len(token) > 1 ]
c = Counter(tokens)
words = c.most_common()
words[:10]

>> [('합의', 70),
 ('있습니다.', 36),
 ('모든', 32),
 ('네트워크', 27),
 ('노드가', 23),
 ('경우', 22),
 ('있는', 21),
 ('됩니다.', 17),
 ('UNL', 17),
 ('대하여', 16)]

 

3-2) Okt 토크나이저 사용 -> 명사만 추출

from konlpy.tag import Okt

okt = Okt()
nouns = okt.nouns(text)
nouns

>> ['리플',
 '해당',
 '번역본',
 '투자자',
 '디지털',
 '자산',
 '관련',
 '정보',
 '확인',
 '수',
 '단순',
 '참고',
 '용',
 '작성',...]

+ 한글자 짜리 단어는 제거 후 TOP 10개 단어 (명사) 추출

 

tokens = okt.nouns(text)
tokens = [ token for token in tokens if len(token) > 1 ] # 한 글자인 단어는 제외
words = Counter(tokens).most_common()
words[:10]

>> [('합의', 128),
 ('노드', 74),
 ('경우', 57),
 ('네트워크', 57),
 ('트랜잭션', 54),
 ('모든', 33),
 ('정확성', 31),
 ('알고리즘', 29),
 ('원장', 26),
 ('절차', 26)]

 

명사만 추출하니, 아까 보였던 UNL 같은 키워드가 누락된 것을 확인할 수 있었다.

따라서 이번엔 각 어절에 대해 TF 점수를 계산하는 방식을 사용하고, 코드 재사용성을 위해 함수로 만들었다.

 

def keyword_extractor(tokenizer, text):
    tokens = tokenizer.phrases(text)
    tokens = [ token for token in tokens if len(token) > 1 ] # 한 글자인 단어는 제외
    count_dict = [(token, text.count(token)) for token in tokens ]
    ranked_words = sorted(count_dict, key=lambda x:x[1], reverse=True)[:10]
    return [ keyword for keyword, freq in ranked_words ]

print( keyword_extractor(okt, text) )

>> ['합의', '노드', '경우', '네트워크', '트랜잭션', 'UNL', '모든', '정확성', '알고리즘', 'on']

결론

: 리플 암호화폐 백서에서는 위와 같은 키워드가 많이 등장했으므로, 리플 코인의 특징은 "합의" , "노드", "네트워크", "트랜잭션", "UNL"등 이라고 볼 수 있다.

 

이제 나머지 4개 코인에 대해서도 동일한 과정을 수행한다.

 


 

암호화폐 별 TOP 10 키워드 추출 결과

1.  Okt - phrases

for pdf in pdf_list : 
  print(pdf.split("/")[-1])
  text = pdf_to_text(pdf)
  print("TOP 10 키워드 : ", keyword_extractor(okt, text) )
  print()
  
>> [업비트 투자자보호센터] 비트코인 국문 백서.pdf
TOP 10 키워드 :  ['in', 'he', 'on', 'the', 'an', 're', 'it', 'or', 'of', 'to']

[업비트 투자자보호센터] 리플 국문 백서.pdf
TOP 10 키워드 :  ['합의', '노드', '경우', '네트워크', '트랜잭션', 'UNL', '모든', '정확성', '알고리즘', 'on']

[업비트 투자자보호센터] 넴 국문 백서.pdf
TOP 10 키워드 :  ['노드', '계정', '트랜', '잭션', '트랜잭', '랜잭션', '트랜잭션', '블록', '중요', '중요성']

[업비트 투자자보호센터] 솔라나 국문 백서.pdf
TOP 10 키워드 :  ['증명', '생성', '검증', '해시', '역사', '사증명', '역사증', '역사증명', '생성기', '성기']

[업비트 투자자보호센터] 쎄타퓨엘 국문 백서.pdf
TOP 10 키워드 :  ['체인', '서브', '서브체인', '비디오', '사용', '메인', '엣지', '트리', '네트', '네트워크']

비트코인 키워드 추출 결과가 좀 이상하다.. 그리고 나머지 코인들도 키워드가 중복이 좀 있는듯?

명사 추출로 바꿔서 다시 진행해 보았다.

 

2. Okt - nouns

def noun_keyword_extractor(tokenizer, text, top_n):
  
    tokens = tokenizer.nouns(text)
    tokens = [ token for token in tokens if len(token) > 1 ] # 한 글자인 단어는 제외
    words = Counter(tokens).most_common()
    ranked_words = words[:top_n]

    return [ keyword for keyword, freq in ranked_words ]
    
for pdf in pdf_list : 
  print(pdf.split("/")[-1])
  text = pdf_to_text(pdf)
  print("TOP 10 키워드 : ", noun_keyword_extractor(okt, text, top_n=10) )
  print()
  
  >> [업비트 투자자보호센터] 비트코인 국문 백서.pdf
TOP 10 키워드 :  ['블록', '노드', '작업', '거래', '증명', '트랜잭션', '네트워크', '비트코인', '체인', '시스템']

[업비트 투자자보호센터] 리플 국문 백서.pdf
TOP 10 키워드 :  ['합의', '노드', '경우', '네트워크', '트랜잭션', '모든', '정확성', '알고리즘', '원장', '절차']

[업비트 투자자보호센터] 넴 국문 백서.pdf
TOP 10 키워드 :  ['노드', '계정', '트랜잭션', '블록', '경우', '중요성', '네트워크', '다음', '점수', '계산']

[업비트 투자자보호센터] 솔라나 국문 백서.pdf
TOP 10 키워드 :  ['증명', '검증', '해시', '역사', '시퀀스', '성기', '시간', '복제', '네트워크', '데이터']

[업비트 투자자보호센터] 쎄타퓨엘 국문 백서.pdf
TOP 10 키워드 :  ['체인', '서브', '비디오', '메인', '엣지', '네트워크', '사용자', '검증', '메타', '블록']

이게 나은듯!

 

그러나 여전히 "노드", 네트워크" 등의 단어가 중복해서 나타나는 것을 볼 수 있다.

이를 개선하기 위해, TF-IDF 를 적용해서 각 암호화폐 별 특징적인 핵심 키워드 추출을 해보자.

 

4) 각 암호화폐 별 특징적인 키워드 추출

 

from sklearn.feature_extraction.text import TfidfVectorizer
import re

corpus = []
for pdf in pdf_list : 
  text = pdf.split("/")[-1] + pdf_to_text(pdf) # PDF 제목도 같이 추가
  text = re.sub(r"[^\uAC00-\uD7A30-9a-zA-Z\s]", "", text) # 특수문자 제거
  corpus.append(text)
  
vectorizer = TfidfVectorizer()
tfidf_matrix  = vectorizer.fit_transform(corpus)
vocab = {v: k for k, v in vectorizer.vocabulary_.items()} # 단어리스트 생성

for i in range(0, len(corpus)) :
  print(pdf_list[i].split("/")[-1])
  index = np.argsort(tfidf_matrix[i].toarray())[0][-10:] # top 10 키워드 추출
  print([vocab[x] for x in index])
  print()
  
>> [업비트 투자자보호센터] 비트코인 국문 백서.pdf
['nodes', 'it', 'transaction', '비트코인', 'and', 'by', 'of', 'is', 'to', 'the']

[업비트 투자자보호센터] 리플 국문 백서.pdf
['리플', '비잔틴', '대하여', 'xrp', '네트워크', '모든', '경우', '있습니다', 'unl', '합의']

[업비트 투자자보호센터] 넴 국문 백서.pdf
['점수', '이체', '트랜잭션', '확정', '계정', '경우', 'nem', 'multisig', '있습니다', '중요성']

[업비트 투자자보호센터] 솔라나 국문 백서.pdf
['생성기는', '복제', '모든', '시퀀스를', '해시', '합니다', '생성기가', '시퀀스에', '있습니다', '역사증명']

[업비트 투자자보호센터] 쎄타퓨엘 국문 백서.pdf
['있는', '검증자', '비즈니스', '거버넌스', 'web3', '서브체인', '엣지', '있습니다', '비디오', '쎄타']

각 암호화폐 별로 좀 다르게 키워드를 추출하기는 했지만, 특수문자 제거 외의 전처리를 안했더니

'대하여', '있습니다' 등 쓸모 없어 보이는 키워드들도 많이 나옴.

 

명사만 추려서 다시 해보자.

 

corpus = []
for pdf in pdf_list : 
  text = pdf.split("/")[-1] + pdf_to_text(pdf)
  text = re.sub(r"[^\uAC00-\uD7A30-9a-zA-Z\s]", "", text)
  text = " ".join(okt.nouns(text)) # 명사만 추출해서 corpus 구성
  corpus.append(text)
  
vectorizer = TfidfVectorizer()
tfidf_matrix  = vectorizer.fit_transform(corpus)
vocab = {v: k for k, v in vectorizer.vocabulary_.items()}

for i in range(0, len(corpus)) :
  print(pdf_list[i].split("/")[-1])
  index = np.argsort(tfidf_matrix[i].toarray())[0][-10:]
  print([vocab[x] for x in index])
  print()
  
  >> [업비트 투자자보호센터] 비트코인 국문 백서.pdf
['네트워크', '증명', '체인', '트랜잭션', '코인', '작업', '비트코인', '노드', '거래', '블록']

[업비트 투자자보호센터] 리플 국문 백서.pdf
['알고리즘', '절차', '라운드', '모든', '정확성', '트랜잭션', '네트워크', '경우', '노드', '합의']

[업비트 투자자보호센터] 넴 국문 백서.pdf
['다음', '이체', '계산', '경우', '점수', '트랜잭션', '블록', '계정', '중요성', '노드']

[업비트 투자자보호센터] 솔라나 국문 백서.pdf
['투표', '시간', '채권', '복제', '검증', '해시', '증명', '시퀀스', '성기', '역사']

[업비트 투자자보호센터] 쎄타퓨엘 국문 백서.pdf
['사용자', '스트리밍', '토큰', '비즈니스', '메타', '메인', '엣지', '비디오', '서브', '체인']

 

괜찮은 것 같다!

 

728x90

댓글