텍스트 데이터 (Python 사용)를 다루는 가이드

2020. 9. 5. 10:36데이터 분석(R, 판다스등)

id.analyticsvidhya.com/auth/login/?next=www.analyticsvidhya.com/blog/2018/02/the-different-methods-deal-text-data-predictive-python/

소개

모든 수준의 인공 지능을 달성하는 데 필요한 가장 큰 돌파구 중 하나는 텍스트 데이터를 처리 할 수있는 기계를 갖추는 것입니다. 고맙게도이 우주에서 생성되는 텍스트 데이터 의 양은 지난 몇 년 동안 기하 급수적으로 폭발적으로 증가했습니다.

조직은 생성되는 텍스트에서 실행 가능한 통찰력을 채굴 할 수있는 구조를 갖추는 것이 필수적이되었습니다. 소셜 미디어 분석에서 위험 관리 및 사이버 범죄 보호에 이르기까지 텍스트 데이터 처리가 그 어느 때보 다 중요해졌습니다.

이 기사에서는 고급 자연어 처리 기술 로 이어지는 몇 가지 기본 기술부터 시작하여 다양한 기능 추출 방법에 대해 설명 합니다. 또한 깨끗한 데이터에서 더 나은 기능을 추출하기 위해 텍스트 데이터의 전처리에 대해 배웁니다.

또한 더 깊이 들어가고 싶다면 NLP (Python 사용)에 대한 비디오 코스 도 있습니다 .

이 기사가 끝나면 직접 텍스트 작업을 수행 할 수 있습니다. 시작하자!

 

목차 :

  1. 텍스트 데이터를 사용한 기본 특징 추출
    • 단어 수
    • 문자 수
    • 평균 단어 길이
    • 불용어 수
    • 특수 문자 수
    • 숫자의 수
    • 대문자 단어 수
  2. 텍스트 데이터의 기본 텍스트 전처리
    • 낮은 케이스
    • 구두점 제거
    • 불용어 제거
    • 잦은 단어 제거
    • 희귀 단어 제거
    • 맞춤법 수정
    • 토큰 화
    • 어간
    • 주형 화
  3. 고급 텍스트 처리
    • N- 그램
    • 기간 빈도
    • 역 문서 빈도
    • 용어 주파수 역 문서 주파수 (TF-IDF)
    • 단어 가방
    • 감정 분석
    • 단어 삽입

1. 기본 특징 추출

자연어 처리에 대한 충분한 지식이 없더라도 텍스트 데이터를 사용하여 여러 기능을 추출 할 수 있습니다 . 이 섹션에서 그들 중 일부에 대해 논의 해 봅시다.

시작하기 전에 다른 작업을 수행하기 위해 데이터 세트에서 교육 파일을 빠르게 읽어 보겠습니다. 전체 기사에서는 datahack 플랫폼 의 트위터 감정 데이터 세트  사용합니다 .

기차 = pd.read_csv ( 'train_E6oV3lV.csv')

여기서는 텍스트 데이터로만 작업하고 있지만 숫자 기능이 텍스트와 함께 제공되는 경우 아래 방법을 사용할 수도 있습니다.

1.1 단어 수

우리가 추출 할 수있는 가장 기본적인 기능 중 하나는 각 트윗의 단어 수입니다. 이것의 기본 직관은 일반적으로 부정적인 감정이 긍정적 인 감정보다 적은 양의 단어를 포함한다는 것입니다.

이를 위해 파이썬 에서 split 함수를 사용하기 만하면됩니다 .

train [ 'word_count'] = train [ 'tweet']. apply (lambda x : len (str (x) .split ( ""))) 기차 [[ 'tweet', 'word_count']]. head ()

 

1.2 문자 수

이 기능은 또한 이전 기능 직관을 기반으로합니다. 여기에서는 각 트윗의 문자 수를 계산합니다. 이것은 트윗의 길이를 계산하여 수행됩니다.

train [ 'char_count'] = train [ 'tweet']. str.len () ## 여기에는 공백도 포함됩니다. 기차 [[ 'tweet', 'char_count']]. head ()

계산에는 필요한 경우 제거 할 수있는 공백 수도 포함됩니다.

 

1.3 평균 단어 길이

또한 각 트윗의 평균 단어 길이를 계산하는 또 다른 기능을 추출 할 것입니다. 이것은 또한 잠재적으로 우리 모델을 개선하는 데 도움이 될 수 있습니다.

