এই জাতীয় পার্সারের নাম, বা কেন এটি বিদ্যমান নেই


27

প্রচলিত পার্সাররা তাদের পুরো ইনপুট গ্রাস করে এবং একটি একক পার্স গাছ তৈরি করে। আমি এমন একটি সন্ধান করছি যা অবিচ্ছিন্ন প্রবাহ গ্রহণ করে এবং একটি পার্স বনভূমি উত্পাদন করে [ সম্পাদনা করুন: কেন এই শব্দটির ব্যবহারটি প্রচলিত হতে পারে সে সম্পর্কে মন্তব্যগুলিতে আলোচনা দেখুন ]। আমার অন্ত্রে বলে যে আমি এইরকম পার্সারের প্রয়োজন হয় এমন প্রথম ব্যক্তি হতে পারি না (বা আমার মনে হয় আমার প্রয়োজন হয়) তবে আমি কয়েক মাস ধরে সন্ধান করেছি এবং কোন লাভ হয়নি।

আমি স্বীকার করেছি যে আমি এক্সওয়াই সমস্যা দ্বারা আটকা পড়ে থাকতে পারে। আমার চূড়ান্ত উদ্দেশ্য হ'ল পাঠ্যের একটি প্রবাহকে পার্স করা, এর বেশিরভাগ অংশকে উপেক্ষা করে এবং স্বীকৃত অংশগুলি থেকে পার্স গাছের প্রবাহ উত্পাদন করা।

সুতরাং আমার প্রশ্নটি শর্তাধীন: যদি এই বৈশিষ্ট্যগুলির সাথে এক শ্রেণীর পার্সার উপস্থিত থাকে তবে এটিকে কী বলা হয়? আর তা না হলে কেন? বিকল্প কি? সম্ভবত আমি প্রচলিত পার্সারদের আমি যা চাই তা করতে পারি এমন কোনও উপায় মিস করছি।


1
মূলত আপনার পার্সার একটি একক দস্তাবেজকে বিশ্লেষণ করে এবং একটি পার্স গাছ দেয়, তারপরে তত্ক্ষণাত অন্য নথির বিশ্লেষণ শুরু করে etc. ইত্যাদি I আমি মনে করি যে কোনও একক নথিতে প্রয়োগ করা বিভিন্ন পার্সিং কৌশলগুলির তুলনায় এই আচরণ পরিবর্তনটি তুচ্ছ। অতএব এটির জন্য বিশেষ পদটির অভাব রয়েছে।
9000

3
আমি "পার্সে বন" এর জন্য একটি গুগল অনুসন্ধান করেছি এবং আবিষ্কার করেছি যে আর্লি পার্সার এগুলি উত্পাদন করে।
রবার্ট হার্ভে

7
আপনি সম্ভবত মোনাডিক পার্সার সংযুক্তকারীগুলির সন্ধান করছেন - এটি বেশ কয়েকটি ছোট পার্সার নিয়ে গঠিত একটি বৃহত্তর পার্সার। তারা এমন পরিস্থিতির জন্য সহজ যেখানে একটি ভাষার একটি "দ্বীপ" অন্য ভাষায় এম্বেড থাকে। সি # ডিজাইন দলের আমার প্রাক্তন সহকর্মী লূক হোবান তাদের সম্পর্কে একটি ভাল নিবন্ধ আছে: ব্লগস.এমএসডিএন
এরিক লিপার্ট

