보유한 암호화폐
: 비트코인, 이더리움, 리플, 펀디엑스, 비체인, 체인링크, 솔라, 메디블록, 넴, 비트코인캐쉬, 쎄타토큰, 쎄타퓨엘, 솔라나
* 볼드체로 표시한 화폐 : 업비트 가상화폐 국문 백서에 있는 화폐
암호화폐 백서 키워드 추출
1) 데이터 수집
업비트 투자자보호센터 웹사이트에서 암호화폐 백서 파일 다운로드 가능.
https://upbitcare.com/academy/research?page=1&category=white_paper
1. 비트코인 (BTC)
2. 리플 (XRP)
3. 넴 (XEM)
4. 쎄타퓨엘 (TFUEL)
5. 솔라나 (SOL)
PDF 파일이므로, Python 라이브러리를 이용해 우선 text data로 변환해준다.
2) PDF to TEXT
PyPDF2 라이브러리를 사용해 PDF 파일을 읽어와서 그 안에 있는 모든 텍스트를 추출
https://wooiljeong.github.io/python/pdf-to-text/
다운로드 받은 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
['사용자', '스트리밍', '토큰', '비즈니스', '메타', '메인', '엣지', '비디오', '서브', '체인']
괜찮은 것 같다!
댓글