여기에서 우리는 모든 단어의 길이의 합계를 트윗의 전체 길이로 나눕니다.

def avg_word (sentence) : 단어 = sentence.split () return (sum (len (word) for word in words) / len (words)) train [ 'avg_word'] = train [ 'tweet']. apply (lambda x : avg_word (x)) 기차 [[ 'tweet', 'avg_word']]. head ()

1.4 불용어의 수

일반적으로 NLP 문제를 해결하는 동안 가장 먼저해야 할 일은 불용어를 제거하는 것입니다. 그러나 때때로 불용어의 수를 계산하면 이전에 잃어버린 추가 정보를 얻을 수도 있습니다.

여기서는 파이썬의 기본 NLP 라이브러리 인 NLTK 에서 불용어를 가져 왔습니다 .

nltk.corpus에서 불용어 가져 오기 stop = stopwords.words ( 'english') train [ 'stopwords'] = train [ 'tweet']. apply (lambda x : len ([x for x in x.split () if x in stop])) train [[ 'tweet', 'stopwords']]. head ()

 

 

1.5 특수 문자 수

트윗에서 추출 할 수있는 또 하나의 흥미로운 기능은 그 안에있는 해시 태그 또는 멘션의 수를 계산하는 것입니다. 이것은 또한 텍스트 데이터에서 추가 정보를 추출하는 데 도움이됩니다.

여기서는 해시 태그 (또는 멘션)가 항상 단어의 시작 부분에 나타나기 때문에 '다음으로 시작' 기능을 사용합니다.

train [ 'hastags'] = train [ 'tweet']. apply (lambda x : len ([x for x in x.split () if x.startswith ( '#')])) 기차 [[ 'tweet', 'hastags']]. head ()

 

1.6 숫자의 수

단어 수를 계산 한 것처럼 트윗에있는 숫자의 수도 계산할 수 있습니다. 이 예제에서는 많이 사용하지 않지만 유사한 연습을 수행하는 동안 실행해야하는 유용한 기능입니다. 예를 들면 

train [ 'numerics'] = train [ 'tweet']. apply (lambda x : len ([x for x in x.split () if x.isdigit ()])) train [[ 'tweet', 'numerics']]. head ()

 

 

1.7 대문자 단어 수

분노 또는 분노는 대문자로 작성하여 표현하는 경우가 많으므로 이러한 단어를 식별하는 데 필요한 작업입니다.

train [ 'upper'] = train [ 'tweet']. apply (lambda x : len ([x for x in x.split () if x.isupper ()])) 기차 [[ 'tweet', 'upper']]. head ()

 

2. 기본 전처리

지금까지 텍스트 데이터에서 기본 기능을 추출하는 방법을 배웠습니다. B의 텍스트 및 특징 추출로는 efore 다이빙, 첫 번째 단계는 더 기능을 획득하기 위해 데이터를 청소해야한다. 훈련 데이터에 대한 몇 가지 기본 전처리 단계를 수행하여이를 달성 할 것입니다.

그래서 그것에 들어가 봅시다.

 

2.1 소문자

첫 번째 사전 처리 단계는 트윗을 소문자로 변환하는 것입니다. 이렇게하면 동일한 단어의 여러 사본이 생기지 않습니다. 예를 들어 단어 수를 계산하는 동안 'Analytics'와 'analytics'는 다른 단어로 간주됩니다.

train [ 'tweet'] = train [ 'tweet']. apply (lambda x : "".join (x.lower () for x in x.split ()))) train [ 'tweet']. head ()

2.2 구두점 제거

다음 단계는 텍스트 데이터를 처리하는 동안 추가 정보를 추가하지 않으므로 구두점을 제거하는 것입니다. 따라서 모든 인스턴스를 제거하면 훈련 데이터의 크기를 줄이는 데 도움이됩니다.

train [ 'tweet'] = train [ 'tweet']. str.replace ( '[^ \ w \ s]', '') train [ 'tweet']. head ()

위 출력에서 ​​볼 수 있듯이 '#'및 '@'를 포함한 모든 구두점이 훈련 데이터에서 제거되었습니다.

 

2.3 불용어 제거

앞에서 논의했듯이 불용어 (또는 일반적으로 발생하는 단어)는 텍스트 데이터에서 제거해야합니다. 이를 위해 불용어 목록을 직접 만들거나 미리 정의 된 라이브러리를 사용할 수 있습니다.

