সংক্ষিপ্ত পাঠ্য স্ট্রিংগুলির জন্য একটি দক্ষ সংক্ষেপণ অ্যালগরিদম [বন্ধ]


126

আমি ছোট টেক্সট স্ট্রিংগুলি সঙ্কুচিত করতে একটি অ্যালগরিদম সন্ধান করছি: 50-1000 বাইট (অর্থাত্ ইউআরএল)। এর জন্য কোন অ্যালগরিদম সবচেয়ে ভাল কাজ করে?


1
আপনি এই সংক্ষেপিত স্ট্রিংগুলি কোথায় ব্যবহার করতে চান?
গম্বো

1
এটি কি দিকে যাচ্ছে tinyurlsবা স্টোরেজ স্পেসের সাথে কিছু করার আছে?
নিক

6
আমি ইউআরএলগুলি কমপ্রেস করার জন্য একটি অ্যালগরিদমে আগ্রহী, সেরা কম্প্রেশন অনুপাত চলমান ব্যয়ের পরে আরও গুরুত্বপূর্ণ। টিনিয়র্লস বা ট্রিমিমের মতো অনলাইন পরিষেবাদিতে আগ্রহী নয় আমি একটি অ্যালগরিদম খুঁজছি একটি পরিষেবা নয়। ভাবুন না যে অন্য কোনও তথ্য কার্যকর হতে পারে ...
ভ্যাসিলি করলোভ

3
@ গম্বো: "সংক্ষিপ্ত স্ট্রিংয়ের জন্য পাঠ্য সংক্ষেপণ অ্যালগরিদম" অ্যালগোস সন্ধানের জন্য যথেষ্ট, আপনি কীসের জন্য তা জানতে এত আগ্রহী কেন? আমি নিশ্চিত যে ওপি যা চায় তার একটি আবিষ্কার করতে সক্ষম হবে।
দার্ভিন থাঙ্ক

