อะไรคือความแตกต่างระหว่าง vectorizer hashing และ Vectorizer tfidf


11

ฉันกำลังแปลงคลังข้อความเอกสารเป็นคำเวกเตอร์สำหรับแต่ละเอกสาร ฉันได้ลองแล้วโดยใช้TfidfVectorizerและHashingVectorizer

ผมเข้าใจว่าHashingVectorizerไม่คำนึงถึงIDFคะแนนเหมือนTfidfVectorizerไม่ เหตุผลที่ฉันยังคงทำงานร่วมกับผู้HashingVectorizerที่มีความยืดหยุ่นจะช่วยให้ขณะที่การจัดการกับชุดข้อมูลขนาดใหญ่ตามที่อธิบายไว้ที่นี่และที่นี่ (ชุดข้อมูลดั้งเดิมของฉันมีเอกสาร 30 ล้านฉบับ)

ขณะนี้ฉันทำงานกับกลุ่มตัวอย่าง 45,339 เอกสารดังนั้นผมมีความสามารถในการทำงานด้วยTfidfVectorizerนอกจากนี้ยังมี เมื่อฉันใช้ vectorizers สองตัวนี้บนเอกสาร 45339 เดียวกันเมทริกซ์ที่ฉันได้รับนั้นแตกต่างกัน

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