nltk.corpus에서 불용어 가져 오기 stop = stopwords.words ( 'english') train [ 'tweet'] = train [ 'tweet']. apply (lambda x : "".join (x for x in x.split () if x not in stop)) train [ 'tweet']. head ()

 

2.4 일반적인 단어 제거

이전에는 일반적인 의미에서 일반적으로 발생하는 단어를 제거했습니다. 텍스트 데이터에서 자주 발생하는 단어를 제거 할 수도 있습니다. 먼저 텍스트 데이터에서 가장 자주 발생하는 10 개의 단어를 확인한 다음 제거 또는 유지를 요청합니다.

freq = pd.Series ( ''.join (train [ 'tweet']). split ()). value_counts () [: 10] 주파수 > 사용자 17473 사랑 2647 ð 2511 2199 일 â 1797 행복한 1663 앰프 1582 메신저 1139 u 1136 시간 1110 dtype : int64

이제 텍스트 데이터를 분류하는 데 사용되지 않으므로이 단어를 제거하겠습니다.

freq = list (freq.index) train [ 'tweet'] = train [ 'tweet']. apply (lambda x : "".join (x for x in x.split () if x not in freq)) train [ 'tweet']. head ()

 

2.5 희귀 단어 제거

마찬가지로 가장 일반적인 단어를 제거했듯이 이번에는 거의 발생하지 않는 단어를 텍스트에서 제거해 보겠습니다. 그들은 매우 드물기 때문에 그들과 다른 단어 사이의 연관성은 소음에 의해 지배됩니다. 희귀 한 단어를보다 일반적인 형식으로 바꿀 수 있으며 그러면 더 많은 수를 갖게됩니다.

freq = pd.Series ( ''.join (train [ 'tweet']). split ()). value_counts () [-10 :] 주파수 > tvperfect 1 oau 1 850am 1 semangatpagi 1 친절한 용감한 1 무디 1 내리막 1 로레알 1 오 뭐하러 1 maannnn 1 dtype : int64freq = list (freq.index) train [ 'tweet'] = train [ 'tweet']. apply (lambda x : "".join (x for x in x.split () if x not in freq)) train [ 'tweet']. head ()

이러한 모든 사전 처리 단계는 필수적이며 어휘 혼란을 줄여 결국 생성되는 기능이 더 효과적입니다.

 

2.6 맞춤법 수정

우리는 모두 철자 오류가 많은 트윗을 보았습니다. 타임 라인은 가끔 간신히 읽을 수있는 급하게 보낸 트윗으로 가득 차 있습니다.

이와 관련하여 맞춤법 수정은 여러 단어의 사본을 줄이는 데 도움이되기 때문에 유용한 사전 처리 단계입니다. 예를 들어 "Analytics"와 "analytcs"는 같은 의미로 사용 되더라도 다른 단어로 취급됩니다.

이를 위해 textblob 라이브러리를 사용합니다 . 익숙하지 않다면 ' textblob을 사용하는 초보자를위한 NLP'에 대한 이전 기사  확인할 수 있습니다 .

textblob에서 TextBlob 가져 오기 train [ 'tweet'] [: 5] .apply (lambda x : str (TextBlob (x) .correct ()))

이러한 수정을 수행하는 데 실제로 많은 시간이 걸립니다. 따라서 학습 목적으로이 기술을 처음 5 개 행에만 적용하여 보여주었습니다. 또한 항상 정확할 것으로 기대할 수 없으므로 적용하기 전에주의해야합니다.

또한 단어는 축약 형으로 자주 사용된다는 점을 명심해야합니다 . 예를 들어, 'your'는 'ur'로 사용됩니다. 맞춤법 수정 단계 전에이 문제를 처리해야합니다. 그렇지 않으면이 단어가 아래 표시된 것과 같은 다른 단어로 변환 될 수 있습니다.

 

2.7 토큰 화

토큰 화는 텍스트를 일련의 단어 또는 문장으로 나누는 것을 말합니다. 이 예에서는 textblob 라이브러리를 사용하여 먼저 트윗을 blob으로 변환 한 다음 일련의 단어로 변환했습니다.

TextBlob (train [ 'tweet'] [1]). words > WordList ([ 'thanks', 'lyft', 'credit', 'cant', 'use', 'cause', 'dont', 'offer', 'wheelchair', 'vans', 'pdx', 'disisapointed ','getthanked '])

 

2.8 어간

