1. Text Analysis / Text Preprocessing
텍스트 분석 이해 - NLP와 텍스트 분석
Text Analysis의 주요 영역
- Text Classification(텍스트 분류): Supervised Learning
- Sentiment Analysis(감성 분석): Supervised Learning + Unsupervised Learning
- Summarization(텍스트 요약)
- Text Clustering(텍스트 군집화와 유사도 측정): Unsupervised Learning
Text Analysis ML Process
- Text Data 사전 가공
- Feature Vectorization 수행: Bag of Words, Word2Vec
- Feature 기반의 Data Set 제공
- ML 학습 / 예측 / 평가
Python 기반의 NLP, Text Analysis 패키지
- NLTK (National Language Toolkit for Python): Python의 가장 대표적인 NLP 패키지, 대량 데이터 기반에서는 제대로 활용 X
- Gensim: Topic Modeling 중심, Word2Vec 구현 등의 신기능 제공
- SpaCy: 뛰어난 수행 성능, 많은 NLP Application에서 SpaCy를 사용
Text Preprocessing - Text Normalization (텍스트 전처리 - 텍스트 정규화)
- Cleansing
- 텍스트에서 분석에 오히려 방해가 되는 불필요한 문자, 기호 등을 사전에 제거하는 작업
- HTML, XML 태그나 특정 기호 등을 사전에 제거
- Tokenization
- 문장 토큰화, 단어 토큰화, n-gram
- Filtering / StopWord Elimination / Spelling Error
- 불필요한 단어나 분석에 큰 의미가 없는 단어 (a, the, is, will 등) 그리고 잘못된 철자 수정
- Stemming / Lemmatization
- 어근 (단어 원형) 추출, Lemmatization이 Stemming 보다 정교하고 의미론적 기반에서 단어 원형을 찾아줌
N-gram
- 문장을 개별 단어 별로 하나씩 Token화할 경우 문맥적인 의미는 무시될 수 밖에 없음 -> 이러한 문제를 조금이라도 해결하고자 도입된 것이 n - gram
- n - gram은 연속된 n개의 단어를 하나의 Token화 단위로 분리해 내는 것
- n개 단어 크기 윈도우를 만들어 문장의 처음부터 오른쪽으로 움직이면서 Token화를 수행
- 예를 들어 'Agent Smith knocks the door'를 2-gram(bigram)으로 만들면 (Agent, Smith), (Smith, knocks), (knocks, the), (the, door)와 같이 연속적으로 2개의 단어들을 순차적으로 이동하면서 단어들을 Token화함
2. 실습 - Text Preprocessing / Text Normalization
Text Tokenization
- 문장 토큰화: '.'으로 끝나는 문장기준
from nltk import sent_tokenize
text_sample = "The Matrix is everywhere its all around us, here even in this room. \
You can see it out your window or on your television. \
You feel it when you go to work, or go to church or pay your taxes."
sentences = sent_tokenize(text=text_sample)
print(type(sentences), len(sentences))
print(sentences)
<class 'list'> 3
['The Matrix is everywhere its all around us, here even in this room.', 'You can see it out your window or on your television.', 'You feel it when you go to work, or go to church or pay your taxes.']
- 단어 토큰화: 공백 기준
from nltk import word_tokenize
sentence = "The Matrix is everywhere its all around us, here even in this room."
words = word_tokenize(sentence)
print(type(words), len(words))
print(words)
<class 'list'> 15
['The', 'Matrix', 'is', 'everywhere', 'its', 'all', 'around', 'us', ',', 'here', 'even', 'in', 'this', 'room', '.']
- 여러 문장들에 대한 단어 토큰화
from nltk import word_tokenize, sent_tokenize
# 여러개의 문장으로 된 입력 데이터를 문장별로 단어 토큰화 만드는 함수 생성
def tokenize_text(text):
# 문장별로 분리 토큰
sentences = sent_tokenize(text)
# 분리된 문장별 단어 토큰화
word_tokens = [word_tokenize(sentence) for sentence in sentences]
return word_tokens
# 여러 문장들에 대해 문장별 단어 토큰화 수행.
word_tokens = tokenize_text(text_sample)
print(type(word_tokens), len(word_tokens))
print(word_tokens)
<class 'list'> 3
[['The', 'Matrix', 'is', 'everywhere', 'its', 'all', 'around', 'us', ',', 'here', 'even', 'in', 'this', 'room', '.'], ['You', 'can', 'see', 'it', 'out', 'your', 'window', 'or', 'on', 'your', 'television', '.'], ['You', 'feel', 'it', 'when', 'you', 'go', 'to', 'work', ',', 'or', 'go', 'to', 'church', 'or', 'pay', 'your', 'taxes', '.']]
- n - gram
from nltk import ngrams
sentence = "The Matrix is everywhere its all around us, here even in this room."
words = word_tokenize(sentence)
all_ngrams = ngrams(words, 2)
ngrams = [ngram for ngram in all_ngrams]
print(ngrams)
[('The', 'Matrix'), ('Matrix', 'is'), ('is', 'everywhere'), ('everywhere', 'its'), ('its', 'all'), ('all', 'around'), ('around', 'us'), ('us', ','), (',', 'here'), ('here', 'even'), ('even', 'in'), ('in', 'this'), ('this', 'room'), ('room', '.')]
Stopwords 제거
import nltk
nltk.download("stopwords")
- 영어 stop words
print("영어 stop words 갯수:", len(nltk.corpus.stopwords.words("english")))
print(nltk.corpus.stopwords.words("english")[:40])
영어 stop words 갯수: 179
['i', 'me', 'my', 'myself', 'we', 'our', 'ours', 'ourselves', 'you', "you're", "you've", "you'll", "you'd", 'your', 'yours', 'yourself', 'yourselves', 'he', 'him', 'his', 'himself', 'she', "she's", 'her', 'hers', 'herself', 'it', "it's", 'its', 'itself', 'they', 'them', 'their', 'theirs', 'themselves', 'what', 'which', 'who', 'whom', 'this']
- stopwords 제거 w/ 2중 for문
import nltk
stopwords = nltk.corpus.stopwords.words("english")
all_tokens = []
# 위 예제의 3개의 문장별로 얻은 word_tokens list 에 대해 stop word 제거 Loop
for sentence in word_tokens:
filtered_words = []
# 개별 문장별로 tokenize된 sentence list에 대해 stop word 제거 Loop
for word in sentence:
# 소문자로 모두 변환합니다.
word = word.lower()
# tokenize 된 개별 word가 stop words 들의 단어에 포함되지 않으면 word_tokens에 추가
if word not in stopwords:
filtered_words.append(word)
all_tokens.append(filtered_words)
print(all_tokens)
[['matrix', 'everywhere', 'around', 'us', ',', 'even', 'room', '.'], ['see', 'window', 'television', '.'], ['feel', 'go', 'work', ',', 'go', 'church', 'pay', 'taxes', '.']]
Stemming과 Lemmatization
어근(원형) 추출
- Stemming: 정확도가 다소 아쉬움
from nltk.stem import LancasterStemmer
stemmer = LancasterStemmer()
print(stemmer.stem("working"), stemmer.stem("works"), stemmer.stem("worked"))
print(stemmer.stem("amusing"), stemmer.stem("amuses"), stemmer.stem("amused"))
print(stemmer.stem("happier"), stemmer.stem("happiest"))
print(stemmer.stem("fancier"), stemmer.stem("fanciest"))
work work work
amus amus amus
happy happiest
fant fanciest
- Lemmatization: 품사를 찾아서 넣어줘야 함
from nltk.stem import WordNetLemmatizer
lemma = WordNetLemmatizer()
print(
lemma.lemmatize("amusing", "v"),
lemma.lemmatize("amuses", "v"),
lemma.lemmatize("amused", "v"),
)
print(lemma.lemmatize("happier", "a"), lemma.lemmatize("happiest", "a"))
print(lemma.lemmatize("fancier", "a"), lemma.lemmatize("fanciest", "a"))
amuse amuse amuse
happy happy
fancy fancy
3. Text Feature Vectorization
Text Feature Vectorization
- Bag of Words: 각 문서에서 단어의 횟수나 정규화 변환된 횟수
- Document Term Matrix: 개별 문서(or 문장)을 단어들의 횟수나 정규화 변환된 횟수로 표현
- Word Embedding (Word2Vec): 개별 단어를 문맥을 가지는 N차원 공간에 벡터로 표현
Bag of Words - BOW
Bag of Words 모델은 문서가 가지는 모든 단어의 문맥이나 순서를 무시하고 일괄적으로 단어에 대해 빈도 값을 부여해 Feature 값을 추출하는 모델
문서 내 모든 단어를 한꺼번에 봉투 (Bag)안에 넣은 뒤에 흔들어서 섞는다는 의미로 Bag of Words(BOW) 모델이라고 함
Bag of Words - Structure
Bag of Words - Pros & Cons
Pros
- 쉽고 빠른 구축
- 예상보다 문서의 특징을 잘 나타내어 전통적으로 여러분야에서 활용도가 높음
Cons
- 문맥 의미(Semantic Context) 반영 문제
- 희소 행렬 문제 (Null값으로 인한 Memory Problem)
Bag of Words - Feature Vectorization
- M x N Feature Vectorization
Bag of Words - Feature Vectorization 유형
- 단순 Count 기반의 Vectorization: CountVectorizer
- 단어 Feature에 값을 부여할 때 각 문서에서 해당 단어가 나타나는 횟수, 즉 Count를 부여하는 경우를 Count 벡터화라고 함
- Count 벡터화에서는 Count값이 높을수록 중요한 단어로 인식됨
- TF - IDF 벡터화: TfidfVectorizer
- Count만 부여할 경우 그 문서의 특징을 나타내기 보다는 언어의 특성상 문장에서 자주 사용될 수 밖에 없는 단어까지 높은 값을 부여하게 됨
- 이러한 문제를 보완하기 위해 TF - IDF (Term Frequency Inverse Document Frequency) 벡터화를 사용
개별 문서에서 자주 나타나는 단어에 높은 가중치를 주되, 모든 문서에서 전반적으로 자주 나타나는 단어에 대해서는 페널티를 주는 방식으로 값을 부여
TF - IDF (Term Frequency Inverse Document Frequency)
- 특정 단어가 다른 문서에서는 나타나지 않고 특정 문서에서만 자주 사용된다면 해당 단어는 해당 문서를 잘 특징짓는 중요 단어일 가능성이 높음
- 특정 단어가 매우 많은 여러 문서에서 빈번히 나타난다면 해당 단어는 개별 문서를 특정짓는 정보로서의 의미를 상실
TF (Term Frequency): 문서에서 해당 단어가 얼마나 나왔는지를 나타내는지표
DF (Document Frequency): 해당 단어가 몇 개의 문서에서 나타났는지를 나타내는 지표
IDF (Inverse Document Frequency): DF의 역수로서 전체 문서수 / DF
TF, IDF, TF - IDF 계산 방법
CountVectorizer @ Scikit - Learn
Parameters
사전 데이터 가공
- lower_case: 모든 문자를 소문자로 변경할 것인지를 설정, default=True
토큰화
- token_pattern: 토큰화를 수행하는 정규 표현식 패턴을 지정, default='\b\w\w+\b'로
- 공백 또는 개행 문자 등을 구분된 단어 분리자(\b) 사이의 2문자 (문자 또는 숫자, 즉 영숫자) 이상의 단어(word)를 토큰으로 분리함
- 어근 추출시 외부 함수를 사용할 경우 해당 외부 함수를 token_pattern의 인자로 사용
- analyzer: Feature 추출을 수행한 단위를 지정, default='word'
- Word가 아니라 character의 특정 범위를 Feature로 만드는 특정한 경우 등을 적용할 때 사용
- ngram_range: BOW 모델의 단어 순서를 어느 정도 보강하기 위한 n-gram 범위를 설정
- tuple 형태로 (범위 최솟값, 범위 최댓값)을 지정
- (a,b): 토큰화된 단어를 a개씩 묶어서, (a+1)개씩 묶어서, .... , b개씩 묶어서 Feature로 추출
- b가 증가할수록 Feature 개수 증가
텍스트 정규화
- stop_words: stop_word로 지정된 단어는 추출에서 제외
Feature Vectorization (Feature의 개수 제한)
- max_df: 전체 문서에 걸쳐서 너무 높은 빈도수를 가지는 단어 Feature를 제외하기 위한 Parameter
- 너무 높은 빈도수를 가지는 단어는 stop_word와 비슷한 문법적인 특성으로 반복적인 단어일 가능성이 높기에 이를 제거하기 위해 사용
- min_df: 전체 문서에 걸쳐서 너무 낮은 빈도수를 가지는 단어 Feature를 제외하기 위한 Parameter
- 수백 ~ 수천 개의 문서에서 특정 단어가 min_df에 설정된 값보다 적은 빈도수를 가진다면 이 단어는 크게 중요하지 않거나 가비지(garbage)성 단어일 확률이 높음
- max_features: Feature로 추출하는 Feature의 개수를 제한하며 정수로 값을 지정
- 가장 높은 빈도를 가지는 단어 순으로 정렬하여 추출
4. 실습 - Bag of Words (BOW)
- Scikit - Learn CountVectorizer Test
text_sample_01 = "The Matrix is everywhere its all around us, here even in this room. \
You can see it out your window or on your television. \
You feel it when you go to work, or go to church or pay your taxes."
text_sample_02 = "You take the blue pill and the story ends. You wake in your bed and you believe whatever you want to believe\
You take the red pill and you stay in Wonderland and I show you how deep the rabbit-hole goes."
text = []
text.append(text_sample_01)
text.append(text_sample_02)
print(text, "\n", len(text))
['The Matrix is everywhere its all around us, here even in this room. You can see it out your window or on your television. You feel it when you go to work, or go to church or pay your taxes.', 'You take the blue pill and the story ends. You wake in your bed and you believe whatever you want to believe You take the red pill and you stay in Wonderland and I show you how deep the rabbit-hole goes.']
2
- CountVectorizer 객체 생성 후 fit(), transform()으로 Text에 대한 Feature vectorization 수행
from sklearn.feature_extraction.text import CountVectorizer
# Count Vectorization으로 feature extraction 변환 수행.
cnt_vect = CountVectorizer()
cnt_vect.fit(text)
ftr_vect = cnt_vect.transform(text)
- Feature Vectorization 후 데이터 유형 및 여러 속성 확인
print(type(ftr_vect), ftr_vect.shape)
print(ftr_vect)
- 희소행렬의 특성 때문에 csr 형식으로 변환
- 위치 index, 빈도수 반환
<class 'scipy.sparse._csr.csr_matrix'> (2, 51)
(0, 0) 1
(0, 2) 1
(0, 6) 1
(0, 7) 1
(0, 10) 1
(0, 11) 1
(0, 12) 1
(0, 13) 2
(0, 15) 1
(0, 18) 1
(0, 19) 1
(0, 20) 2
(0, 21) 1
(0, 22) 1
(0, 23) 1
(0, 24) 3
(0, 25) 1
(0, 26) 1
(0, 30) 1
(0, 31) 1
(0, 36) 1
(0, 37) 1
(0, 38) 1
(0, 39) 1
(0, 40) 2
: :
(1, 1) 4
(1, 3) 1
(1, 4) 2
(1, 5) 1
(1, 8) 1
(1, 9) 1
(1, 14) 1
(1, 16) 1
(1, 17) 1
(1, 18) 2
(1, 27) 2
(1, 28) 1
(1, 29) 1
(1, 32) 1
(1, 33) 1
(1, 34) 1
(1, 35) 2
(1, 38) 4
(1, 40) 1
(1, 42) 1
(1, 43) 1
(1, 44) 1
(1, 47) 1
(1, 49) 7
(1, 50) 1
- 각 Feature의 index 추출
print(cnt_vect.vocabulary_)
{'the': 38, 'matrix': 22, 'is': 19, 'everywhere': 11, 'its': 21, 'all': 0, 'around': 2, 'us': 41, 'here': 15, 'even': 10, 'in': 18, 'this': 39, 'room': 30, 'you': 49, 'can': 6, 'see': 31, 'it': 20, 'out': 25, 'your': 50, 'window': 46, 'or': 24, 'on': 23, 'television': 37, 'feel': 12, 'when': 45, 'go': 13, 'to': 40, 'work': 48, 'church': 7, 'pay': 26, 'taxes': 36, 'take': 35, 'blue': 5, 'pill': 27, 'and': 1, 'story': 34, 'ends': 9, 'wake': 42, 'bed': 3, 'believe': 4, 'whatever': 44, 'want': 43, 'red': 29, 'stay': 33, 'wonderland': 47, 'show': 32, 'how': 17, 'deep': 8, 'rabbit': 28, 'hole': 16, 'goes': 14}
cnt_vect = CountVectorizer(max_features=5, stop_words="english")
cnt_vect.fit(text)
ftr_vect = cnt_vect.transform(text)
print(type(ftr_vect), ftr_vect.shape)
print(cnt_vect.vocabulary_)
<class 'scipy.sparse._csr.csr_matrix'> (2, 5)
{'window': 4, 'pill': 1, 'wake': 2, 'believe': 0, 'want': 3}
- ngram_range 확인
cnt_vect = CountVectorizer(ngram_range=(1, 3))
cnt_vect.fit(text)
ftr_vect = cnt_vect.transform(text)
print(type(ftr_vect), ftr_vect.shape)
print(cnt_vect.vocabulary_)
<class 'scipy.sparse._csr.csr_matrix'> (2, 201)
{'the': 129, 'matrix': 77, 'is': 66, 'everywhere': 40, 'its': 74, 'all': 0, 'around': 11, 'us': 150, 'here': 51, 'even': 37, 'in': 59, 'this': 140, 'room': 106, 'you': 174, 'can': 25, 'see': 109, 'it': 69, 'out': 90, 'your': 193, 'window': 165, 'or': 83, 'on': 80, 'television': 126, 'feel': 43, 'when': 162, 'go': 46, 'to': 143, 'work': 171, 'church': 28, 'pay': 93, 'taxes': 125, 'the matrix': 132, 'matrix is': 78, 'is everywhere': 67, 'everywhere its': 41, 'its all': 75, 'all around': 1, 'around us': 12, 'us here': 151, 'here even': 52, 'even in': 38, 'in this': 60, 'this room': 141, 'room you': 107, 'you can': 177, 'can see': 26, 'see it': 110, 'it out': 70, 'out your': 91, 'your window': 199, 'window or': 166, 'or on': 86, 'on your': 81, 'your television': 197, 'television you': 127, 'you feel': 179, 'feel it': 44, 'it when': 72, 'when you': 163, 'you go': 181, 'go to': 47, 'to work': 148, 'work or': 172, 'or go': 84, 'to church': 146, 'church or': 29, 'or pay': 88, 'pay your': 94, 'your taxes': 196, 'the matrix is': 133, 'matrix is everywhere': 79, 'is everywhere its': 68, 'everywhere its all': 42, 'its all around': 76, 'all around us': 2, 'around us here': 13, 'us here even': 152, 'here even in': 53, 'even in this': 39, 'in this room': 61, 'this room you': 142, 'room you can': 108, 'you can see': 178, 'can see it': 27, 'see it out': 111, 'it out your': 71, 'out your window': 92, 'your window or': 200, 'window or on': 167, 'or on your': 87, 'on your television': 82, 'your television you': 198, 'television you feel': 128, 'you feel it': 180, 'feel it when': 45, 'it when you': 73, 'when you go': 164, 'you go to': 182, 'go to work': 49, 'to work or': 149, 'work or go': 173, 'or go to': 85, 'go to church': 48, 'to church or': 147, 'church or pay': 30, 'or pay your': 89, 'pay your taxes': 95, 'take': 121, 'blue': 22, 'pill': 96, 'and': 3, 'story': 118, 'ends': 34, 'wake': 153, 'bed': 14, 'believe': 17, 'whatever': 159, 'want': 156, 'red': 103, 'stay': 115, 'wonderland': 168, 'show': 112, 'how': 56, 'deep': 31, 'rabbit': 100, 'hole': 54, 'goes': 50, 'you take': 187, 'take the': 122, 'the blue': 130, 'blue pill': 23, 'pill and': 97, 'and the': 6, 'the story': 138, 'story ends': 119, 'ends you': 35, 'you wake': 189, 'wake in': 154, 'in your': 64, 'your bed': 194, 'bed and': 15, 'and you': 8, 'you believe': 175, 'believe whatever': 18, 'whatever you': 160, 'you want': 191, 'want to': 157, 'to believe': 144, 'believe you': 20, 'the red': 136, 'red pill': 104, 'you stay': 185, 'stay in': 116, 'in wonderland': 62, 'wonderland and': 169, 'and show': 4, 'show you': 113, 'you how': 183, 'how deep': 57, 'deep the': 32, 'the rabbit': 134, 'rabbit hole': 101, 'hole goes': 55, 'you take the': 188, 'take the blue': 123, 'the blue pill': 131, 'blue pill and': 24, 'pill and the': 98, 'and the story': 7, 'the story ends': 139, 'story ends you': 120, 'ends you wake': 36, 'you wake in': 190, 'wake in your': 155, 'in your bed': 65, 'your bed and': 195, 'bed and you': 16, 'and you believe': 9, 'you believe whatever': 176, 'believe whatever you': 19, 'whatever you want': 161, 'you want to': 192, 'want to believe': 158, 'to believe you': 145, 'believe you take': 21, 'take the red': 124, 'the red pill': 137, 'red pill and': 105, 'pill and you': 99, 'and you stay': 10, 'you stay in': 186, 'stay in wonderland': 117, 'in wonderland and': 63, 'wonderland and show': 170, 'and show you': 5, 'show you how': 114, 'you how deep': 184, 'how deep the': 58, 'deep the rabbit': 33, 'the rabbit hole': 135, 'rabbit hole goes': 102}
5. 희소행렬의 이해
CountVectorizer를 이용한 Feature Vectorization
희소 행렬 (CSR Matrix)
희소 행렬의 저장 변환 방식
- COO 형식
- Coordinate (좌표) 방식을 의미하며 0이 아닌 데이터만 별도의 배열(array)에 저장하고 그 데이터를 가리키는 행과 열의 위치를 별도의 배열로 저장하는 방식
- CSR 형식
- COO 형식이 위치 배열값을 중복적으로 가지는 문제를 해결한 방식
- 일반적으로 CSR 형식이 COO보다 많이 사용됨
Python에서는 행렬을 COO, CSR 형식으로 변환하기 위해 Scipy의 coo_matrix(), csr_matrix() 함수를 이용
COO 형식
CSR 형식
Sparse Matrix Implementation
from scipy import sparse
sparse.coo_matrix((data, (row_pos, col_pos)) or sparse.coo_matrix(dense_matrix)
sparse.csr_matrix((data, col_pos, ros_pos_ind) or sparse.csr_matrix(dense_matrix)
다시 Dense로 출력 확인 하고 싶으면 객체에 .toarray() 처리
희소 행렬 - COO 형식
import numpy as np
dense = np.array([[3, 0, 1], [0, 2, 0]])
from scipy import sparse
# 0 이 아닌 데이터 추출
data = np.array([3, 1, 2])
# 행 위치와 열 위치를 각각 array로 생성
row_pos = np.array([0, 0, 1])
col_pos = np.array([0, 2, 1])
# sparse 패키지의 coo_matrix를 이용하여 COO 형식으로 희소 행렬 생성
sparse_coo = sparse.coo_matrix((data, (row_pos, col_pos)))
print(type(sparse_coo))
print(sparse_coo)
dense01 = sparse_coo.toarray()
print(type(dense01), "\n", dense01)
<class 'scipy.sparse._coo.coo_matrix'>
(0, 0) 3
(0, 2) 1
(1, 1) 2
<class 'numpy.ndarray'>
[[3 0 1]
[0 2 0]]
희소 행렬 - CSR 형식
from scipy import sparse
dense2 = np.array(
[
[0, 0, 1, 0, 0, 5],
[1, 4, 0, 3, 2, 5],
[0, 6, 0, 3, 0, 0],
[2, 0, 0, 0, 0, 0],
[0, 0, 0, 7, 0, 8],
[1, 0, 0, 0, 0, 0],
]
)
# 0 이 아닌 데이터 추출
data2 = np.array([1, 5, 1, 4, 3, 2, 5, 6, 3, 2, 7, 8, 1])
# 행 위치와 열 위치를 각각 array로 생성
row_pos = np.array([0, 0, 1, 1, 1, 1, 1, 2, 2, 3, 4, 4, 5])
col_pos = np.array([2, 5, 0, 1, 3, 4, 5, 1, 3, 0, 3, 5, 0])
# COO 형식으로 변환
sparse_coo = sparse.coo_matrix((data2, (row_pos, col_pos)))
# 행 위치 배열의 고유한 값들의 시작 위치 인덱스를 배열로 생성
row_pos_ind = np.array([0, 2, 7, 9, 10, 12, 13])
# CSR 형식으로 변환
sparse_csr = sparse.csr_matrix((data2, col_pos, row_pos_ind))
print("COO 변환된 데이터가 제대로 되었는지 다시 Dense로 출력 확인")
print(sparse_coo.toarray())
print("CSR 변환된 데이터가 제대로 되었는지 다시 Dense로 출력 확인")
print(sparse_csr.toarray())
COO 변환된 데이터가 제대로 되었는지 다시 Dense로 출력 확인
[[0 0 1 0 0 5]
[1 4 0 3 2 5]
[0 6 0 3 0 0]
[2 0 0 0 0 0]
[0 0 0 7 0 8]
[1 0 0 0 0 0]]
CSR 변환된 데이터가 제대로 되었는지 다시 Dense로 출력 확인
[[0 0 1 0 0 5]
[1 4 0 3 2 5]
[0 6 0 3 0 0]
[2 0 0 0 0 0]
[0 0 0 7 0 8]
[1 0 0 0 0 0]]
print(sparse_csr)
(0, 2) 1
(0, 5) 5
(1, 0) 1
(1, 1) 4
(1, 3) 3
(1, 4) 2
(1, 5) 5
(2, 1) 6
(2, 3) 3
(3, 0) 2
(4, 3) 7
(4, 5) 8
(5, 0) 1
dense3 = np.array(
[
[0, 0, 1, 0, 0, 5],
[1, 4, 0, 3, 2, 5],
[0, 6, 0, 3, 0, 0],
[2, 0, 0, 0, 0, 0],
[0, 0, 0, 7, 0, 8],
[1, 0, 0, 0, 0, 0],
]
)
coo = sparse.coo_matrix(dense3)
csr = sparse.csr_matrix(dense3)