제퍼넷 로고

잠재 의미 분석 및 자연어 처리에서의 사용

시간

이 기사는 데이터 과학 Blogathon

개요

텍스트 분석은 비정형 데이터에 속하는 일반적인 표 데이터(예: 소매 데이터)를 분석하는 것보다 훨씬 더 복잡합니다.

텍스트 데이터는 매우 중요하지만 어휘 및 형태학적 관점에서 상당히 다양합니다. 사람들은 텍스트와 관련하여 자신을 매우 다르게 표현하고 단어 선택은 주제에서 벗어나지 않고 크게 다를 수 있습니다. 예를 들어:

진술 1: 나는 영화의 스토리가 좋았다

진술 2: 영화의 줄거리는 훌륭하고 매우 매력적입니다.

위의 두 문장에서 주제는 동일(또는 오히려 유사)하지만 의미론적 관점에서 두 문장은 동일하지 않습니다. 두 번째 문장은 첫 번째 문장보다 같은 주제를 표현하기 위해 더 많은 단어를 사용합니다. 두 문장이 비슷한 의미를 전달하더라도 표 형식으로 쉽게 표현할 수 없다는 것을 이해하는 것은 매우 쉽습니다. 이것은 많은 문제 중 하나일 뿐입니다. 텍스트 데이터의 또 다른 문제는 다의미입니다. 예를 들어:

진술 3: 강도는 은행을 약탈하려 했지만 실패했습니다.

진술 4: 강도들은 경찰을 피하기 위해 강둑을 따라갔다.

분명히 덩어리 'bank'는 위의 두 문장에서 다른 의미를 가지고 있습니다. 이것은 다원주의 문제입니다. 문맥을 고려하지 않고 단어에만 집중하는 것은 부적절한 추론으로 이어집니다. 같은 방식으로 동의어는 몇 가지 문제를 일으킬 수 있습니다. 실제로 실제 세계에서 텍스트 형식으로 사용할 수 있는 데이터는 매우 시끄럽고 몇 가지 문제를 포함합니다. 이것은 구조화된 표 데이터를 분석하는 것보다 텍스트 분석을 훨씬 더 복잡하게 만듭니다. 이 튜토리얼은 텍스트 데이터를 길들이는 데 사용할 수 있는 많은 방법 중 하나에 초점을 맞추려고 합니다. 이를 LSA(Latent Semantic Analysis)라고 합니다.

잠재 의미 분석(LSA)이란 무엇입니까?

LSA(Latent Semantic Analysis)에는 구조화되지 않은 텍스트 모음에서 구조화된 데이터를 생성하는 작업이 포함됩니다. LSA의 개념에 들어가기 전에 개념에 대해 빠르고 직관적으로 이해합시다. 우리가 텍스트와 같은 것을 쓸 때 단어는 어휘에서 무작위로 선택되지 않습니다.

오히려 우리는 주제(주제)에 대해 생각하고 단어를 선택하여 우리의 생각을 더 의미 있는 방식으로 다른 사람에게 전달할 수 있습니다. 이 주제 또는 주제는 일반적으로 잠재된 차원으로 간주됩니다.

차원을 명시적으로 볼 수 없기 때문에 잠재되어 있습니다. 오히려 본문을 다 보고 나서야 이해가 됩니다. 이는 대부분의 단어가 주제를 표현하기 위해 다른 단어와 의미적으로 연결되어 있음을 의미합니다. 따라서 다양한 빈도의 문서 모음에서 단어가 발생하는 경우 다른 사람들이 다른 단어와 다른 주제 또는 주제를 사용하여 자신을 표현하려고 시도하는 방법을 나타내야 합니다.

즉, 서로 다른 문서의 단어 빈도는 잠재 주제를 추출하는 데 중요한 역할을 합니다. LSA는 Singular Value Decomposition 또는 SVD라는 기계 학습 알고리즘을 사용하여 차원을 추출하려고 합니다.

특이값 분해(SVD)란 무엇입니까?

SVD | 잠재 의미 분석