형태소 분석은 단순한 규칙 기반 접근 방식을 통해 "ing", "ly", "s"등과 같은 충분 항목을 제거하는 것을 의미합니다. 이를 위해 NLTK 라이브러리의 PorterStemmer  사용 합니다.

nltk.stem에서 PorterStemmer 가져 오기 st = PorterStemmer () train [ 'tweet'] [: 5] .apply (lambda x : "".join ([st.stem (word) for word in x.split ()]))0 아버지 dysfunct 이기적인 드래그 아이 dysfunct 실행 1 감사합니다 lyft 신용 사용할 수 없기 때문에 제공하지 않습니다 whe ... 2 bihday majesti 3 모델은 urð ðððð ððð 4 가지 사실 안내 사회 동기 이름 : tweet, dtype : object

위의 출력에서  기능 장애  다른 변경 사항 중에서도 기능 장애 로 변환되었습니다 .

 

2.9 기본 화

Lemmatization은 어간 분석보다 더 효과적인 옵션입니다. 그 이유는 단어를 그저 충분한 단어를 제거하는 것보다 뿌리 단어로 변환하기 때문입니다. 어휘를 사용하고 형태 학적 분석을 수행하여 어근을 얻습니다. 따라서 우리는 일반적으로 형태소 분석보다 lemmatization을 사용하는 것을 선호합니다.

textblob에서 Word 가져 오기 train [ 'tweet'] = train [ 'tweet']. apply (lambda x : "".join ([Word (word) .lemmatize () for word in x.split ()]))) train [ 'tweet']. head ()0 아버지 역기능 이기적인 드래그 아이 역기능 ... 1 감사 lyft 신용은 w를 제공하지 않는 원인을 사용할 수 없습니다 ... 2 bihday 폐하 3 모델은 urð ðððð ððð 4 가지 사실 이름 : tweet, dtype : object

 

3. 고급 텍스트 처리

지금까지 데이터를 정리하기 위해 모든 기본 전처리 단계를 완료했습니다. 이제 마침내 NLP 기술을 사용하여 특성 추출로 넘어갈 수 있습니다.

 

3.1 N- 그램

N- 그램은 함께 사용되는 여러 단어의 조합입니다. N = 1 인 Ngram을 유니 그램이라고합니다. 유사하게, 바이그램 (N = 2), 트라이 그램 (N = 3) 등도 사용할 수 있습니다.

유니 그램은 일반적으로 bigram 및 trigram에 비해 많은 정보를 포함하지 않습니다. n-gram의 기본 원칙은 주어진 문자 나 단어가 어떤 문자 나 단어를 따를 것인지와 같은 언어 구조를 포착한다는 것입니다. 더 이상은 n-g (높을  N ), 당신이 일을해야 더 많은 상황. 최적의 길이는 실제로 애플리케이션에 따라 다릅니다. n-gram이 너무 짧으면 중요한 차이점을 포착하지 못할 수 있습니다. 반면에 너무 길면 "일반 지식"을 포착하지 못하고 특정 사례에만 집착 할 수 있습니다.

따라서 textblob 라이브러리  ngrams 기능을 사용하여 트윗에서 bigram을 빠르게 추출해 보겠습니다 .

TextBlob (train [ 'tweet'] [0]). ngrams (2) > [WordList ([ '사용자', '언제']), WordList ([ '언제', 'a']), WordList ([ 'a', 'father']), WordList ([ '아버지', 'is']), WordList ([ 'is', 'dysfunctional']), WordList ([ '기능 장애', 'and']), WordList ([ 'and', 'is']), WordList ([ 'is', 'so']), WordList ([ 'so', 'selfish']), WordList ([ '이기적', '그']), WordList ([ 'he', 'drags']), WordList ([ 'drags', 'his']), WordList ([ 'his', 'kids']), WordList ([ 'kids', 'into']), WordList ([ 'into', 'his']), WordList ([ 'his', 'dysfunction']), WordList ([ '기능 장애', '실행'])]

 

3.2 학기 빈도

용어 빈도는 단순히 문장 길이에 대한 문장에있는 단어 수의 비율입니다.

따라서 용어 빈도를 다음과 같이 일반화 할 수 있습니다.

TF = (특정 행에 용어 T가 나타나는 횟수) / (해당 행의 용어 수)

용어 빈도에 대해 자세히 알아 보려면 이 기사를 참조하십시오.

아래에서는 트윗의 용어 빈도 표를 보여 드리려고합니다.