7
@ ভ্যাসিলি, একটি ছোট্ট ইঙ্গিত: আপনি যখনই এসওর কাছে " সেরা এক্সওয়াইজেড?" আকারে কোনও প্রশ্ন জিজ্ঞাসা করছেন , আপনার প্রশ্নটি বন্ধ হওয়ার জন্য ভোট গ্রহণের জন্য প্রায় বাধ্য, কারণ সেরা জিজ্ঞাসা করার কারণে অপ্রয়োজনীয় পণ্য হতে পারে তুলনা, বা সবচেয়ে খারাপ ক্ষেত্রে, এমনকি শিখা যুদ্ধ। (এটি এড়াতে সাধারণত খুব সামান্য পরিবর্তন লাগে: আপনি যদি একই প্রশ্নটি জিজ্ঞাসা করেন, "দয়া করে একটি এক্সওয়াইজেড পরামর্শ দিন।" তবে মূলত একই প্রশ্ন
সত্ত্বেও আপনি এতগুলি

উত্তর:


62

পরীক্ষা করে দেখুন Smaz :

স্মাজ খুব সহজ সংক্ষিপ্ত স্ট্রিং সংক্ষেপণের জন্য উপযুক্ত একটি সাধারণ সংক্ষেপণ গ্রন্থাগার।


17
Github.com/antirez/smaz/blob/master/smaz.c দেখুন - এটি কোডিংয়ের একটি বৈকল্পিক, প্রতি সেপ্রে সংক্ষেপণ নয় (কমপক্ষে সম্পূর্ণ নয়)। তিনি একটি স্থির শব্দ এবং বর্ণের অভিধান ব্যবহার করেন।
রায় টিঙ্কার

7
দ্রষ্টব্য: এটি অ্যান্টেরিজের প্রকল্প। তিনি রেডিসের অন্যতম প্রধান লেখক এবং উচ্চমান, উত্পাদন কোড প্রকাশের খুব দৃ strong় খ্যাতি রয়েছে।
হোমার

7
স্মাগ অ্যালগরিদম ইংরেজি পাঠগুলির জন্য অনুকূলিত, সুতরাং এলোমেলো স্ট্রিংয়ের জন্য ভাল কাজ করে না। এখানে কিছু নমুনা (হয় string:orig_size:compr_size:space_savings) This is the very end of it.:27:13:52%, Lorem ipsum dolor sit amet:26:19:27%, Llanfairpwllgwyngyll:20:17:15%, aaaaaaaaaaaaa:13:13:0%, 2BTWm6WcK9AqTU:14:20:-43%,XXX:3:5:-67%
mykhal

4
নিম্নতর সংকোচনের দিকেও নজর দিন
ডিকি সিং

লিস্টে আমার লাইব্রেরিতে Unishox যোগ github.com/siara-cc/unishox । এটি স্মাজ ও শোকোর চেয়ে আরও ভাল পারফর্ম করে এবং ইউটিএফ -8 স্ট্রিংকে সংকোচনের পক্ষে সমর্থন করে।
অরুণ

28

হাফম্যানের একটি স্ট্যাটিক ব্যয় রয়েছে, হাফম্যান টেবিল, তাই আমি এটি একটি ভাল পছন্দের সাথে একমত নই।

অভিযোজিত সংস্করণগুলি রয়েছে যা এটিকে সরিয়ে দেয় তবে সংক্ষেপণের হারটি ভুগতে পারে। আসলে, আপনার যে প্রশ্নটি জিজ্ঞাসা করা উচিত তা হ'ল "এই বৈশিষ্ট্যগুলির সাথে টেক্সট স্ট্রিংগুলি সংকোচন করার জন্য কি অ্যালগরিদম"। উদাহরণস্বরূপ, যদি দীর্ঘ পুনরাবৃত্তি প্রত্যাশিত হয় তবে সহজ রান-লেং এনকোডিং যথেষ্ট be যদি আপনি গ্যারান্টি দিতে পারেন যে কেবলমাত্র ইংরেজী শব্দ, ফাঁকা স্থান, যোজনা এবং মাঝে মাঝে অঙ্কগুলি উপস্থিত থাকবে, তবে পূর্ব নির্ধারিত হাফম্যান টেবিলযুক্ত হাফম্যান ভাল ফল দিতে পারে।

সাধারণত, লেম্পেল-জিভ পরিবারের আলগোরিদিমগুলির মধ্যে খুব ভাল সংকোচনের ও কর্মক্ষমতা থাকে এবং তাদের জন্য প্রচুর গ্রন্থাগার রয়েছে। আমি সাথে যেতে হবে।

সংকুচিত হচ্ছে এমন তথ্যগুলি ইউআরএল রয়েছে, তারপরে আমি পরামর্শ দিয়েছিলাম যে, সংকোচন করার আগে (যে কোনও অ্যালগোরিদম সহজেই পাওয়া যায়) এর সাথে আপনি এগুলি সংরক্ষণ করুন। ইউআরএলগুলি সু-সংজ্ঞায়িত নিদর্শনগুলি অনুসরণ করে এবং এর কিছু অংশ অত্যন্ত অনুমানযোগ্য। এই জ্ঞানটি ব্যবহার করে আপনি URL গুলিকে ছোট ছোট কিছুতে কোড করতে পারেন এবং হাফম্যান এনকোডিংয়ের পিছনে ধারণাগুলি আপনাকে এখানে সহায়তা করতে পারে।

উদাহরণস্বরূপ, ইউআরএলটিকে কিছুটা স্ট্রিমে অনুবাদ করে আপনি "HTTP" কে বিট 1 এর সাথে এবং বিট "0" এর সাথে অন্য কোনও কিছুর পরিবর্তে প্রকৃত প্রোটোটল (বা অন্য সাধারণ প্রোটোকল পেতে https, এফটিপি, ফাইল)। যতক্ষণ আপনি প্রোটোকলের শেষ চিহ্নিত করতে পারেন ততক্ষণ ": //" পুরোপুরি ফেলে দেওয়া যেতে পারে। ইত্যাদি ইউআরএল ফর্ম্যাট সম্পর্কে পড়ুন, এবং কীভাবে কম স্থান নেওয়ার জন্য তাদের কোডিং করা যায় তা চিন্তা করুন।


4
হফম্যান টেবিলটি সমস্ত ফাইলের জন্য একই হয় তবে ফাইলগুলি একে অপরের সাথে সমান হয় তবে তা বোঝা যাবে।
ফাইন

1
আপনার যদি অনেকগুলি, অনুরূপ, ছোট ফাইল থাকে তবে আপনি এটি সব ভুল করছেন। প্রথমে তাদের সমস্তকে সংযুক্ত করুন (যেমন ট্যারিটি করে) এবং তারপরে সংকোচন করুন। আপনি আরও ভাল সংক্ষেপণ পাবেন, এবং সমস্যাটি "50-1000 বাইট" হয়ে যায়।
ড্যানিয়েল সি সোব্রাল

8
@ ড্যানিয়েল: আপনি সংক্ষেপিত ডেটাতে এলোমেলো অ্যাক্সেস চান কিনা তা নির্ভর করে। এগুলি সমস্ত একসাথে সংকুচিত করা বেশিরভাগ সংক্ষেপণ সিস্টেমের সাথে বাধা দেয়।
স্টিভ জেসোপ

22

আমার হাতে দেওয়ার কোড নেই তবে আমি সর্বদা আকারের 256 * 256 অক্ষরের 2D লুক টেবিল ( আরএফসি 1978 , পিপিপি প্রেডিক্টর সংক্ষেপণ প্রোটোকল ) তৈরির পদ্ধতির পছন্দ করি liked একটি স্ট্রিং সংকোচনের জন্য আপনি প্রতিটি চরের উপর লুপ করেন এবং সারণীতে সূচক হিসাবে বর্তমান এবং পূর্ববর্তী চরটি ব্যবহার করে পরবর্তী চরটি 'ভবিষ্যদ্বাণী করা' পেতে পেতে সারণীটি ব্যবহার করুন। যদি কোনও মিল থাকে তবে আপনি একক 1 বিট লিখুন, অন্যথায় একটি 0 লিখুন এবং বর্তমানের চরটি দিয়ে অনুসন্ধান সারণীটি আপডেট করুন। এই পদ্ধতিটি মূলত ডেটা স্ট্রিমের সবচেয়ে সম্ভাব্য পরবর্তী অক্ষরের একটি গতিশীল (এবং অপরিশোধিত) দেখার সারণি বজায় রাখে।

আপনি একটি শূন্য অনুসন্ধানের টেবিল দিয়ে শুরু করতে পারেন, তবে প্রতিটি অক্ষরের জুটির সর্বাধিক সম্ভাব্য চরিত্রের সাহায্যে এটি প্রাথমিকভাবে শুরু করা হলে উদাহরণস্বরূপ, ইংরেজি ভাষার জন্য এটি খুব ছোট স্ট্রিংয়ে সবচেয়ে ভাল কাজ করে। সংক্ষিপ্ত বিবরণ এবং ডিকম্প্রেশন জন্য প্রাথমিক লুক টেবিলটি সমান হওয়ায় আপনার এটি সংকোচিত ডেটাতে বের করার প্রয়োজন হবে না।

এই অ্যালগরিদম একটি উজ্জ্বল সংকোচনের অনুপাত দেয় না, তবে এটি মেমরি এবং সিপিইউ সংস্থানগুলির সাথে অবিশ্বাস্যরূপে সাফল্যযুক্ত এবং ডেটার অবিচ্ছিন্ন প্রবাহেও কাজ করতে পারে - ডিকম্প্রেসারটি লকপ্রেসগুলির সাথে লকিং টেবিলের নিজস্ব অনুলিপি বজায় রাখে, এইভাবে অনুসন্ধান সারণী সংকোচিত হওয়ার ধরণের ডেটার সাথে সামঞ্জস্য।


তবে ভবিষ্যদ্বাণীকারী স্বাভাবিক ইংরেজি বাক্যটির সাথে কী আচরণ করবেন? প্রদত্ত উদাহরণটিতে খুব শক্তিশালী রিডানডেন্সি রয়েছে এবং লাভটি ন্যূনতম।
ডানুবিয়ার নাবিক

একটি 256 * 256 দেখার সারণী "মেমরির সাথে অবিশ্বাস্যভাবে সাংস্কৃতিক" শোনায় না ...!
মাইকডাব্লু

@ মাইকডাব্লু ওয়েল এটি 65 কিলোবাইট
redcalx

@redcalx যদি এটি 65 বাইট হত তবে আমি রাজি হতে পারি!
মাইকডাব্লু

11

যে কোনও অ্যালগরিদম / লাইব্রেরি যা প্রিসেট ডিকশনারি সমর্থন করে, যেমন zlib

এইভাবে আপনি একই ধরণের পাঠ্য দিয়ে সংকোচকারীকে প্রাইম করতে পারেন যা ইনপুটটিতে প্রদর্শিত হতে পারে। যদি ফাইলগুলি কোনও উপায়ে একই রকম হয় (যেমন সমস্ত ইউআরএল, সমস্ত সি প্রোগ্রাম, সমস্ত স্ট্যাকওভারফ্লো পোস্ট, সমস্ত এএসসিআইআই-আর্ট অঙ্কন) তবে নির্দিষ্ট কিছু সাবস্ট্রিংগুলি বেশিরভাগ বা সমস্ত ইনপুট ফাইলগুলিতে প্রদর্শিত হবে।

প্রতিটি সংক্ষেপণ অ্যালগরিদম স্থান সংরক্ষণ করবে যদি একই ইনস্ট্রিংটি কোনও ইনপুট ফাইলে একাধিকবার পুনরাবৃত্তি করা হয় (যেমন "ইংরেজী পাঠ্যে" "" বা সি কোডে "ইনট"))

