해싱 벡터 라이저와 tfidf 벡터 라이저의 차이점은 무엇입니까?


11

텍스트 문서 모음을 각 문서의 단어 벡터로 변환하고 있습니다. 내가 사용이 시도했습니다 TfidfVectorizerHashingVectorizer을

나는 a 처럼 점수 HashingVectorizer를 고려하지 않는다는 것을 이해합니다 . 내가 아직도 일하고있는 이유 는 herehere 설명 된 것처럼 거대한 데이터 세트를 처리하는 동안 제공하는 유연성 때문 입니다. (내 원래 데이터 세트에는 3 천만 개의 문서가 있습니다)IDFTfidfVectorizerHashingVectorizer

현재 45339 개의 문서 샘플을 사용하고 있으므로 작업 할 TfidfVectorizer수도 있습니다. 동일한 45339 문서에서이 두 벡터 라이저를 사용하면 얻을 수있는 행렬이 다릅니다.

hashing = HashingVectorizer()
with LSM('corpus.db')) as corpus:
    hashing_matrix = hashing.fit_transform(corpus)
print(hashing_matrix.shape) 

해싱 행렬 모양 (45339, 1048576)

tfidf = TfidfVectorizer()
with LSM('corpus.db')) as corpus:
    tfidf_matrix = tfidf.fit_transform(corpus)
print(tfidf_matrix.shape) 

tfidf 행렬 모양 (45339, 663307)

a HashingVectorizer와 a 의 차이점 과 TfidfVectorizer이러한 행렬의 크기가 다른 이유, 특히 단어 / 용어 수에 대해 더 잘 이해하고 싶습니다 .


데이터 세트를 나와 공유해 주시겠습니까? (삭제 답변)
nKarza

답변:


7

가장 큰 차이점은 HashingVectorizer해시 함수를 각 문서의 용어 빈도 수에 적용하는 것 TfidfVectorizer입니다. 여기에 좋은 요약이 있습니다 : https://spark.apache.org/docs/latest/mllib-feature-extraction.html

  • 해시 함수는 용어를 피쳐에 매핑하는 효율적인 방법입니다. 반드시 용어 빈도에만 적용 할 필요는 없지만 HashingVectorizer여기서 사용되는 방식 입니다. 45339 문서와 함께 기능 벡터의 길이는 1048576 인 것으로 생각됩니다. 기본 벡터는 2 ^ 20입니다 n_features. 이 기능을 줄이고 처리 비용을 줄일 수는 있지만 충돌 위험이 증가하면 함수가 다른 용어를 동일한 기능에 매핑합니다. http://preshing.com/20110504/hash-collision-probabilities/

  • 단어 벡터의 사용 사례에 따라, 충돌 / 충돌로 인한 정확도 / 효과의 손실을 허용하여 해시 특징 벡터의 길이 (따라서 복잡도)를 크게 줄일 수 있습니다. Scikit-learn에는 예를 들어 도움이 될 수있는 해싱 매개 변수가 있습니다 alternate_sign.

  • 해싱 행렬이 사전보다 넓은 경우 해시 행렬의 많은 열 항목은 주어진 문서에 특정 용어가 포함되어 있지 않기 때문에 전체에 걸쳐 비어 있기 때문에 비어 있음을 의미합니다. 매트릭스. 그렇지 않은 경우 동일한 기능 해시에 여러 용어를 보낼 수 있습니다. 이것이 우리가 이야기 한 '충돌'입니다. en.wikipedia.org/wiki/Feature_hashing#Properties에 설명되어있는 기본적으로 켜져있는 HashingVectorizer이것을 완화시키는 설정이 alternate_sign있습니다.

  • '용어 빈도-역 문서 빈도'는 각 문서에서 용어 빈도를 가져와 전체 코퍼스에서 더 자주 나타나는 단어에 불이익을 주어 가중치를 부여합니다. 직관은 상황에 따라 발견되는 용어가 특정 문서 주제를 대표 할 가능성이 높다는 것입니다. 이것은 역 문서 빈도를 계산하기 위해 말뭉치에 단어의 전체 사전이 필요하다는 점에서 해싱 함수와 다릅니다. 나는 당신의 tf.idf 행렬 크기가 코퍼스에서 663307 단어로 45339 문서라고 생각합니다. Manning et al은 https://nlp.stanford.edu/IR-book/html/htmledition/term-frequency-and-weighting-1.html 계산에 대한 자세한 내용과 예를 제공합니다.