여기서 A는 문서-용어 행렬(행의 문서(m), 열의 고유 단어(n), 문서와 단어의 교차점에서의 빈도)입니다. LSA에서 원본 문서 용어 행렬은 U, ∑ 및 V와 같은 세 개의 다른 행렬을 곱하여 근사화된다는 점에 유의해야 합니다.T. 여기서 r은 측면 또는 주제의 수입니다. 일단 r(r< 

PCA와 달리 SVD는 분해를 위해 상관 행렬이나 공분산 행렬이 필요하지 않기 때문에 SVD가 이러한 상황에서 사용됩니다. 그런 의미에서 SVD는 데이터의 정규성 가정이 없습니다(공분산 계산은 데이터의 정규 분포를 가정함). U 행렬은 문서-종횡행렬, V는 단어-종횡행렬, ∑는 특이값의 대각행렬입니다. PCA와 유사하게 SVD도 원래 행렬의 열을 결합합니다. 선형으로 U 행렬에 도달합니다. V 행렬에 도달하기 위해 SVD는 원래 행렬의 행을 결합합니다. 선형으로. 따라서 희소 문서 용어 행렬에서 사용 가능한 ML 도구를 사용하여 문서 클러스터링 또는 문서 분류에 사용할 수 있는 조밀한 문서 측면 행렬을 얻을 수 있습니다. 반면에 V 행렬은 단어 임베딩 행렬(즉, 각각의 모든 단어가 r개의 부동 소수점 숫자로 표현됨)이며 이 행렬은 다른 순차적 모델링 작업에서 사용할 수 있습니다. 그러나 이러한 작업의 경우 더 많이 사용되는 Word2Vec 및 Glove 벡터를 사용할 수 있습니다.

잠재 의미 분석을 위한 Python 코드

이 튜토리얼에서는 다음에서 다운로드할 수 있는 BBC 뉴스 데이터를 사용할 것입니다. 여기에서 지금 확인해 보세요.. 이 데이터 세트에는 비즈니스, 엔터테인먼트, 정치, 스포츠 및 기술과 같은 5가지 범주와 관련된 원시 텍스트가 포함되어 있습니다. 우리의 첫 번째 작업은 원시 텍스트 파일에서 데이터를 읽는 것입니다.

!wget http://mlg.ucd.ie/files/datasets/bbc-fulltext.zip !unzip bbc-fulltext.zip import pandas as pd import os, re # 각 파일을 텍스트 파일로 읽고 데이터 프레임 폴더에 넣습니다. = os.listdir('/content/bbc/') 폴더 # OUTPUT: ['비즈니스', '엔터테인먼트', 'README.TXT', '스포츠', '기술', '정치']

출력에서 볼 수 있듯이 버려야 하는 'README.TXT' 파일이 있습니다. 다른 모든 요소는 각각의 폴더입니다. 각 폴더에는 폴더 이름에 나타나는 해당 주제에 대한 원시 텍스트 파일이 있습니다. 다음 코드는 데이터 프레임을 생성합니다.

폴더 = os.listdir('/content/bbc/')folders.remove('README.TXT')
df_dict = {'topic':[], 'news':[]} 폴더 내 폴더: files = os.listdir('/content/bbc/'+folder) 파일 내 파일: path = '/content/bbc /'+폴더+'/'+파일 f = open(경로, 'r', 오류='무시').read() df_dict['주제'].append(폴더) df_dict['뉴스'].append(str (f)) df = pd.DataFrame(df_dict) df.head()
데이터 | 잠재 의미 분석

뉴스 열에는 추가 분석 전에 사전 처리가 필요한 텍스트가 포함되어 있습니다. 전처리에는 다음과 같은 단계가 포함됩니다.

  • 대소문자 변환
  • 특수 문자 및 숫자 제거(있는 경우)

RE 패키지를 사용하면 이 처리를 쉽게 수행할 수 있습니다. 편리한 기능은 사전 처리를 수행할 수 있으며 데이터에 뉴스 제목이 포함되어 있으므로 이 기능은 제목과 개별 텍스트의 실제 뉴스 내용을 모두 반환합니다. 코드는 다음과 같습니다.

def simple_preprocessing(text): header = re.findall("^.+(?=n)", text) # 첫 번째 줄을 제목으로 추출 text = re.sub(heading[0], '', text) # 제거 제목 text = re.sub('n', ' ', text) # 줄 바꿈 문자를 공백 문자로 교체 text = re.sub('[$(.%),;!?]+','', text) # 일반적인 구두점 제거 text = text.strip() # 선행 및 교육 공백 제거 return (heading[0], text) news_and_heading = [simple_preprocessing(txt.lower()) for txt in df['news']]
df_final = pd.concat([df, pd.DataFrame.from_records(news_and_heading, columns=['제목','뉴스'])], 축=1)

잠재 의미 분석(LSA)은 '제목' 또는 '뉴스' 열에서 수행할 수 있습니다. '뉴스' 열에는 더 많은 텍스트가 포함되어 있으므로 이 열을 분석에 사용합니다. LSA는 기본적으로 잘린 SVD이므로 문서 클러스터링, 문서 분류 등과 같은 문서 수준 분석에 LSA를 사용하거나 단어 수준 분석을 위한 단어 벡터를 구축할 수도 있습니다.

잠재 시맨틱 분석을 위한 문서 클러스터링

문서 클러스터링은 문서 간의 유사성을 기반으로 문서를 클러스터링하는 데 여러 면에서 유용합니다. 법률 회사, 의료 기록 분리, 장부 분리 및 다양한 시나리오에서 유용합니다. 클러스터링 알고리즘은 일반적으로 문서 용어 행렬을 생성하는 동안 생성되는 희소 행렬이 아닌 밀집 행렬을 처리하기 위한 것입니다. LSA를 사용하면 클러스터링 목적으로 사용할 수 있는 원본 행렬의 낮은 순위 근사치를 만들 수 있습니다(일부 정보 손실은 있지만!). 다음 코드는 문서 용어 행렬을 만드는 방법과 문서 클러스터링에 LSA를 사용하는 방법을 보여줍니다.

sklearn.feature_extraction.text에서 가져오기 CountVectorizer 가져오기 nltk에서 sklearn.decomposition 가져오기 sklearn.cluster에서 TruncatedSVD 가져오기 sklearn.metrics에서 KMeans 가져오기 sklearn.manifold에서 TSNE 가져오기 sklearn.preprocessing에서 가져오기 LabelEncoder 가져오기 matplotlibwords.plot에서 가져오기 as plt import seaborn as sns from tqdm import tqdm, tqdm_notebook
stopword_list = stopwords.words('english') dtm = CountVectorizer(max_df=0.7, min_df=5, token_pattern="[a-z']+", stop_words=stopword_list, max_features=2000) # 가장 자주 나오는 상위 2000개 단어만 dtm.fit(df_final['뉴스']) dtm_mat = dtm.transform(df_final['뉴스'])으로 간주됩니다.

tsvd = 잘린SVD(n_components=200)

tsvd.fit(dtm_mat)

tsvd_mat = tsvd.transform(dtm_mat)

s_list = []
for clus in tqdm(range(2,21)): km = KMeans(n_clusters=clus, n_init=50, max_iter=1000) # KMeans 클러스터링 인스턴스화 km.fit(tsvd_mat) # KMeans 클러스터링 실행 s = silhouette_score(tsvd_mat, km .labels_) s_list.append(s)
plt.plot(범위(2,21), s_list) plt.show()

다양한 클러스터 수에서 실루엣 점수를 보여주는 선 그림은 다음과 같습니다.

선 플롯 | 잠재 의미 분석

플롯은 실루엣 점수가 상당히 낮다는 것을 분명히 보여줍니다. 따라서 클러스터는 선형으로 분리할 수 없거나 클러스터 간에 상당한 양의 겹침이 있습니다. 이러한 경우에는 TSNE 플롯이 더 적합합니다. TSNE 플롯은 데이터의 로컬 구조를 유지하려는 비선형 임베딩 방법을 통해 고차원 데이터의 저차원 표현을 추출합니다. 코드와 TSNE 플롯이 아래에 나와 있습니다.

tsne = TSNE(n_components=2) tsne_mat = tsne.fit_transform(tsvd_mat)
plt.Figure(figsize=(10,8)) sns.scatterplot(tsne_mat[:,0],tsne_mat[:,1],hue=df_final['주제'])
산점도 | 잠재 의미 분석

이 플롯에서 기술 관련 뉴스 기사만 훨씬 더 넓게 퍼진 것처럼 보이지만 다른 뉴스 기사는 꽤 잘 모여 있는 것처럼 보입니다. 또한 LSA(또는 Truncated SVD)가 다양한 주제에 대한 뉴스 기사를 분리하기 위해 200개의 중요한 차원을 추출하기 위해 텍스트 데이터에 대해 훌륭한 작업을 수행했음을 시사합니다. TSNE는 본질적으로 비결정적이며 다중 실행은 다중 표현을 생성하지만 구조는 동일하지 않더라도 유사하게 유지될 가능성이 더 높다는 것을 이해해야 합니다. 이 LSA는 텍스트 쿼리에도 사용할 수 있습니다. 예를 들면 다음과 같습니다.

쿼리: "마이크로소프트는 컴퓨터 게임에서 어떤 성과를 내고 있습니까?"

이 쿼리는 필요한 문서 벡터를 생성하고 뉴스 기사의 벡터와 비교할 수 있는 LSA 작업이 뒤따를 문서 용어 행렬 생성 파이프라인을 통해 보낼 수 있습니다. 다음 코드는 그 결과를 보여줍니다.

sklearn.metrics에서 pairwise_distances 가져오기 numpy를 np로 가져오기
query = "Microsoft는 컴퓨터 게임에서 어떤 성과를 내고 있습니까?"
query_mat = tsvd.transform(dtm.transform([쿼리]))
dist = pairwise_distances(X=tsvd_mat, Y=query_mat, metric='코사인') df_final['뉴스'][np.argmin(dist.flatten())]

산출: xbox 비디오 게임 halo 2가 9월 15일 미국에서 출시되었으며 이틀 후 영국에서 출시되었습니다. 많은 비디오 게임 전문가들이 Halo를 최고의 인터랙티브 사례 중 하나로 간주하는 이유는 무엇입니까? 지금까지 제작된 엔터테인먼트와 전 세계적으로 XNUMX만 명이 넘는 사람들이 속편을 선주문했습니다. 공상 과학 서사시 후광은 이상한 행성에 불시착한 후 외계인 무리로부터 승무원을 구해야 했던 플레이어가 조종하는 인간 사이보그의 액션을 중심으로 합니다. 거대한 고리의 내부 표면에 담긴 이국적인 세계 우주에서 과거의 기억은 그렇지 않았지만 래리 니븐의 링월드와 영화 스타쉽 트루퍼스와 같은 작품에서 영감을 받은 schlock SF의 한 조각으로 딱 들어맞는 후광이 눈에 띄었습니다. 비슷한 제목의 군중에서 ...(더)

결론

위의 결과는 LSA가 가장 관련성이 높은 문서를 얼마나 정확하게 추출할 수 있는지 보여줍니다. 그러나 앞서 언급한 것처럼 더 흥미로운 결과를 생성할 수 있는 다른 단어 벡터가 있지만 상대적으로 작은 데이터를 처리할 때 LSA 기반 문서 벡터 생성이 상당히 도움이 될 수 있습니다.

이 기사에 표시된 미디어는 Analytics Vidhya의 소유가 아니며 작성자의 재량에 따라 사용됩니다.

PlatoAi. Web3 재창조. 데이터 인텔리전스 증폭.
액세스하려면 여기를 클릭하십시오.

출처: https://www.analyticsvidhya.com/blog/2021/09/latent-semantic-analysis-and-its-uses-in-natural-language-processing/

spot_img

최신 인텔리전스

spot_img

우리와 함께 채팅

안녕하세요! 어떻게 도와 드릴까요?