더 깊은 의미: Python의 주제 모델링
게시 됨: 2022-03-11컴퓨터와 컴퓨터를 구동하는 프로세서는 숫자와 함께 작동하도록 제작되었습니다. 대조적으로, 이메일과 소셜 미디어 게시물의 일상적인 언어는 계산에 적합하지 않은 느슨한 구조를 가지고 있습니다.
자연어 처리(NLP)가 필요한 이유입니다. NLP는 자연어와 음성을 분석하기 위해 계산 기술(즉, 인공 지능)을 적용하여 언어학과 겹치는 컴퓨터 과학의 한 분야입니다. 주제 모델링은 주어진 텍스트가 어떤 주제에 관한 것인지 이해하는 데 중점을 둡니다. 주제 모델링을 통해 개발자는 소셜 미디어에서 속보 감지, 개인화된 메시지 추천, 가짜 사용자 감지, 정보 흐름 특성화와 같은 유용한 기능을 구현할 수 있습니다.
개발자는 계산 중심의 컴퓨터가 이러한 수준의 정교함에서 인간의 커뮤니케이션을 이해하도록 유도할 수 있습니까?
단어 가방
이 질문에 답하려면 텍스트를 수학적으로 설명할 수 있어야 합니다. 가장 간단한 방법인 bag of words로 주제 모델링 Python 자습서를 시작할 것입니다.
이 메서드는 텍스트를 단어 집합으로 나타냅니다. 예를 들어, This is an example 문장은 해당 단어가 나타나는 빈도를 사용하여 단어 집합으로 설명할 수 있습니다.
{"an": 1, "example": 1, "is": 1, "this": 1}이 방법이 어순을 무시하는 방법에 유의하십시오. 다음 예를 들어보세요.
- "스타워즈는 좋아하지만 해리 포터는 좋아하지 않아."
- "해리포터는 좋아하지만 스타워즈는 좋아하지 않아."
이러한 감정은 같은 단어로 표현되지만 반대의 의미를 갖습니다. 그러나 텍스트의 주제를 분석할 목적으로 이러한 차이점은 중요하지 않습니다. 두 경우 모두, 우리는 해리 포터와 스타워즈의 취향에 관계없이 그 취향에 대해 이야기하고 있습니다. 따라서 어순은 중요하지 않습니다.
여러 텍스트가 있고 그 차이점을 이해하려고 할 때 각 텍스트를 개별적으로 고려하는 전체 말뭉치에 대한 수학적 표현이 필요합니다. 이를 위해 각 열이 단어 또는 용어를 나타내고 각 행이 텍스트를 나타내는 행렬을 사용할 수 있습니다. 말뭉치의 가능한 표현은 주어진 단어(열)가 특정 텍스트(행)에서 사용되는 빈도를 각 셀에 기록하는 것으로 구성됩니다.
이 예에서 말뭉치는 두 개의 문장(행렬 행)으로 구성됩니다.
["I like Harry Potter", "I like Star Wars"]우리는 이 말뭉치에 있는 단어들을 마주치는 순서대로 나열합니다: I , like , Harry , Potter , Star , Wars . 이는 매트릭스 열에 해당합니다.
행렬의 값은 각 구에서 주어진 단어가 사용된 횟수를 나타냅니다.
[[1,1,1,1,0,0], [1,1,0,0,1,1]] 행렬의 크기는 텍스트 수에 하나 이상의 텍스트에 나타나는 다른 단어의 수를 곱하여 결정됩니다. 후자는 일반적으로 불필요하게 크며 줄일 수 있습니다. 예를 들어, 행렬에는 의미가 유사함에도 불구하고 "play" 및 "played"와 같은 활용 동사에 대한 두 개의 열이 포함될 수 있습니다.
그러나 새로운 개념을 설명하는 열이 누락될 수 있습니다. 예를 들어, '클래식'과 '음악'은 각각 고유한 의미를 갖지만 '클래식 음악'이 결합되면 다른 의미를 갖습니다.
이러한 문제로 인해 좋은 결과를 얻으려면 텍스트를 전처리해야 합니다.
전처리 및 주제 클러스터링 모델
최상의 결과를 얻으려면 여러 전처리 기술을 사용해야 합니다. 다음은 가장 자주 사용되는 몇 가지입니다.
- 소문자. 모든 단어를 소문자로 만드십시오. 모든 단어를 소문자로 만드십시오. 단어의 의미는 문장에서 위치에 관계없이 변하지 않습니다.
- n- 그램. 연속으로 n개의 단어로 구성된 모든 그룹을 n -grams 라고 하는 새로운 용어로 간주합니다. 이런 식으로 "백악관"과 같은 경우가 고려되어 어휘 목록에 추가됩니다.
- 스테밍. 단어의 접두사와 접미사를 식별하여 어근에서 분리합니다. 이런 식으로 "play", "played" 또는 "player"와 같은 단어는 "play"라는 단어로 표시됩니다. 형태소 분석은 의미를 유지하면서 어휘 목록의 단어 수를 줄이는 데 유용할 수 있지만 말뭉치의 각 단어에 적용해야 하기 때문에 전처리 속도가 상당히 느려집니다.
- 단어를 중지합니다. 의미나 유용성이 부족한 단어 그룹을 고려하지 마십시오. 여기에는 관사와 전치사가 포함되지만 특정 일반적인 동사와 같이 특정 사례 연구에 유용하지 않은 단어도 포함될 수 있습니다.
- 용어 빈도-역 문서 빈도(tf-idf). 행렬의 각 셀 내에서 각 단어의 빈도를 표시하는 대신 tf–idf 계수를 사용합니다. 곱한 두 개의 숫자로 구성됩니다.
- tf - 텍스트에서 주어진 용어 또는 단어의 빈도,
- idf - 주어진 용어를 포함하는 문서의 수로 나눈 총 문서 수의 로그.
tf–idf는 말뭉치에서 단어가 얼마나 자주 사용되는지 측정합니다. 단어를 그룹으로 세분화할 수 있으려면 각 텍스트에 어떤 단어가 나타나는지 뿐만 아니라 한 텍스트에는 자주 나타나지만 다른 텍스트에는 전혀 나타나지 않는 단어를 이해하는 것이 중요합니다.
다음 그림은 적절하고 관리 가능한 단어 목록을 생성하기 위해 말뭉치의 원본 텍스트가 수정되는 이러한 전처리 기술의 몇 가지 간단한 예를 보여줍니다.
이제 Python에서 이러한 기술 중 일부를 적용하는 방법을 보여줍니다. 말뭉치를 수학적으로 나타내면 감독되지 않은 기계 학습 알고리즘을 적용하여 논의 중인 주제를 식별해야 합니다. 이 경우 "비지도"는 알고리즘에 "SF"와 같이 출력에 적용할 사전 정의된 주제 레이블이 없음을 의미합니다.
말뭉치를 클러스터링하기 위해 비음수 행렬 분해(NMF), 희소 주성분 분석(희소 PCA) 및 잠재 디리클레 할당(LDA)을 포함한 여러 알고리즘 중에서 선택할 수 있습니다. LDA는 소셜 미디어, 의료 과학, 정치 과학 및 소프트웨어 엔지니어링 분야에서 좋은 결과를 얻을 수 있기 때문에 과학 커뮤니티에서 널리 사용되기 때문에 LDA에 중점을 둘 것입니다.

