জাভাতে অসতর্কতা ফিল্টার পারফরম্যান্স


9

আমার জাভা ভিত্তিক ওয়েব অ্যাপ্লিকেশনটিতে ব্যবহারকারীদের জমা দেওয়ার বাইরে গৌরব ফিল্টার করা দরকার। ক্লায়েন্ট উভয় সচেতন Scunthorpe, ইংল্যান্ড-সমস্যা এবং Clbuttic সমস্যা এবং পরিণতি গ্রহণ করেছেন। দয়া করে, আমি সেন্সরশিপের অভাবের গুণাবলী নিয়ে বিতর্ক করতে চাই না।

ডেটা দুটি বিট আছে:

  1. ব্যবহারকারীর জমা দেওয়া, যাতে সম্ভাব্য 500 শব্দ বা তাই থাকতে পারে;
  2. একক কলামের ডাটাবেস সারণীতে এমন শব্দ রয়েছে যা নিষিদ্ধ। এই সারণীতে অনেক হাজার রেকর্ড থাকতে পারে।

বর্তমান সমাধানটি আমার কাছে ভুল বলে মনে হচ্ছে:

  1. পুরো টেবিলটি স্ট্যাটিক স্ট্রিং [] এ স্টার্টআপের সময় একটি সিঙ্গলটনে লোড করা হয় (এভাবে স্মৃতিতে থাকে)।
  2. প্রতিটি ব্যবহারকারীর জমা দেওয়ার জন্য আমরা অ্যারের মধ্য দিয়ে লুপ করি এবং স্ট্রিং []] তে কোনও প্রদত্ত শব্দ জমা দেওয়া আছে কিনা তা দেখার জন্য একটি .indexOf () করি।
  3. যদি এটি উপস্থিত হয়, আমরা% $ # @% - শৈলীর অক্ষর দিয়ে প্রতিস্থাপন করব। এটি ব্যবহারকারীর জমা দেওয়ার ক্ষেত্রে টোকেনাইজ করে, সম্পূর্ণ ব্যবহারকারী জমা দেওয়ার মাধ্যমে টোকেন (আবার) হিসাবে লুপিং করে এবং পাওয়া শব্দের প্রতিটি উদাহরণকে প্রতিস্থাপন করে is

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

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


আপনি কেন এটি ভুল বলে মনে করেন তা না জানিয়ে আপনি বলেন যে এটি আপনার কাছে ভুল বলে মনে হচ্ছে। তারপরে আপনি আমাদের না জানিয়েই পারফরম্যান্স সলিউশনের জন্য জিজ্ঞাসা করেন, যেভাবে বর্তমান সমাধানটি পর্যাপ্ত নয়। আপনি প্রতি সেকেন্ডে কতগুলি পাঠ্য পাবেন, এর মধ্যে কতগুলি আপনি প্রক্রিয়া করতে পারেন?
ব্যবহারকারী অজানা

আমি ভেবেছিলাম সমাধানটি ভুল ছিল, প্রাথমিকভাবে কারণ আমি যে কোডবেসে কাজ করছি তা অপর্যাপ্ত এবং opালু। আমার পক্ষপাতিত্ব দেওয়া, আমি আমার নিজের অবিশ্বাস বিশ্বাস করি না। আমি অনুভব করেছি যে অন্যের মতামত উপকারী হবে। যে জিনিসগুলি আমার জন্য অ্যালার্ম স্থাপন করেছিল সেগুলি হ'ল স্ট্রিং [] (এটি কি এটি 1999?), খুব বড় স্ট্রিংয়ের উপর লুপিং করে [] ব্যবহারকারী জমা দেওয়া ডেটার আরও ছোট সেটটির পরিবর্তে, স্ট্রিংয়ের [] লুপের ভিতরে একটি লুপ বাসা বেঁধে রাখে ing টোকেনাইজড ব্যবহারকারী জমা দেওয়ার সাথে, এবং আরও অনেক কিছু। প্রত্যাশিত ব্যবহার অনির্দিষ্ট, আদর্শভাবে যুক্তিসঙ্গত পারফরম্যান্স সহ একটি মার্জিত সমাধান সুন্দর হবে।
ব্লুশিগোল্ডফিশ

2
'যুক্তিসঙ্গত পারফরম্যান্স' বলতে যে কোনও অর্থ বোঝাতে পারে। আপনার যদি কোনও কংক্রিট লক্ষ্য না থাকে তবে আপনি এটি পৌঁছেছেন কিনা তা আপনি জানতে পারবেন না। আপনি যদি কোনও প্রক্রিয়াটি গতিময় করেন, যেমন এটি 100 গুণ দ্রুত হয় - এটি কি লক্ষ্য? যদি ব্যবহারকারী 1 এমএস বা 1 / 10s অপেক্ষা করে থাকে? ব্যবহারকারী আপনার কাজ থেকে কোন উপকার পাবেন না।
ব্যবহারকারী অজানা

উত্তর:


18

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

এটি একটি অত্যন্ত সংশোধিত ডাবল মেটাফোন অ্যালগরিদমের উপর ভিত্তি করে তৈরি করা হয়েছিল যেটি ডিফল্টের পরিবর্তে আরও নির্ভুল হিসাবে চিহ্নিত হতে পারে যা যথাসম্ভব অনেক কিছুর সাথে মেলে। এটি এতটাই কার্যকর ছিল যেহেতু এটি ভুল বানান এবং ফোনেটিক বানানগুলিকে সত্যিকারের শব্দের মতোই বাছাই করে। আমি মেটাফোন অ্যালগরিদমকেও স্পিচ l33tএবং txtকথা বলেছি, এটিকে একটি ট্রিপল / কোয়াড মেটাফোন অ্যালগরিদম আরও তৈরি করে।