তবে ইউআরএলগুলির ক্ষেত্রে কিছু স্ট্রিং (যেমন " http: // www ।", ".কম", ".এইচটিএমএল", ".এএসপিএক্স") প্রতিটি ইনপুট ফাইলে সাধারণত উপস্থিত হবে So সুতরাং আপনাকে সেগুলি ফাইলগুলির মধ্যে ভাগ করে নেওয়া দরকার ফাইলের জন্য কোনওরকম সংকোচিত ঘটনা না ঘটানোর পরিবর্তে এগুলি একটি প্রিসেট অভিধানে রাখলে এটি অর্জন করবে।



4

হাফম্যান কোডিং এর জন্য সাধারণত কাজ করে।


4
এটি কোনও লিঙ্ক-কেবল উত্তর নয়; লিঙ্ক ছাড়া, এটি এখনও একটি বৈধ উত্তর।
এসএল বার্থ - মনিকা 12

.. এবং এখনও একটি ভাল উত্তর না। (যথেষ্ট প্রাসঙ্গিক তথ্য আনা হয়নি।)
ব্যবহারকারী 2864740

4

আপনি যদি কেবল পাঠ্যকে সংক্ষিপ্ত করার বিষয়ে কথা বলছেন তবে ডিফল্ট / জিজিপ (জিজিপের চারপাশে মোড়ক), ছোট ফাইল এবং পাঠ্যের জন্য জিপ ভালভাবে কাজ করবে। অন্যান্য অ্যালগরিদম বড় আকারের ফাইলগুলির জন্য যেমন bzip2 ইত্যাদির জন্য অত্যন্ত দক্ষ are