LDA는 감독되지 않은 주제 분해를 위한 모델입니다. 포함된 단어와 특정 주제에 속하는 단어의 확률을 기반으로 텍스트를 그룹화합니다. LDA 알고리즘은 토픽 단어 분포를 출력합니다. 이 정보를 사용하여 가장 관련성이 높은 단어를 기반으로 주요 주제를 정의할 수 있습니다. 주요 주제와 관련 단어를 식별하면 각 텍스트에 어떤 주제가 적용되는지 알 수 있습니다.
5개의 짧은 문장으로 구성된 다음 말뭉치를 고려하십시오(모두 New York Times 헤드라인에서 가져옴).
corpus = [ "Rafael Nadal Joins Roger Federer in Missing US Open", "Rafael Nadal Is Out of the Australian Open", "Biden Announces Virus Measures", "Biden's Virus Plans Meet Reality", "Where Biden's Virus Plan Stands"]알고리즘은 정치 및 코로나바이러스와 관련된 하나의 주제와 나달 및 테니스와 관련된 두 번째 주제를 명확하게 식별해야 합니다.
파이썬에서 전략 적용하기
주제를 감지하려면 필요한 라이브러리를 가져와야 합니다. Python에는 NLTK 및 Scikit-learn(sklearn)을 포함하여 NLP 및 기계 학습을 위한 몇 가지 유용한 라이브러리가 있습니다.
from sklearn.feature_extraction.text import CountVectorizer from sklearn.feature_extraction.text import TfidfTransformer from sklearn.decomposition import LatentDirichletAllocation as LDA from nltk.corpus import stopwords CountVectorizer() 를 사용하여 CountVectorizer CountVectorizer() ) 를 사용하여 각 텍스트의 단어 빈도를 나타내는 행렬을 생성합니다. CountVectorizer는 중지 단어를 포함하는 stop_words, n stop_words 을 포함하는 ngram_range 또는 모든 문자를 소문자로 변환하는 lowercase=True 와 같은 매개변수를 포함하는 경우 전처리를 허용합니다.
count_vect = CountVectorizer(stop_words=stopwords.words('english'), lowercase=True) x_counts = count_vect.fit_transform(corpus) x_counts.todense() matrix([[0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0], [1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1], [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1]], dtype=int64) 말뭉치의 어휘를 정의하려면 .get_feature_names() 속성을 사용하면 됩니다.
count_vect.get_feature_names() ['announces', 'australian', 'biden', 'federer', 'joins', 'measures', 'meet', 'missing', 'nadal', 'open', 'plan', 'plans', 'rafael', 'reality', 'roger', 'stands', 'virus']그런 다음 sklearn 함수를 사용하여 tf–idf 계산을 수행합니다.
tfidf_transformer = TfidfTransformer() x_tfidf = tfidf_transformer.fit_transform(x_counts)LDA 분해를 수행하려면 토픽의 수를 정의해야 합니다. 이 간단한 경우에 우리는 두 가지 주제 또는 "차원"이 있다는 것을 알고 있습니다. 그러나 일반적으로 이것은 임의 검색 또는 그리드 검색과 같은 알고리즘을 사용하여 수행할 수 있는 약간의 조정이 필요한 하이퍼파라미터입니다.
dimension = 2 lda = LDA(n_components = dimension) lda_array = lda.fit_transform(x_tfidf) lda_array array([[0.8516198 , 0.1483802 ], [0.82359501, 0.17640499], [0.18072751, 0.81927249], [0.1695452 , 0.8304548 ], [0.18072805, 0.81927195]])LDA는 확률적 방법입니다. 여기서 우리는 두 주제 각각에 속하는 5개의 헤드라인 각각의 확률을 볼 수 있습니다. 예상대로 처음 두 개의 텍스트는 첫 번째 주제에, 다음 세 개는 두 번째 주제에 속할 확률이 더 높음을 알 수 있습니다.
마지막으로, 이 두 주제가 무엇에 관한 것인지 이해하고 싶다면 각 주제에서 가장 중요한 단어를 볼 수 있습니다.
components = [lda.components_[i] for i in range(len(lda.components_))] features = count_vect.get_feature_names() important_words = [sorted(features, key = lambda x: components[j][features.index(x)], reverse = True)[:3] for j in range(len(components))] important_words [['open', 'nadal', 'rafael'], ['virus', 'biden', 'measures']]예상대로 LDA는 첫 번째 주제에 테니스 토너먼트와 관련된 단어, Nadal과 관련된 단어를 두 번째 주제에 Biden 및 바이러스와 관련된 단어를 올바르게 할당했습니다.
대규모 분석 및 실제 사용 사례
이 백서에서는 주제 모델링에 대한 대규모 분석을 볼 수 있습니다. 2016년 미국 대통령 선거의 주요 뉴스 주제를 연구하고 뉴욕 타임즈 와 폭스 뉴스와 같은 일부 대중 매체가 보도에 포함된 부패 및 이민과 같은 주제를 관찰했습니다. 본 논문에서도 매스미디어 콘텐츠와 선거 결과의 상관관계와 인과관계를 분석하였다.
주제 모델링은 또한 방대한 텍스트 컬렉션에 존재하는 숨겨진 주제 패턴을 발견하기 위해 학계 외부에서 널리 사용됩니다. 예를 들어 추천 시스템에서 사용하거나 설문조사, 피드백 양식 또는 소셜 미디어에서 고객/사용자가 말하는 내용을 결정할 수 있습니다.
Toptal 엔지니어링 블로그는 이 기사에 제공된 코드 샘플을 검토한 Juan Manuel Ortiz de Zarate에게 감사를 표합니다.
주제 모델링에 대한 권장 읽기
Twitter의 향상된 주제 모델링
알바니아인, 페데리코, 에스테반 포이어슈타인. "커뮤니티 풀링을 통해 Twitter의 향상된 주제 모델링." (2021년 12월 20일): arXiv:2201.00690 [cs.IR]
공중 보건을 위한 트위터 분석
폴, 마이클 및 마크 Dredze. "당신은 당신이 트윗하는 것입니다: 공중 보건을 위한 트위터 분석." 2021년 8월 3일.
트위터에서 정치적 성향 분류하기
코헨, 라비브, 데릭 루스. “트위터에서 정치적 성향을 분류하는 것은 쉽지 않습니다!” 2021년 8월 3일.
관계형 주제 모델을 사용하여 결합 캡처
Gethers, Malcolm 및 Denis Poshyvanyk. "객체 지향 소프트웨어 시스템에서 클래스 간의 결합을 캡처하기 위해 관계형 주제 모델 사용." 2010년 10월 25일.