Leskovec et al의 'Mining of Massive Datasets'는 기능 해싱과 tf.idf에 대해 많은 세부 사항을 가지고 있으며 저자는 여기에서 pdf를 사용할 수 있습니다. http://www.mmds.org/


1
tfidf vectorizeridf 계산을 위해 단어의 전체 사전 이 필요한 경우 tfidf 행렬의 항이 해싱 행렬의 항보다 많지 않아야합니까?
Minu

2
해싱 행렬이 사전보다 넓은 경우 해시 행렬의 많은 열 항목은 주어진 문서에 특정 용어가 포함되어 있지 않기 때문에 전체에 걸쳐 비어 있기 때문에 비어 있음을 의미합니다. 매트릭스. 주제를 약간 벗어 났지만 벡터화하기 전에 문서의 단어를 처리하고 있습니까? 스톱 워드, 형태소 등?
redhqs

예, 처리 중입니다. spacy를 사용하고 있습니다.
Minu

1
확인 : 따라서 n_features를 언급하지 않으면 1048576이 해싱 행렬의 기본 길이입니까? 모음에 실제로 663307 단어 만있는 경우 나머지 385269 기능은 비어 있습니다. 모든 빈 기능 없이이 해싱 매트릭스를 편안하게 만들 수 있습니까?
Minu

1
n_features=1048576맞습니다-640k, 320k를 시도하고 정확도에 많은 영향을 미치는지 확인하는 경우 매개 변수를 변경하여 기능 수의 크기를 조정할 수 있습니다. 최소한 훈련 시간을 단축시켜야합니다. @Nathan의 답변을 참조하십시오 n_features=5!
redhqs

5

HashingVectorizer매개 변수가 n_features있습니다 1048576기본적으로합니다. 해싱 할 때 실제로는 각각에 사용할 고유 인덱스에 대한 사전 매핑 용어를 계산하지 않습니다. 대신 각 용어를 해시하고 너무 많은 충돌이 예상되지 않을만큼 충분히 큰 크기를 사용하십시오 hash(term) mod table_size. 을 설정하여 반환 된 행렬을 원하는 크기로 만들 수 있습니다 n_features. 기본값이 합리적이라고 생각하지 않을 경우이를 코퍼스에 적합한 야구장에 배치하도록 조정해야합니다.

from sklearn.feature_extraction.text import HashingVectorizer
vectorizer = HashingVectorizer()
print(vectorizer.transform(['a very small document']).shape)
(1, 1048576)

small_vectorizer = HashingVectorizer(n_features=5)
print(small_vectorizer.transform(['a very small document']).shape)    
(1, 5)

0

HashingVectorizer와 CountVectorizer (Tfidfvectorizer가 아님)는 동일한 작업을 수행합니다. 텍스트 문서 모음을 토큰 발생 매트릭스로 변환하는 것입니다.

상대 중요도 (IDF)로 가중치를 부여하는 용어를 찾으려면 Tfidfvectorizer를 사용해야합니다. 원시 카운트 또는 정규화 된 카운트 (용어 빈도)가 필요한 경우 CountVectorizer 또는 HashingVectorizer를 사용해야합니다.

HashingVectorizer에 대한 자세한 내용을 보려면에이 문서를 참조 HashingVectorizer 대 CountVectorizer을 .

Tfidfvectorizer에 대한 자세한 내용은 Tfidftransformer 및 Tfidfvectorizer 사용 방법 에 대한이 문서를 참조하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.