3
কিছুটা বিভ্রান্তি আছে। আপনি কী বোঝাতে চেয়েছেন যে আপনি আপনার স্ট্রিমের প্রতিটি নথির জন্য একটি পার্স গাছ চান এবং সেগুলি একসাথে একটি পার্স বন তৈরি করে। পার্স অরণ্যের এটি সাধারণ অর্থ নয়। একটি পার্স অরণ্য একটি একক অস্পষ্ট নথির জন্য পার্স গাছের সেট (কিছুটা সরলকরণ) যা বিভিন্ন উপায়ে পার্স করা যায়। এবং এটিই সমস্ত উত্তর সম্পর্কে। আপনার স্ট্রিমটি আবর্জনা দ্বারা পৃথককৃত অনেকগুলি সম্পূর্ণ নথি নিয়ে গঠিত বা এটি কোনও একক দস্তাবেজ যা আংশিকভাবে গার্ফ করা হয়েছে। আপনার নথিটি সিনথেটিকভাবে সঠিক হওয়ার কথা আছে কি না? সঠিক প্রযুক্তিগত উত্তর তার উপর নির্ভর করে।
বাবু

1
তারপরে পার্স বন এবং আর্লি, জিএলআর, মারপা, ডেরিভেটিভস সম্পর্কে সমস্ত উত্তর ভুলে যান এগুলি আপাতত আপনি কী চান তা না হলে অন্য কোনও কারণ না দেখানো হয়। আপনার নথিগুলি কি সিনট্যাক্টিকভাবে সঠিক? কিছু পার্সিং কৌশল আংশিকভাবে গলিত নথিগুলির জন্য প্রসঙ্গটি পুনরায় তৈরি করতে পারে। এই ডকুমেন্টগুলির জন্য আপনার কাছে একটি সুনির্দিষ্ট বাক্য গঠন রয়েছে। এটা কি সবার জন্য এক রকম? আপনি কি সত্যিই পার্স গাছ চান, বা আপনি নথিগুলি পৃথক করে এবং সম্ভবত পরে পৃথকভাবে পার্স করে সন্তুষ্ট হতে পারবেন। আমি মনে করি আপনার প্রক্রিয়াকরণে কী উন্নতি করতে পারে তা আমি জানি তবে আপনি নিশ্চিত যে এটি শেল্ফ থেকে সরিয়ে নিতে পারবেন।
বাবু

উত্তর:


48

পুরো ইনপুটটি গ্রাস করার আগে একটি পার্সার যা (আংশিক) ফলাফল দেয় তাকে ইনক্রিমেন্টাল পার্সার বলে । ব্যাকরণে স্থানীয় অস্পষ্টতাগুলি যদি কেবল ইনপুট পরে সিদ্ধান্ত নেওয়া হয় তবে বর্ধনীয় বিশ্লেষণ কঠিন হতে পারে। আর একটি অসুবিধা হ'ল পার্স গাছের সেই অংশগুলিকে চিহ্নিত করা যা এখনও পৌঁছায় নি।

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


তবে, আপনি এটির কোনওটি চাইছেন বলে মনে হয় না। আপনার মাঝে একাধিক এমবেডড ডকুমেন্ট সহ একটি স্ট্রিম রয়েছে যার মধ্যে আবর্জনা রয়েছে:

 garbagegarbage{key:42}garbagegarbage[1,2,3]{id:0}garbage...

আপনি এমন একটি পার্সার চাইছেন যা আবর্জনার উপর দিয়ে যায় এবং (অলসভাবে) প্রতিটি নথির জন্য এএসটিগুলির একটি ক্রম দেয়। এটিকে একেবারে সাধারণ অর্থে বর্ধক পার্সার হিসাবে বিবেচনা করা যেতে পারে। তবে আপনি প্রকৃতপক্ষে এর মতো লুপটি প্রয়োগ করতে চান:

while stream is not empty:
  try:
    yield parse_document(stream at current position)
  except:
    advance position in stream by 1 character or token

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