hashing เมทริกซ์รูปร่าง (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ใช้ฟังก์ชัน hashing กับการนับความถี่ของคำในเอกสารแต่ละฉบับโดยที่จะทำการTfidfVectorizerปรับความถี่ของคำที่นับในแต่ละเอกสารโดยการลงโทษเงื่อนไขที่ปรากฏอย่างกว้างขวางทั่วทั้งคลังข้อมูล มีการสรุปยอดเยี่ยมที่นี่: https://spark.apache.org/docs/latest/mllib-feature-extraction.html

  • ฟังก์ชันแฮชเป็นวิธีที่มีประสิทธิภาพในการจับคู่คำกับคุณลักษณะ ไม่จำเป็นต้องนำไปใช้กับความถี่ของคำเท่านั้น แต่เป็นวิธีที่HashingVectorizerใช้ในที่นี้ พร้อมกับเอกสาร 45339 ผมสงสัยเวกเตอร์คุณลักษณะของความยาว 1,048,576 เพราะมันเป็นค่าเริ่มต้น 2 ^ 20 n_features; คุณสามารถลดสิ่งนี้และทำให้ราคาถูกลงในการประมวลผล แต่ด้วยความเสี่ยงที่เพิ่มขึ้นของการชนซึ่งฟังก์ชันจะจับคู่คำศัพท์ที่แตกต่างกับคุณสมบัติเดียวกัน: http://preshing.com/20110504/hash-collision-probabilities/

  • ขึ้นอยู่กับกรณีการใช้งานของคำว่าเวกเตอร์อาจเป็นไปได้ที่จะลดความยาวของเวกเตอร์คุณสมบัติแฮช (และทำให้ซับซ้อน) อย่างมีนัยสำคัญโดยมีการสูญเสียที่ยอมรับได้ต่อความถูกต้อง / ประสิทธิผล (เนื่องจากการชนที่เพิ่มขึ้น) Scikit alternate_signเรียนรู้มีพารามิเตอร์คร่ำเครียดบางอย่างที่สามารถช่วยยกตัวอย่างเช่น

  • หากเมทริก hashing นั้นกว้างกว่าพจนานุกรมก็จะหมายความว่ารายการคอลัมน์จำนวนมากในเมทริกซ์การแฮชจะว่างเปล่าและไม่ใช่เพียงเพราะเอกสารที่กำหนดไม่มีคำเฉพาะ แต่เพราะมันว่างเปล่าทั่วทั้ง มดลูก หากไม่เป็นเช่นนั้นอาจส่งคำหลายคำไปยังแฮชของคุณสมบัติเดียวกัน - นี่คือ 'การชนกัน' ที่เราพูดถึง HashingVectorizerมีการตั้งค่าที่ทำงานเพื่อลดการเรียกสิ่งนี้alternate_signที่เป็นค่าเริ่มต้นตามที่อธิบายไว้ที่นี่: en.wikipedia.org/wiki/Feature_hashing#Properties

  • 'Term frequency - Inverse document frequency' ใช้ความถี่เทอมในแต่ละเอกสารและทำให้น้ำหนักพวกเขาโดยการลงโทษคำที่ปรากฏบ่อยขึ้นทั่วทั้งคลังข้อมูล ปรีชาคือเงื่อนไขที่พบในสถานการณ์มีแนวโน้มที่จะเป็นตัวแทนของหัวข้อเฉพาะของเอกสาร สิ่งนี้แตกต่างจากฟังก์ชั่นการแปลงแป้นพิมพ์เนื่องจากจำเป็นต้องมีพจนานุกรมคำศัพท์เต็มรูปแบบในคลังข้อมูลเพื่อคำนวณความถี่ของเอกสารผกผัน ฉันคาดหวังว่ามิติข้อมูลเมทริกซ์ tf.idf ของคุณคือเอกสาร 45339 ฉบับด้วย 663307 คำในคลังข้อมูล Manning et al ให้รายละเอียดเพิ่มเติมและตัวอย่างของการคำนวณ: https://nlp.stanford.edu/IR-book/html/htmledition/term-frequency-and-weighting-1.html

'การขุดชุดข้อมูลขนาดใหญ่' โดย Leskovec et al มีรายละเอียดมากมายเกี่ยวกับการแฮ็กฟีเจอร์และ tf.idf ผู้เขียนจัดทำไฟล์ PDF ที่นี่: http://www.mmds.org/


1
หากtfidf vectorizerต้องการพจนานุกรมคำศัพท์สำหรับการคำนวณ idf แบบเต็มคำศัพท์ในเมทริกซ์ tfidf ไม่ควรเป็นมากกว่าคำศัพท์ใน hashing matrix
Minu

2
หากเมทริก hashing นั้นกว้างกว่าพจนานุกรมก็จะหมายความว่ารายการคอลัมน์จำนวนมากในเมทริกซ์การแฮชจะว่างเปล่าและไม่ใช่เพียงเพราะเอกสารที่กำหนดไม่มีคำเฉพาะ แต่เพราะมันว่างเปล่าทั่วทั้ง มดลูก ปิดหัวข้อเล็กน้อย แต่คุณกำลังประมวลผลคำในเอกสารของคุณก่อนที่จะเพิ่มเวกเตอร์หรือไม่ Stopwords, กั้น, ฯลฯ ?
redhqs

ใช่ฉันกำลังดำเนินการอยู่ ฉันกำลังใช้ spacy
Minu

1
การยืนยัน: ดังนั้น 1048576 คือความยาวเริ่มต้นของเมทริกซ์การแฮชใด ๆ หากไม่ได้กล่าวถึง n_features หากมีเพียง 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คุณสามารถทำให้เมทริกซ์กลับมามีขนาดที่คุณต้องการโดยการตั้งค่า คุณควรปรับให้อยู่ใน ballpark ที่เหมาะสมสำหรับคลังข้อมูลของคุณหากคุณไม่คิดว่าการตั้งค่าเริ่มต้นนั้นสมเหตุสมผล (หากมีขนาดใหญ่กว่าจะทำให้เกิดการชนน้อยลง

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 (ไม่ใช่ not Tfidfvectorizer) มีไว้เพื่อทำสิ่งเดียวกัน ซึ่งจะทำการแปลงชุดของเอกสารข้อความเป็นเมทริกซ์ของโทเค็นที่เกิดขึ้น

หากคุณกำลังมองหาความถี่ของคำศัพท์ที่ถ่วงน้ำหนักโดยความสำคัญเชิงสัมพัทธ์ (IDF) ของคุณ Tfidfvectorizer คือสิ่งที่คุณควรใช้ หากคุณต้องการจำนวนดิบหรือจำนวนปกติ (ความถี่คำ) จากนั้นคุณควรใช้ CountVectorizer หรือ HashingVectorizer

เรียนรู้เกี่ยวกับ HashingVectorizer ดูบทความนี้ในHashingVectorizer กับ CountVectorizer

สำหรับข้อมูลเพิ่มเติมเกี่ยว Tfidfvectorizer ดูบทความเกี่ยวกับวิธีการใช้ Tfidftransformer และ Tfidfvectorizer

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.