Hashing векторизаторы мен tfidf векторизаторы арасындағы айырмашылық қандай?

I'm converting a corpus of text documents into word vectors for each document. I've tried this using a TfidfVectorizer and a HashingVectorizer

HashingVectorizer TfidfVectorizer секілді IDF баллдарын ескермейтінін түсінемін. HashingVectorizer -мен жұмыс істеуімнің себебі үлкен деректер жиынтығымен жұмыс істегенде беретін икемділік, себебі түсіндірілгендей, here-the-difference-туралы және here . (Менің бастапқы деректер жиынтығым 30 миллион құжатты құрайды)

Қазіргі уақытта мен 45339 құжат үлгісімен жұмыс істеймін, сондықтан TfidfVectorizer -мен жұмыс істеу мүмкіндігі бар. Мен осы екі векторизаторды сол 45339 құжатты қолданған кезде, мен алатын матрицалар өзгеше.

  hashing = HashingVectorizer ()
LSM ('corpus.db')) сияқты корпус:
    hashing_matrix = hashing.fit_transform (корпус)
басып шығару (hashing_matrix.shape)
 
     

матрицаның нысаны (45339, 1048576)

  tfidf = TfidfVectorizer ()
LSM ('corpus.db')) сияқты корпус:
    tfidf_matrix = tfidf.fit_transform (корпус)
басып шығару (tfidf_matrix.shape)
 
     

tfidf матрицалық пішіні (45339, 663307)

Мен HashingVectorizer және TfidfVectorizer арасындағы айырмашылықты жақсы түсінгіңіз келеді және бұл матрицалардың әртүрлі өлшемдерде, әсіресе сөздер/терминдер санындағы себептері.

8
Деректер жиынтығын менімен бөлісіңіз ме? (жойылатын жауап)
қосылды автор Wallace Richardson, көзі

2 жауаптар

HashingVectorizer параметрі әдепкіде 1048576 деген n_features параметріне ие. Хеширлеу кезінде, олар сөздікті салыстыру шарттарын әрқайсысы үшін пайдалануға болатын бірегей индекске есептемейді. Оның орнына, әр терминді тек қана хэстеп, тым көп соқтығысу күтілмейтін үлкен өлшемді пайдаланыңыз: hash (term) mode 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)
4
қосылды

Негізгі айырмашылық: HashingVectorizer әр құжатта мерзімді жиіліктер санына хэшинг функциясын қолданады, мұнда TfidfVectorizer әр құжатта жиіліктік есептеулерді сол терминді кеңейтеді, корпус. Мұнда үлкен қорытынды бар: https://spark.apache.org/ docs/соңғы/mllib-feature-extraction.html

  • Хеш функциялары - ерекшеліктерге терминдерді салыстырудың тиімді әдісі; мұнда тек терминдер жиіліктеріне ғана қолдануға болмайды, бірақ мұнда HashingVectorizer қолданылған. 45339 құжаттармен қатар, функционалдық вектор ұзындығы 1048576 деп күдіктенемін, себебі әдепкі 2 ^ 20 n_features ; сіз оны азайта аласыз және оны өңдеу үшін қымбатырақ бола аласыз, бірақ функция бір ерекшелігі бар әртүрлі терминдерді салыстыру кезінде соқтығысу қаупі жоғары болады: http://preshing.com/20110504/hash-collision-probabilities/

  • Сөз векторлары үшін қолдану жағдайына байланысты, дәлдігі/тиімділігіне (соқтығысудың салдарынан) қолайлы жоғалту арқылы хеш функциясының векторының ұзақтығын (және осылайша күрделілігіне) азайтуға болады. Scikit-learn кейбір хэшинг параметрлеріне ие болады, мысалы, alternate_sign .

  • Егер хэшинг матрицасы сөздіктен гөрі кеңірек болса, онда бұл хэшинг матрицасындағы бағаналардың көпшілігі бос болмақ және тек осы құжатта белгілі бір термин болмағандықтан емес, барлық матрица бойынша босатылады. Егер олай болмаса, ол бірдей ерекшелікті хэшке бірнеше терминді жіберуі мүмкін - бұл біз туралы айтқан «қақтығыстар». HashingVectorizer дегеніміз әдепкіде сипатталған, бұл жерде сипатталған alternate_sign деп аталатын жұмысты азайтуға арналған параметр бар: en.wikipedia.org/wiki/Feature_hashing#Properties

  • «Мерзімді жиілік - кері құжат жиілігі» әр құжатта мерзімді жиіліктерді қабылдайды және оларды бүкіл корпуста жиі кездесетін сөздерді жазалау арқылы салмақтайды. Тұжырымдама, белгілі бір құжаттың тақырыбын өкілдік ету жағдайлары көп жағдайда болуы мүмкін. Бұл хэширлеу функциясынан айырмашылығы, кері қағаздың жиілігін есептеу үшін корпустағы сөздердің толық сөздігіне ие болу керек. Мен сіздің tf.idf матрицасының өлшемдері корпуста 663307 сөзбен 45339 құжатты құрайды деп күтемін; Manning және басқалар егжей-тегжейлі мәліметтерді және есептеулерді мысалдармен қамтамасыз етеді: https://nlp.stanford.edu/IR-book/html/htmledition/term-frequency-and-weighting-1.html