আপনার ইনপুট স্ট্রিমের কারণে অলস টোকেনাইজেশন সম্ভবত সবচেয়ে মার্জিত সমাধান। কোনও লেসারের পর্যায়ে টোকেনগুলির একটি নির্দিষ্ট তালিকা তৈরি করার পরিবর্তে, পার্সার আলস্যভাবে একটি লেক্সার কলব্যাক [1] থেকে পরবর্তী টোকেনটির জন্য অনুরোধ করবে । লেক্সার তার পরে প্রয়োজনীয় প্রবাহের প্রচুর পরিমাণে গ্রাস করত। এইভাবে, পার্সার কেবল তখনই ব্যর্থ হতে পারে যখন স্ট্রিমের আসল প্রান্তটি পৌঁছে যায় বা যখন আসল বিশ্লেষণ ত্রুটি ঘটে (যেমন আমরা আবর্জনায় থাকাকালীন আমরা পার্সিং শুরু করি)।

[1] কলব্যাক-চালিত লেক্সার অন্যান্য প্রসঙ্গেও একটি ভাল ধারণা, কারণ এটি দীর্ঘতম টোকেনের মিলের সাথে কিছু সমস্যা এড়াতে পারে

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


5
আপনার সিউডোকোড আসলে আমি যা করছি তা হ'ল তবে আমি ভেবেছিলাম এটি কেবল একটি কুৎসিত হ্যাক। পার্সার দুই ধরণের ব্যতিক্রম ছোঁড়ে ( NO_MATCHএবং UNDERFLOW) যা আমাকে স্ট্রিমের অবস্থানটি এগিয়ে নিতে হবে বা আরও ইনপুটটির জন্য অপেক্ষা করতে হবে তা পার্থক্য করতে দেয়।
কেভিন ক্রামউইদে

5
@ কেভিন: আমি মালিকানা ফর্ম্যাটে কোনও নেটওয়ার্ক থেকে আগত ডেটা হ্যান্ডেল করতে কিছু সুরক্ষা বৈশিষ্ট্য সহ এটিও ব্যবহার করি । এটি সম্পর্কে কিছুই হ্যাক!
মনিকার সাথে লাইটনেস রেস

5

এটি করার জন্য পার্সারের একটি নির্দিষ্ট নাম নেই। তবে আমি একটি আলগোরিদম হাইলাইট করব যা এটি করে: ডেরাইভেটিভগুলির সাথে পার্সিং

এটি ইনপুট গ্রহণ করে, একসাথে এক টোকেন। এটি ইনপুটটির শেষে পার্স অরণ্য উত্পাদন করবে। বিকল্পভাবে, আপনি পার্সিংয়ের ( আংশিক পার্স) মাঝখানে থাকা অবস্থায় পুরো পার্স ফরেস্টও পেতে পারেন ।

ডেরিভেটিভগুলির সাথে পার্সিং প্রসঙ্গমুক্ত ব্যাকরণ পরিচালনা করে এবং অস্পষ্ট ব্যাকরণগুলির জন্য একটি পার্স বন তৈরি করবে।

এটি সত্যিই একটি মার্জিত তত্ত্ব, তবে এটি কেবলমাত্র শৈশবকালেই রয়েছে এবং এটি ব্যাপকভাবে স্থাপন করা হয় না। স্ক্যাট / র‌্যাকেট / ইত্যাদির বিভিন্ন বাস্তবায়নের জন্য ম্যাট মাইটের লিঙ্কগুলির একটি তালিকা রয়েছে।

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


4
ডাউনভোটার: আপনি কি দয়া করে ব্যাখ্যা করতে পারবেন যে ডাউনটাওয়েটের উপযুক্ত ছিল? আমার যদি কিছু ঠিক করার বা উন্নত করার দরকার হয় তবে তা জেনে রাখা ভাল।
কর্নস্টালক

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

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

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

2

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

buffer = ''
for each line from input:
    buffer = buffer + line
    if can parse buffer:
        emit tree
        buffer = ''

বড় সমস্যাটি হ'ল কয়েকটি ভাষায় আপনি জানতে পারবেন না যে পরবর্তী লাইনটি পড়ার আগে কোনও অভিব্যক্তি সম্পূর্ণ। সেক্ষেত্রে, আপনার কাছে মনে হয় যে আপনি পরেরটিটি পড়তে পারেন এবং এটি একটি বৈধ সূচনা, বা বৈধ ধারাবাহিকতা কিনা তা পরীক্ষা করে দেখতে পারেন ... তবে তার জন্য আপনার সঠিক ভাষার বাক্য গঠন গঠনের প্রয়োজন

