একটি হ্যাশিং ভেক্টরাইজার এবং একটি টিফিড ভেক্টরাইজারের মধ্যে পার্থক্য কী


11

আমি প্রতিটি নথির জন্য পাঠ্য নথির একটি কর্পাসকে শব্দ ভেক্টরে রূপান্তর করছি। আমি এটি টিফিডভেক্টরাইজার এবং একটি হ্যাশিংভেক্টরাইজার ব্যবহার করে চেষ্টা করেছি

আমি বুঝতে পারি যে একটি করণীয়গুলির মতো স্কোরগুলি HashingVectorizerবিবেচনা করে না। আমি এখানে এবং এখানে যেমন ব্যাখ্যা করেছি তেমনি বিশাল ডেটাসেটগুলির সাথে কাজ করার সময় এটি যে নমনীয়তাটি দেয় তার সাথে আমি এখনও কাজ করছি । (আমার মূল ডেটাসেটের 30 মিলিয়ন ডকুমেন্ট রয়েছে)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)

আমি এ HashingVectorizerএবং এ এর মধ্যে পার্থক্যগুলি আরও ভালভাবে বুঝতে চাই এবং TfidfVectorizerএই ম্যাট্রিকগুলি বিভিন্ন আকারে হওয়ার কারণ - বিশেষত শব্দ / পদগুলির সংখ্যাতে।


আপনি দয়া করে আমার সাথে ডেটাসেট ভাগ করতে পারেন? (অপসারণের প্রতিক্রিয়া)
n কার্জা

উত্তর:


7

মূল পার্থক্যটি হ'ল HashingVectorizerপ্রতিটি দস্তাবেজটিতে টার্ম ফ্রিকোয়েন্সি গণনাগুলির জন্য একটি হ্যাশিং ফাংশন প্রযোজ্য, যেখানে TfidfVectorizerকর্পাস জুড়ে আরও বিস্তৃতভাবে প্রকাশিত শর্তাদি দণ্ডিত করে প্রতিটি নথিতে সেই পরিভাষার ফ্রিকোয়েন্সি গণনাগুলিকে স্কেল করে। এখানে দুর্দান্ত সংক্ষিপ্তসার রয়েছে: https://spark.apache.org/docs/latest/mllib-feature-extration.html

  • হ্যাশ ফাংশন বৈশিষ্ট্যগুলিতে ম্যাপিং শর্তাদির একটি কার্যকর উপায়; এটি কেবলমাত্র টার্ম ফ্রিকোয়েন্সিগুলিতে প্রয়োগ করার প্রয়োজন হয় না তবে HashingVectorizerএখানে এখানে নিযুক্ত রয়েছে। 45339 নথির পাশাপাশি, আমার সন্দেহ হয় যে বৈশিষ্ট্যটির ভেক্টরটির দৈর্ঘ্য 1048576 কারণ এটি ডিফল্ট 2 ^ 20 n_features; আপনি এটি হ্রাস করতে এবং প্রক্রিয়াজাতকরণের জন্য এটি কম ব্যয়বহুল করে তুলতে পারেন তবে সংঘর্ষের বৃদ্ধি ঝুঁকির সাথে, যেখানে ফাংশনটি একই বৈশিষ্ট্যের সাথে বিভিন্ন শর্তাদি মানচিত্র করে: http://preshing.com/20110504/hash-collision-probifications/

  • ভেক্টর শব্দের ব্যবহারের ক্ষেত্রে উপর নির্ভর করে নির্ভুলতা / কার্যকারিতার (গ্রহণযোগ্য সংঘর্ষের কারণে) গ্রহণযোগ্য ক্ষতির সাথে উল্লেখযোগ্যভাবে হ্যাশ বৈশিষ্ট্য ভেক্টরের দৈর্ঘ্য (এবং এইভাবে জটিলতা) হ্রাস করা সম্ভব। সাইকিট-শিখার কিছু হ্যাশিং পরামিতি রয়েছে যা উদাহরণস্বরূপ সহায়তা করতে পারে alternate_sign

  • যদি হ্যাশিং ম্যাট্রিক্স অভিধানের চেয়ে বৃহত্তর হয় তবে এর অর্থ হ্যাশিং ম্যাট্রিক্সের অনেকগুলি কলামের এন্ট্রি খালি থাকবে এবং কেবলমাত্র একটি প্রদত্ত নথিতে নির্দিষ্ট শব্দটি অন্তর্ভুক্ত নয়, তবে সেগুলি পুরোটি ফাঁকা থাকার কারণে নয় not ম্যাট্রিক্স। যদি এটি না হয় তবে এটি একই বৈশিষ্ট্যটির হ্যাশকে একাধিক পদ প্রেরণ করতে পারে - এটিই আমরা 'সংঘর্ষ' এর কথা বলছি। HashingVectorizerএখানে একটি alternate_signবর্ণনা রয়েছে যা এটি পূর্বনির্ধারিত হিসাবে ডাকা হয় যা এটিকে বলা প্রশমিত করতে কাজ করে : en.wikedia.org/wiki/Feature_hashing#Properties

  • 'টার্ম ফ্রিকোয়েন্সি - বিপরীত ডকুমেন্ট ফ্রিকোয়েন্সি' প্রতিটি নথিতে মেয়াদী ফ্রিকোয়েন্সি নেয় এবং পুরো কর্পাস জুড়ে আরও ঘন ঘন প্রদর্শিত হওয়া শব্দগুলিকে শাস্তি দিয়ে তাদের ওজন করে। স্বজ্ঞাততাটি হ'ল পরিস্থিতিগতভাবে পাওয়া শর্তাদি কোনও নির্দিষ্ট নথির বিষয়ের প্রতিনিধি হওয়ার সম্ভাবনা বেশি। এটি একটি হ্যাশিং ফাংশন থেকে পৃথক যে বিপরীত নথির ফ্রিকোয়েন্সি গণনা করার জন্য কর্পাসে শব্দের একটি সম্পূর্ণ অভিধান থাকা প্রয়োজন। আমি আশা করি আপনার tf.idf ম্যাট্রিক্সের পরিমাপগুলি কর্পাসের 663307 শব্দ দ্বারা 45339 নথি রয়েছে; ম্যানেজিং এট আল আরও বিশদ এবং গণনার উদাহরণ সরবরাহ করে: https://nlp.stanford.edu/IR-book/html/htmledition/term-fre ফ্রিকোয়েন্সি- এবং ওয়েটিং-1.html