এটিতে একটি প্রসেসর বৈশিষ্ট্যযুক্ত যা চলমান চিঠিগুলিকে সংকুচিত করে এবং বাচ্চাদের মতো জিনিসগুলি w o r d sবুদ্ধি করে একসাথে অক্ষরগুলি সংক্ষেপ করে এবং চলমান সদৃশগুলি বাদ দিয়ে এমন জিনিসগুলি সনাক্ত করে wwoorrddss, এটি কেবল ইংরেজির জন্য খুব বিশেষায়িত ছিল।

একক কোর সিপিইউ সিস্টেমে কয়েক হাজার ব্যবহারকারীর সাথে কোনও লক্ষণীয় বিলম্ব ছাড়াই রিয়েল-টাইম চ্যাট সিস্টেম স্ট্রিমে ব্যবহার করা এটি 8 বছর আগে যথেষ্ট দ্রুত ছিল।

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

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


3
এই সমাধানটি সেরা বলে মনে হচ্ছে। সমস্যাটি হল (বা এই মুহুর্তে ছিল) যে আমাকে একটি বিকেলে এটি সমাধান করতে হয়েছিল। যদি পর্যাপ্ত সময় থাকে তবে আমি হয় ডাবল মেটাফোন পন্থা গ্রহণ করব, অথবা আপনাকে এটি নিয়োগ দেব ire :-)
নীলিশগোল্ডফিশ

সুতরাং, আমি অনুমান করি যে অর্ধেক লোক এখন গেমটি খেলতে বন্ধ করবে: ডি
ডিভোর Žড্রালো

2

আপনি যদি ম্যাচটি দক্ষতার সাথে করতে চান তবে আহো করাসিক অ্যালগরিদম হ'ল একটি দুর্দান্ত বিকল্প (আমি নিশ্চিত যে আপনি জাভা বাস্তবায়নটি প্রায় ভাসমান খুঁজে পেতে পারেন)।

অবশ্যই আপনি যেকোন বানানের অনিয়ম ('' $ '->' s ',' @ '->' ক ',' | <'->' কে 'ইত্যাদি) প্রতিস্থাপনের জন্য জমা দেওয়ার প্রাক প্রক্রিয়া করতে চান to


অবশ্যই আমি যা খুঁজছিলাম, ধন্যবাদ! এখানে একটি জাভা বাস্তবায়ন: hkn.eecs.berkeley.edu/~dyoo/java
রেমি মালিসন

0

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

এখানে যে জিনিসটি ব্যর্থ হয়েছে তা হ'ল ক্লাবুটিক সমস্যা যেখানে কেউ খারাপ শব্দটির চারপাশে এলোমেলো অক্ষর যুক্ত করে। bhassda


আমি মনে করি যে শেষের সতর্কতাই এই সমাধানটিকে অনেক বেশি অকেজো করে তোলে - এটি পুরো-শব্দের মিলগুলি ছাড়া আর কোনও কিছুতেই প্রসারিত করার উপায় নেই।

এটা ন্যায্য বক্তব্য; কিন্তু মানুষের মন এমন এক অসম্পূর্ণ ছাঁটাই থেকে বাঁচার জন্য যে সমস্ত সম্ভাব্য জিনিস আসতে পারে তা ক্যাপচার করা শক্ত হয়ে ওঠে। আপনি সর্বদা বিকল্পগুলির একত্রিত করার জন্য ও ও স্টেটমেন্টের সাথে সর্বদা একটি বিশাল নিয়মিত অভিব্যক্তি তৈরি করতে পারেন এবং তারপরে ইনপুটটির বিপরীতে রেজেক্সের সাথে মেলে। অথবা আপনি ইনপুটটির বিপরীতে একটি RLIKE সহ ডাটাবেস থেকে "খারাপ শব্দ ক্ষেত্র" দিয়ে ডাটাবেস থেকে একটি নির্বাচন করতে পারেন। রিটার্ন খারাপ শব্দকে নির্দেশ করে এবং খারাপ শব্দটিও ফিরিয়ে দেয়।

@ সুরত আমার প্রশ্নের আলোচনার মতো ফোনেটিক মিলের সাথে কেবল কোনও শব্দ বা বাক্যাংশ সম্পর্কে ক্যাপচার করা কঠিন নয়। নিখুঁত মিলগুলি কখনই কাজ করবে না বা স্কেল করবে না, তবে একবারে আপনি সম্ভবত টিউন করার সাথে সাথে ফোনেটিক মিলটি প্রায় 100% সময়ের মতো কাজ করে।

-1

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

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

তদতিরিক্ত, আপনি পুরো স্ট্রিং এন বারে লুপিং শেষ করবেন, যেখানে এন আপনার ব্ল্যাকলিস্টে শব্দের সংখ্যা। সেট বা হ্যাশম্যাপ ব্যবহারের পরামর্শগুলি অবশ্যই কিছুটা উন্নতি করতে চলেছে।

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

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

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


-2

আপনি এই জাতীয় ক্ষেত্রে কী করতে চান তা নির্ধারণ করে শব্দের দুটি তালিকার মধ্যে কোনটি ছোট smaller আপনার "ভারবোটেন" তালিকায় 2000 শব্দ রয়েছে এবং সর্বাধিক ব্যবহারকারীর জমা দেওয়ার কথা 500 শব্দ রয়েছে। সেক্ষেত্রে আপনি ব্যবহারকারীর জমা দেওয়ার শব্দের তালিকাটি পুনরাবৃত্তি করবেন এবং নিষিদ্ধ শব্দের তালিকায় এবং একে বিপরীতে একে একে সন্ধান করবেন।

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

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