উইকিপিডিয়ায় সংকোচনের সময়ের একটি তালিকা রয়েছে। (দক্ষতার তুলনা দেখুন)

Name       | Text         | Binaries      | Raw images
-----------+--------------+---------------+-------------
7-zip      | 19% in 18.8s | 27% in  59.6s | 50% in 36.4s
bzip2      | 20% in  4.7s | 37% in  32.8s | 51% in 20.0s
rar (2.01) | 23% in 30.0s | 36% in 275.4s | 58% in 52.7s
advzip     | 24% in 21.1s | 37% in  70.6s | 57& in 41.6s
gzip       | 25% in  4.2s | 39% in  23.1s | 60% in  5.4s
zip        | 25% in  4.3s | 39% in  23.3s | 60% in  5.7s

6
তিনি ফাইলগুলি নয়, পাঠ্যকে সংকুচিত করতে চান।
গম্বো

3
আপনি এই অ্যালগোরিদমগুলির সাহায্যে পাঠ্য এবং বাইনারি সংক্ষিপ্ত করতে পারেন। আসলে আমরা পাইথন চালিত একটি সেন্টিমিটার সিস্টেমের মধ্যে ডিলেটলেট ব্যবহার করি।
রায়ান ক্রিস্টেনসেন

স্ট্রিংয়ের জন্য জিজিপ
রায়ান খ্রিস্টেনসেন


3
জিজিপ (এবং জিলিবি) ডিফল্ট ব্যবহার করে এবং মোড়ক / ফ্রেমিং ওভারহেড যুক্ত করে .. এটি কয়েক ডজন থেকে কয়েকশ অক্ষরে "সংক্ষিপ্ত" স্ট্রিংগুলির জন্য, অবশ্যই (তথ্যের বিস্তৃতি এড়াতে "এটি কি সংকোচিত ছিল"? নির্দেশ করার জন্য এখনও কিছুটা থাকা উচিত)। বৃহত্তর অতিরিক্ত ওভারহেড কোনও ব্যাপার নয় .. পাঠ্য বাড়ার সাথে সাথে। এখানে পোস্ট করা সংখ্যাগুলি বড় টেক্সট-ফাইলগুলির জন্য প্রদর্শিত হয় (চালানোর জন্য অনেক সেকেন্ড!), যখন ওপি 50-1000 চার্টারের জন্য জিজ্ঞাসা করেন - তুলনায় খুব কম
ব্যবহারকারী 2864740

2

আপনি ইউনিকোডের জন্য স্ট্যান্ডার্ড সংক্ষেপণ স্কিমটি একবার দেখে নিতে পারেন ।

এসকিউএল সার্ভার ২০০৮ আর 2 এটি অভ্যন্তরীণভাবে ব্যবহার করে এবং 50% পর্যন্ত সংক্ষেপণ অর্জন করতে পারে।


ইউএসএফ -১ / / এমবি এনকোডিংগুলিতে এসসিএসইউ অ-ইংরাজীবিহীন ইউনিকোডকে 'কমপ্রেস' করে। যদি ইংলিশ ভিত্তিক ইউনিকোড / সরল-পুরাতন-এএসসিআইআই, ইউটিএফ -8 এছাড়াও ইউটিএফ -16 এর 50% 'সংক্ষেপণ' করে ..
ব্যবহারকারী 2864740
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.