লেস্কোভেক এট আল দ্বারা রচিত 'মাইনিভ ডেটাসেটের খনির' বৈশিষ্ট্য হ্যাশিং এবং টিএফ.আইডিএফ উভয়ের উপর বিশদ বিশদ রয়েছে, লেখকরা পিডিএফটি এখানে উপলব্ধ করেছেন: http://www.mmds.org/


1
তাহলে tfidf vectorizerIDF গণনার জন্য শব্দের একটি পূর্ণ অভিধান প্রয়োজন, না tfidf ম্যাট্রিক্স পদ হ্যাশ ম্যাট্রিক্স পদ চেয়ে বেশি হওয়া উচিত?
মিনু

2
যদি হ্যাশিং ম্যাট্রিক্স অভিধানের চেয়ে বৃহত্তর হয় তবে এর অর্থ হ্যাশিং ম্যাট্রিক্সের অনেকগুলি কলামের এন্ট্রি খালি থাকবে এবং কেবলমাত্র একটি প্রদত্ত নথিতে নির্দিষ্ট শব্দটি অন্তর্ভুক্ত নয়, তবে সেগুলি পুরোটি ফাঁকা থাকার কারণে নয় not ম্যাট্রিক্স। সামান্যভাবে বিষয় ছাড়াই, তবে আপনি ভ্যাক্টরিজিংয়ের আগে আপনার নথিতে থাকা শব্দের কোনও প্রসেসিং করছেন? স্টপওয়ার্ডস, স্টেমিং ইত্যাদি?
redhqs

হ্যাঁ, আমি প্রক্রিয়াজাত করছি। আমি স্প্যাসি ব্যবহার করছি।
মিনু

1
নিশ্চিতকরণ: সুতরাং, 1048576 হ্যাশিং ম্যাট্রিক্সের ডিফল্ট দৈর্ঘ্য যদি এন_ফিউচারগুলি উল্লেখ না করা হয়? যদি কর্পাসে সত্যিই কেবল 663307 শব্দ থাকে তবে বাকী 385269 টি বৈশিষ্ট্য খালি থাকে। সমস্ত খালি বৈশিষ্ট্য ছাড়াই কীভাবে এই হ্যাশিং ম্যাট্রিক্স স্নাগ করতে পারে?
মিনু

1
এটি ঠিক - আপনি প্যারামিটারটি পরিবর্তন করে ফিচারগুলির সংখ্যাটি আকার পরিবর্তন করতে n_features=1048576পারেন, আপনার কাছে সময় থাকলে 640 কে, 320 কে চেষ্টা করে দেখুন এবং এটি আপনার নির্ভুলতার উপর অনেক বেশি প্রভাব ফেলে কিনা। কমপক্ষে আপনার প্রশিক্ষণের সময়টি দ্রুত করা উচিত। @ নাথানের উত্তর দেখুন 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

হ্যাশিংভেক্টরাইজার এবং কাউন্টভেক্টরাইজার (নোট টিফিডফেক্টরাইজার নয়) একই জিনিসটি বোঝায়। যা টেক্সট দস্তাবেজগুলির সংকলনকে টোকেন সংঘটনগুলির ম্যাট্রিক্সে রূপান্তর করতে পারে।

আপনি যদি তাদের আপেক্ষিক গুরুত্ব (আইডিএফ) দ্বারা ভারিত মেয়াদী ফ্রিকোয়েন্সি পেতে চাইছেন তবে আপনার ব্যবহার করা উচিত টিফিডফেক্টরাইজার is আপনার যদি কাঁচা গণনা বা নর্মালাইজড গণনা (টার্ম ফ্রিকোয়েন্সি) প্রয়োজন হয় তবে আপনার কাউন্টভেেক্টরাইজার বা হ্যাশিংভেক্টরাইজার ব্যবহার করা উচিত।

হ্যাশিংভেক্টরাইজার সম্পর্কে জানতে, হ্যাশিংভেক্টরাইজার বনাম কাউন্টভেক্টরাইজারের এই নিবন্ধটি দেখুন ।

Tfidfvectorizer সম্পর্কে আরও তথ্যের জন্য, Tfidftransformer এবং Tfidfvectorizer কীভাবে ব্যবহার করবেন সে সম্পর্কে এই নিবন্ধটি দেখুন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.