সবচেয়ে খারাপ বিষয়, এই ভাষাগুলিতে এমন একটি প্যাথলজিকাল কেস তৈরি করা শক্ত নয় যা ফাইলের শেষ অবধি পার্স করা যায় না, এমনকি যদি এটি দীর্ঘ দীর্ঘ বিবৃতি নাও থাকে।


0

সংক্ষেপে

দেখে মনে হচ্ছে আপনার সমস্যার দ্রুত সমাধান হ'ল একটি আরইজিএক্স, বা একটি এফএসএ (সসীম রাষ্ট্র অটোমেটন) সংজ্ঞায়িত করা, যা নথির সমস্ত সম্ভাব্য সূচনাকে স্বীকৃতি দেয় (মিথ্যা ধনাত্মক মঞ্জুরি দেওয়া হয়, এটি আসলে কোনও দস্তাবেজের সাথে মিলে না)। তারপরে আপনি যে জায়গাটি কোনও ত্রুটি দিয়ে কোনও দস্তাবেজ শুরু করতে পারে তার পরের জায়গাটি সনাক্ত করতে আপনি আপনার ইনপুটটিতে এটি খুব দ্রুত চালাতে পারেন। এটি কোনও দস্তাবেজ শুরুর জন্য কয়েকটি ভ্রান্ত অবস্থান তৈরি করতে পারে তবে তারা পার্সার দ্বারা স্বীকৃত হবে এবং ত্যাগ করা হবে।

সুতরাং ফাইনাইট স্টেট অটোমেটন আপনার যে পার্সার নামটি সন্ধান করেছিলেন তা হতে পারে। :)

সমস্যাটি

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

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

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

এটি তার উত্তরের দ্বিতীয় অংশে @amon দ্বারা প্রস্তাবিত সমাধানও ।

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

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

সহজ সমাধান

আপনাকে যা করতে হবে তা হ'ল এই নথিগুলি কীভাবে শুরু হয় তা অনুসন্ধান করার জন্য আপনার দস্তাবেজের স্পেসিফিকেশন বিশ্লেষণ করা। আমি কীভাবে ঠিক তা বলতে পারি না, কারণ আমি নিশ্চিত না যে কীভাবে তাদের সিনট্যাক্সের স্পেসিফিকেশন আনুষ্ঠানিকভাবে সংগঠিত হয়। সম্ভবত তারা সমস্ত সীমাবদ্ধ তালিকা থেকে কিছু শব্দ দিয়ে শুরু করে, সম্ভবত কিছু বিরামচিহ্ন বা সংখ্যার সাথে মিশ্রিত হয়। এটি আপনার পরীক্ষা করার জন্য।

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

একবার আপনি আপনার রেজিএক্সপ্যাক্স তৈরি করার পরে, আপনার প্রথম (বা পরবর্তী) নথির শুরুতে খুব দ্রুত পেতে আপনার ইনপুট স্ট্রিমে এটি চালাতে পারেন:

আমি ধরে নিই:
- docstartসমস্ত ডকুমেন্টের শুরুর সাথে মিলে যায় এমন একটি রেইজেক্স
- search(regex, stream)এমন একটি ফাংশন streamযা মিলে যায় এমন একটি স্ট্রিংয়ের সন্ধান করে regex। এটি যখন ফিরে আসে, প্রথম মিলনের সাবস্ট্রিংয়ের শুরুতে স্ট্রিমটি তার প্রত্যয়টি সাবস্ট্রিম থেকে কমে যায় বা খালি প্রবাহে কোনও মিল খুঁজে পাওয়া যায় না।
- parse(stream)স্ট্রিমের শুরু থেকে কোনও দস্তাবেজকে বিশ্লেষণ করার চেষ্টা করে (এর কী বাকী থাকে) এবং যে কোনও ফর্ম্যাটে পার্স ট্রি প্রদান করে বা ব্যর্থ হয়। যখন এটি ফিরে আসে, প্রবাহিত দস্তাবেজটির অবিলম্বে অবস্থানটি শুরু করে স্ট্রিমটিকে তার প্রত্যয়টি সাবস্ট্রিম এ হ্রাস করা হয়। পার্স ব্যর্থ হলে এটি ব্যতিক্রমকে কল করে।