‘Mining of Massive Datasets’ by Leskovec et al has a ton of detail on both feature hashing and tf.idf, the authors made the pdf available here: http://www.mmds.org/

4
қосылды
Егер tfidf векторизаторы сөзді толық сөздікті идентификациялау үшін қажет етсе, tfidf матрицасындағы терминдер хэшинг матрицасындағы терминдерден артық болмауы керек пе?
қосылды автор Pepijn Schmitz, көзі
Ия, мен өңдеймін. Мен спациалды пайдаланамын.
қосылды автор Pepijn Schmitz, көзі
Растау: Осылайша, 1048576 егер n_features аталмаса, кез келген хэшинг матрицасының әдепкі ұзындығы болып табылады? Егер корпуста тек қана 663307 сөз болса, қалған 385269 мүмкіндігі бос. Қаншалықты бос сипаттамаларсыз осы хэширлеу матрицасын қалай қолдана алады?
қосылды автор Pepijn Schmitz, көзі
Егер мен n_features функциясының санын шектейтін болсам, 50000 дейтін болады. Хешинг функциясы ең маңызды 50000 сөзді таңдайды ма? 50000 терминді таңдаудың алгоритмдік механизмі бар ма? Сондай-ақ, HashingVectorizer үшін мүмкіндіктер ретінде 50000 сөз тізімін беруге мүмкіндік беретін ешқандай параметр көрмеймін. Бұл дұрыс?
қосылды автор Pepijn Schmitz, көзі
Сіздің жауапыңызда бірінші жауабыңызды (біреуді көтердім) айтқыңыз келсе, ол менің сұрағымның бір бөлігіне жауап береді және мен оны қабылдай аламын. «Егер хэшинг матрицасы сөздіктен гөрі кеңірек болса, бұл хэшинг матрицасындағы бағаналардағы жазбалардың көпшілігі бос болмайды дегенді білдіреді, себебі бұл құжатта белгілі бір термин болмаса да, олар толық матрица. «
қосылды автор Pepijn Schmitz, көзі
Егер хэшинг матрицасы сөздікке қарағанда кеңірек болса, онда бұл хэшинг матрицасындағы бағандар жазбаларының көпшілігі бос болмайды, тек осы құжатта белгілі бір термин болмағандықтан, бірақ олар бүкіл бос матрица. Аз тақырыпсыз, бірақ сіз векторизациядан бұрын құжаттарыңыздағы сөздерді өңдеуді жүзеге асырасыз ба? Stopwords, stemming және т.б.
қосылды автор redhqs, көзі
Бұл дұрыс - сіз 640к, 320к көріңіз және дәлдігіңізге көп әсер тигізе алатынын көріп тұрсаңыз, n_features = 1048576 параметрін өзгерту арқылы мүмкіндіктер санын өзгертуге болады. Ол сізге кем дегенде оқу уақытын жылдамдатуы керек. Nathan's n_features = 5 үшін жауапты қараңыз!
қосылды автор redhqs, көзі
Маңыздылығы жоқ, бірақ ол бірдей ерекшелікті хэшке бірнеше терминдерді жіберуі мүмкін - бұл біз туралы айтқан «қақтығыстар». hashingvectorizer параметрі әдепкі бойынша мына жерде сипатталған alternate_sign деп аталатын жұмысты азайту үшін қолданылады: en.wikipedia .org/wiki/Feature_hashing # сипаттары
қосылды автор redhqs, көзі
Аяқталды, бұл векторизация жұмыс істейді деп үміттенемін!
қосылды автор redhqs, көзі