tf1 = (train [ 'tweet'] [1 : 2]). apply (lambda x : pd.value_counts (x.split ( ""))). sum (axis = 0) .reset_index () tf1.columns = [ '단어', 'tf'] tf1

 문서 에서 용어 빈도에 대해 자세히 알아볼 수 있습니다 .

 

3.3 역 문서 빈도

역 문서 빈도 (IDF) 뒤에있는 직관은 단어가 모든 문서에 나타나는 경우 우리에게 그다지 유용하지 않다는 것입니다.

따라서 각 단어의 IDF는 해당 단어가있는 행 수에 대한 총 행 수의 비율에 대한 로그입니다.

IDF = log (N / n) , 여기서 N은 총 행 수이고 n은 단어가있는 행 수입니다.

따라서 빈도라는 용어를 계산 한 동일한 트윗에 대해 IDF를 계산해 보겠습니다.

i의 경우 enumerate (tf1 [ 'words'])의 단어 : tf1.loc [i, 'idf'] = np.log (train.shape [0] / (len (train [train [ 'tweet']. str.contains (word)]))) tf1

IDF의 가치가 높을수록 단어가 더 독특합니다.

 

3.4 용어 빈도 – 역 문서 빈도 (TF-IDF)

TF-IDF는 위에서 계산 한 TF와 IDF의 곱셈입니다.

tf1 [ 'tfidf'] = tf1 [ 'tf'] * tf1 [ 'idf'] tf1

 

우리는 TF-IDF가 흔히 발생하는 단어이기 때문에 't', 'ca n't', 'use'와 같은 단어에 불이익을주는 것을 볼 수 있습니다. 그러나 트윗의 정서를 결정하는 데 매우 유용 할 것이기 때문에 "실망"에 큰 비중을 두었습니다.

TF-IDF를 얻기 위해 매번 TF와 IDF를 계산 한 다음 곱할 필요가 없습니다. 대신에 sklearn  은 그것을 직접 얻는 별도의 기능을 가지고 있습니다 :

sklearn.feature_extraction.text에서 가져 오기 TfidfVectorizer tfidf = TfidfVectorizer (max_features = 1000, 소문자 = True, 분석기 = 'word', stop_words = 'english', ngram_range = (1,1)) train_vect = tfidf.fit_transform (train [ 'tweet']) train_vect <31962x1000 '<class'numpy.float64 '>'유형의 희소 행렬 압축 스파 스 행 형식의 114033 개의 저장된 요소 포함>

이전에 수행하지 않은 경우 소문자 및 불용어 제거와 같은 기본적인 사전 처리 단계를 수행 할 수도 있습니다.

 

3.5 단어 가방

Bag of Words (BoW)는 텍스트 데이터 내에서 단어의 존재를 설명하는 텍스트 표현을 나타냅니다. 이것의 배후에있는 직관은 두 개의 유사한 텍스트 필드가 유사한 종류의 단어를 포함하므로 유사한 단어 모음을 갖게된다는 것입니다. 또한 텍스트만으로 문서의 의미에 대해 배울 수 있습니다.

구현을 위해 sklearn 은 아래와 같이 별도의 기능을 제공합니다.

sklearn.feature_extraction.text에서 가져 오기 CountVectorizer bow = CountVectorizer (max_features = 1000, 소문자 = True, ngram_range = (1,1), analyzer = "word") train_bow = bow.fit_transform (train [ 'tweet']) train_bow > <31962x1000 '<class'numpy.int64 '>'유형의 희소 행렬 압축 스파 스 행 형식의 128380 개의 저장된 요소 포함>

이에 대해 더 잘 이해하려면이 문서를 참조 하십시오 .

 

3.6 감정 분석

기억 나시면 우리의 문제는 트윗의 감정을 감지하는 것이 었습니다. 따라서 ML / DL 모델 (textblob 라이브러리를 사용하여 감정을 감지하는 별도의 기능을 가질 수 있음)을 적용하기 전에 처음 몇 개의 트윗의 감정을 확인합니다.

train [ 'tweet'] [: 5] .apply (lambda x : TextBlob (x) .sentiment) 0 (-0.3, 0.5354166666666667) 1 (0.2, 0.2) 2 (0.0, 0.0) 3 (0.0, 0.0) 4 (0.0, 0.0) 이름 : tweet, dtype : object