forest = empty_forest
search(docstart, stream)
while stream is not empty:
  try:
    forest = forest + parse(stream)
  except
    remove first character from stream
  search(docstart, stream)

নোট করুন যে প্রথম অক্ষরটি অপসারণ করা প্রয়োজনীয় যাতে পরবর্তী অনুসন্ধানে আবার একই মিল খুঁজে না পায়।

অবশ্যই, স্ট্রিমটি ছোট করা একটি চিত্র। এটি কেবল স্রোতে একটি সূচক হতে পারে।

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

সুতরাং এটি সম্ভবত কার্যকর যদি রেজেক্স সহজতর করতে সাহায্য করতে পারে।

দ্রুত সমাধানের সম্ভাবনা সম্পর্কে

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

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

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

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


-2

আপনি যা বর্ণনা করছেন তা SAX বনাম SOM হিসাবে বর্ণনা করা যেতে পারে।

স্যাক্স - (এক্সএমএলের জন্য সিম্পল এপিআই) এক্সএমএল ডকুমেন্টগুলির জন্য এক্সএমএল-ডিএইভি মেলিং তালিকা দ্বারা বিকাশ করা ইভেন্ট ইভেন্ট সিক্যুয়াল অ্যাক্সেস পার্সার এপিআই।

এসওএম - (এক্সএমএল স্কিমা অবজেক্ট মডেল) একটি এক্সএমএল ফাইলের স্মৃতি উপস্থাপনে এলোমেলো অ্যাক্সেস

C #, এবং জাভা এবং সম্ভবত আরও অনেকগুলি ক্ষেত্রে উভয় প্রকারের বাস্তবায়ন রয়েছে। সাধারণত একটি এক্সএসডি বা ডিটিডি alচ্ছিক।

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

এই উত্তরটি সমস্ত প্ল্যাটফর্ম এবং সমস্ত ভাষার জন্য প্রযোজ্য নয়।


1
আপনি কী ভাবেন যে ওপি এক্সএমএলকে পার্স করছে?
ড্যান পিচেলম্যান

1
এটি প্রশ্নের উত্তর দেয় না।

@ স্নোমান এখন পর্যন্ত মোটামুটি কিছুই গ্রহণ করা উত্তরের প্রথমার্ধ সহ প্রশ্নের উত্তর দিচ্ছিল না। কারও বাছাইয়ে লাভ নেই। প্রশ্নের যত্ন সহকারে পড়া দরকার।
বাবু

@ বাউউ আমি কাউকে বাছাই করছিলাম না, আমি আমার উপন্যাসটি ব্যাখ্যা করছিলাম।

@ সোনমান আমার ডাউনটোটের ব্যাখ্যা দিচ্ছেন । এটি ন্যায্য, এবং আমি চাই আরও ব্যবহারকারী এটি করতে পারে। আমি কোনও নেটিভ স্পিকার নই: তাকে বেছে নেওয়া খুব শক্তিশালী অভিব্যক্তি হতে পারে। এটি প্রত্যেকেই অনিয়ন্ত্রিত অনুমান করে চলেছে। তাই এটি লক্ষ্য করার মতোও নয়। এটি সত্য যে এটি অন্যদের তুলনায় কিছুটা বেশি বন্ধ বলে মনে হচ্ছে।
বাবু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.