자동 키워드 추출 : 코사인 유사성을 기능으로 사용


12

나는 문서 용어 행렬 을 가지고 있으며 이제 감독 학습 방법 (SVM, Naive Bayes, ...)을 사용하여 각 문서의 키워드를 추출하고 싶습니다. 이 모델에서는 이미 Tf-idf, Pos 태그를 사용합니다 ...M

그러나 지금 나는 다음에 대해 궁금합니다. 용어 사이에 코사인 유사성 이있는 행렬 가 있습니다.C

이 유사성을 내 모델의 기능으로 사용할 가능성이 있습니까? 내 생각은 용어에 대한이었다 문서에서 D 문서에있는 모든 용어의 코사인 유사성의 평균을 사용하여, D 용어와 . 이것이 유용한가요?iddi


Google에서 검색 했습니까? 나는 그들이 시작하기 수 있었던 것처럼 보인다 "코사인 유사성 키워드 추출"에서 안타를 많이 발견
shadowtalker

Google에서 많이 검색했으며 "코사인 유사성"및 "키워드 추출"이라는 단어가 포함 된 많은 논문을 읽었습니다. 그러나 키워드를 추출하는 기능으로 코사인 유사성과 같은 것을 사용하는 논문을 찾지 못했습니다
Silke

답변:


11

지도 학습을 통해 키워드 추출을 수행하는 방법을 모르지만 비지도 학습을 통해 키워드 추출을 수행하는 방법을 알고 있습니다.

이를 수행하는 몇 가지 방법이 있으므로 여기에 있습니다.

계층 적

유사성 매트릭스라는 용어에 대해 계층 적 군집화 방법을 직접 적용 할 수 있습니다 (코사인이 아닌 유사성 기능을 사용하여)

scikit-learn에서는 다음과 같은 작업을 수행합니다.

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
from sklearn.cluster import AgglomerativeClustering

vectorizer = TfidfVectorizer(stop_words='english')
X = vectorizer.fit_transform(data)
C = 1 - cosine_similarity(X.T)
ward = AgglomerativeClustering(n_clusters=k, linkage='ward').fit(C)
label = ward.labels_

출처 : [1]

그러나 클러스터링 클러스터링이므로 계산 비용이 많이 들고 계산하는 데 시간이 걸립니다.

K- 평균

또 다른 가능성은 항-문서 행렬의 행에서 일반적인 k- 평균을 수행 한 다음 각 중심에 대해 가장 일반적인 항을 찾는 것입니다.

예를 들어, scikit에서 이것이 수행하는 방법임을 배우십시오.

from sklearn.cluster import KMeans

km = KMeans(n_clusters=k, init='k-means++', max_iter=100, n_init=1)
km.fit(X)
order_centroids = km.cluster_centers_.argsort()[:, ::-1]
terms = vectorizer.get_feature_names()
for i in range(k):
    print("Cluster %d:" % i, end='')
    for ind in order_centroids[i, :10]:
        print(' %s' % terms[ind], end='')

출처 : [2]

그러나 k- 평균은 유클리드 거리에 의존하므로 희소 한 고차원 데이터에는 좋지 않습니다. 텍스트에 더 잘 작동하고 코사인 유사성을 사용하는 다른 기술이 있습니다.

코사인 K- 평균 및 분산 형 / 수집

K- 평균과 함께 코사인을 사용할 수 있습니다 (예 : [3] 참조 ) : 각 군집의 모든 문서에 대한 평균으로 중심을 계산 한 다음 코사인을 사용하여 가장 가까운 중심까지의 거리를 계산하십시오.

결국 일반적인 k- 평균과 같은 방식으로 키워드를 추출 할 수 있습니다.

군집에있는 모든 문서의 평균으로 평균 중심을 계산하는 것이 항상 좋은 것은 아닙니다. Scatter / Gather 알고리즘 [4] 에서 또 다른 접근법이 제안됩니다 : 클러스터의 중심은이 클러스터의 모든 문서를 연결합니다.

이 방법을 사용하려면 각 중심 클러스터에 대해 가장 자주 사용하는 용어 만 있으면됩니다.

scikit learn에는 이러한 알고리즘이 구현되어 있지 않지만을 확장하여 쉽게 알고리즘을 구현할 수 있습니다 KMeans.

두 경우 모두 중심이 상당히 밀집됩니다. 각 군집의 나머지 문서보다 밀도가 높으므로 중심에서 용어 를 자르는 것 , 즉 "중요하지 않은"것을 제거하는 것이 좋습니다. ([8] 참조).

스펙트럼 클러스터링

다른 방법은 스펙트럼 클러스터링을 적용하는 것입니다. 이미 가지고있는 유사성 매트릭스를 제공해야하며 클러스터가 있습니다.

SpectralClustering클래스 에서 구현됩니다 . [5]의 예제를 참조하십시오 . 미리 계산 된 행렬이 이미 있으므로 affinity='precumputed'초기화시 속성 을 사용해야 합니다.

스펙트럼 클러스터링은 Kernel KMeans와 관련이 있습니다. 같은 것이 있다는 논문이 있습니다 ([7] 참조). 나는 최근 유용 할 수있는 커널 KMeans의 구현을 보았습니다 : https://gist.github.com/mblondel/6230787

비음 수 행렬 분해

마지막으로 SVD (소위 "잠재적 의미 분석") 또는 비음 수 행렬 인수 분해와 같은 선형 대수의 일부 분해 기술을 사용하여 용어 문서 행렬을 클러스터링 할 수 있습니다. 후자는 클러스터링으로 볼 수 있으며 매트릭스의 행과 열을 동시에 클러스터링 할 수 있습니다.

예를 들어 다음을 수행하여 키워드를 추출 할 수 있습니다.

from sklearn.decomposition import NMF
nmf = NMF(n_components=k, random_state=1).fit(X)

feature_names = vectorizer.get_feature_names()

for topic_idx, topic in enumerate(nmf.components_):
    print("Topic #%d:" % topic_idx)
    print(" ".join([feature_names[i]
                    for i in topic.argsort()[:-10-1:-1]]))
    print()

코드 소스 : [6]

여기 예제가 파이썬 scikit-learn에 있지만 R에 대한 예제를 찾는 것이 큰 문제는 아닙니다.

출처


이것은 믿을 수 없을 정도로 높은 품질의 답변입니다. 감사! Scikit의 선호도 전파 알고리즘을 사용하여 단어를 군집화하는 것에 대한 생각이 있습니까? 코사인 유사성 값은 알고리즘에서 사전 계산 된 친 화성 행렬로 사용할 수 있습니다 (거리가 아닌 유사성이 필요할 것이라고 생각합니다).
neelshiv
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.