위에서 각 트윗의 극성과 주관성을 나타내는 튜플을 반환하는 것을 볼 수 있습니다. 여기서는 1에 가까운 값은 긍정적 인 감정을 의미하고 -1에 가까운 값은 부정적인 감정을 의미하므로 감정을 나타내므로 극성 만 추출합니다. 이것은 기계 학습 모델을 구축하기위한 기능으로도 작동 할 수 있습니다.

train [ 'sentiment'] = train [ 'tweet']. apply (lambda x : TextBlob (x) .sentiment [0]) 기차 [[ 'tweet', 'sentiment']]. head ()

 

3.7 단어 임베딩

Word Embedding은 벡터 형태의 텍스트 표현입니다. 여기서 기본 아이디어는 유사한 단어가 벡터 사이에 최소 거리를 가질 것이라는 것입니다.

Word2Vec 모델에는 많은 텍스트가 필요하므로 학습 데이터에서 학습하거나 Google, Wiki 등에서 개발 한 사전 학습 된 단어 벡터를 사용할 수 있습니다.

여기에서는 장갑 웹 사이트 에서 다운로드 할 수있는 사전 훈련 된 단어 벡터를 사용  합니다. 위키 데이터에서 훈련 된 다양한 차원 (50,100, 200, 300) 벡터가 있습니다. 이 예에서는 모델의 100 차원 버전을 다운로드했습니다.

여기 에서 기사를 참조하여 다양한 형태의 단어 임베딩을 이해할 수 있습니다 .

여기서 첫 번째 단계는이를 word2vec 형식 으로 변환하는  입니다.

gensim.scripts.glove2word2vec에서 가져 오기 glove2word2vec glove_input_file = 'glove.6B.100d.txt' word2vec_output_file = 'glove.6B.100d.txt.word2vec' glove2word2vec (장갑 _ 입력 _ 파일, word2vec_ 출력 _ 파일) > (400000, 100)

이제 위의 word2vec 파일을 모델로 로드 할 수 있습니다 .

gensim.models import KeyedVectors # Stanford GloVe 모델로드 파일 이름 = 'glove.6B.100d.txt.word2vec' 모델 = KeyedVectors.load_word2vec_format (filename, binary = False)

트윗에 '저리 가라'라는 텍스트가 포함되어 있다고 가정 해 보겠습니다. 위의 모델을 사용하여 단어 벡터를 쉽게 얻을 수 있습니다.

모델 [ 'go']

모델 [ '어웨이']

그런 다음 평균을 취하여 100 차원을 갖는 벡터의 형태로 'go away'문자열을 나타냅니다.

(모델 [ 'go'] + 모델 [ 'away']) / 2 > 배열 ([-0.091342, 0.22340401, 0.58855999, -0.61476499, -0.0838365, 0.53869998, -0.43531001, 0.349125, 0.16330799, -0.28222999, 0.53547001, 0.52797496, 0.096812, 0.2879, -0.0533385, -0.37232, 0.022637, 0.574705, -0.55327499, 0.385575, 0.56533498, 0.80540502, 0.2579965, 0.0088565, 0.1674905, 0.25543001, -0.57103503, -0.59925997, 0.42258501, -0.42896, -0.389065, 0.19631, -0.00933, 0.127285, -0.0487465, 0.38143501, -0.22540998, 0.021299, -0.1827915, -0.16490501, -0.47944498, -0.431528, -0.20091, -0.55664998, -0.32982001, -0.088548, -0.28038502, 0.219725, 0.090537, -0.67012, 0.0883085, -0.19332001, 0.0465725, 1.160815, 0.0691255, -2.47895002, -0.33706999, 0.083195, 1.86185002, 0.283465, -0.13080999, 0.92779499, -0.37028, 0.18854649, 0.66197997, 0.50517499, 0.37748498, 0.1322995, -0.380375, -0.025135, -0.1636765, -0.45638999, -0.047815, -0.87393999, 0.0264145, 0.0117645, -0.42741501, -0.31048, -0.317725, -0.02326, 0.525635, 0.05760051, -0.69786, -0.1213325, -1.27069998, -0.225355, -0.1018815, 0.18575001, -0.30943, -0.211059, -0.27954501, -0.16002001, 0.100371, -0.05461, -0.71834505, -0.39292499, 0.12075999, 0.61991, 0.58214498, 0.20161], dtype = float32)

전체 문자열을 벡터로 변환하여 이제 모든 모델링 기술에서 기능으로 사용할 수 있습니다.