Apache Lucene একটি জনপ্রিয় ওপেন সোর্স লাইব্রেরি যা মূলত Full-text search এবং Indexing প্রক্রিয়া সম্পাদন করতে ব্যবহৃত হয়। Lucene কে টেক্সট ডেটা ইন্ডেক্স এবং সেগুলোর মধ্যে দ্রুত সার্চ করতে ব্যবহার করা হয়। Analyzer এবং Tokenizer Lucene এর গুরুত্বপূর্ণ অংশ, কারণ তারা ডেটাকে প্রক্রিয়া করে এবং এটি অনুসন্ধানযোগ্য করে তোলে।
এই টিউটোরিয়ালে, আমরা Lucene এ Analyzer এবং Tokenizer এর ভূমিকা এবং কাজের ধাপগুলি আলোচনা করব।
১. Analyzer: Overview
Analyzer হল একটি গুরুত্বপূর্ণ উপাদান যা Lucene ইনডেক্সিং এবং সার্চিং প্রক্রিয়ায় ব্যবহৃত হয়। এটি একটি টেক্সটের সিএমও (সাধারণত প্রবন্ধ) প্রক্রিয়া করে যাতে লুসিন অনুসন্ধান কার্যকরভাবে কাজ করতে পারে। একটি Analyzer সাধারণত একটি বা একাধিক Tokenizer এবং TokenFilter ব্যবহার করে।
Analyzer এর কাজ:
- Tokenization: টেক্সটকে ছোট ছোট অংশ বা tokens এ ভেঙে ফেলা।
- Filtering: টোকেনগুলি ছেঁকে ফেলা, যেমন স্টপওয়ার্ড (stop words) বা অনুত্তীর্ণ শব্দ মুছে ফেলা।
- Stemming: শব্দের মূলরূপ বের করা (যেমন, "running" থেকে "run")।
Analyzer এর উদাহরণ:
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
public class AnalyzerExample {
public static void main(String[] args) {
// StandardAnalyzer তৈরি করা
Analyzer analyzer = new StandardAnalyzer();
System.out.println("Analyzer created: " + analyzer);
}
}
এখানে, StandardAnalyzer একটি পূর্বনির্ধারিত Analyzer যা Lucene এর মধ্যে সাধারণ ব্যবহারের জন্য তৈরি করা হয়েছে। এটি ইংরেজি টেক্সটের জন্য উপযুক্ত, কারণ এটি স্টপওয়ার্ডগুলি ফিল্টার করে এবং শব্দগুলোকে স্টেম করে।
২. Tokenizer: Overview
Tokenizer হল একটি উপাদান যা Analyzer এর মধ্যে ব্যবহৃত হয়। এটি একটি প্রক্রিয়া যা ইনপুট টেক্সটকে টোকেন বা শব্দের ছোট ছোট ইউনিটে ভেঙে ফেলে। টোকেনাইজার প্রক্রিয়ার মাধ্যমে Lucene সহজে টেক্সট ইন্ডেক্সিং এবং সার্চিং কার্যকরীভাবে সম্পন্ন করতে পারে।
Tokenizer এর কাজ:
- Text to Tokens: টেক্সটের প্রতিটি শব্দ বা ইউনিটকে আলাদা করে।
- Whitespace Tokenizer: স্পেস বা ওয়াইটস্পেসের মাধ্যমে টেক্সটকে বিভক্ত করা হয়।
Tokenizer এর উদাহরণ:
import org.apache.lucene.analysis.Tokenizer;
import org.apache.lucene.analysis.standard.StandardTokenizer;
import java.io.StringReader;
public class TokenizerExample {
public static void main(String[] args) throws Exception {
String text = "Lucene is an open source search library.";
// StandardTokenizer তৈরি করা
Tokenizer tokenizer = new StandardTokenizer();
tokenizer.setReader(new StringReader(text));
// টোকেন বের করা
tokenizer.reset();
while (tokenizer.incrementToken()) {
System.out.println(tokenizer.toString());
}
}
}
এখানে, StandardTokenizer ব্যবহার করা হয়েছে, যা স্পেস এবং পাঙ্কচুয়েশন চিহ্ন দ্বারা টেক্সটটি টোকেনে বিভক্ত করে।
৩. Lucene এ বিভিন্ন Analyzer এবং Tokenizer
Lucene অনেক ধরনের Analyzer এবং Tokenizer সরবরাহ করে, যার মধ্যে কিছু জনপ্রিয় হল:
৩.১ StandardAnalyzer
StandardAnalyzer হল একটি খুবই সাধারণ এবং মৌলিক analyzer, যা শব্দগুলি বের করে এবং সাধারণ স্টপওয়ার্ড সরিয়ে ফেলে।
Analyzer analyzer = new StandardAnalyzer();
৩.২ SimpleAnalyzer
SimpleAnalyzer একটি সহজ analyzer যা কেবলমাত্র ইংরেজি অক্ষরগুলিকে মেনে চলে এবং অন্যান্য ক্যারেক্টারগুলিকে উপেক্ষা করে। এটি খুবই সরল এবং দ্রুত।
Analyzer analyzer = new SimpleAnalyzer();
৩.৩ WhitespaceAnalyzer
WhitespaceAnalyzer শুধুমাত্র whitespace (স্পেস) দিয়ে শব্দ ভাগ করে এবং অন্যান্য কোনো ফিল্টার প্রক্রিয়া প্রয়োগ করে না।
Analyzer analyzer = new WhitespaceAnalyzer();
৩.৪ KeywordAnalyzer
KeywordAnalyzer একটি বিশেষ ধরনের analyzer যা সব শব্দকে একক টোকেন হিসেবে ধরে এবং কোনো ফিল্টার বা পরিবর্তন প্রক্রিয়া প্রযোজ্য নয়।
Analyzer analyzer = new KeywordAnalyzer();
৪. Lucene Analyzer and Tokenizer এর মধ্যে পার্থক্য
- Analyzer: একটি বৃহত্তর ধারণা যা টোকেনাইজেশন এবং ফিল্টারিংসহ সমস্ত প্রক্রিয়া নির্ধারণ করে। এটি টোকেনাইজার এবং টোকেন ফিল্টার অন্তর্ভুক্ত করে।
- Tokenizer: একটি ছোট অংশ যা text কে টোকেনে ভেঙে ফেলে। এটি Analyzer এর অংশ হিসেবে কাজ করে এবং একাধিক টোকেন ফিল্টার ব্যবহার করতে পারে।
৫. Custom Analyzer and Tokenizer
Lucene আপনাকে নিজস্ব Analyzer এবং Tokenizer তৈরি করার সুযোগ দেয়। এটি ব্যবহারকারীদের তাদের প্রোজেক্টে নির্দিষ্ট শব্দ প্রক্রিয়াকরণ এবং ফিল্টারিং কৌশল প্রয়োগ করতে সাহায্য করে।
Custom Tokenizer Example:
import org.apache.lucene.analysis.Tokenizer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import java.io.IOException;
import java.io.Reader;
public class CustomTokenizer extends Tokenizer {
private final CharTermAttribute termAttr = addAttribute(CharTermAttribute.class);
public CustomTokenizer(Reader input) {
super(input);
}
@Override
public boolean incrementToken() throws IOException {
clearAttributes();
int c = input.read();
if (c == -1) {
return false;
}
termAttr.append((char) c);
return true;
}
}
এখানে, CustomTokenizer একটি নিজস্ব টোকেনাইজার তৈরি করা হয়েছে যা প্রতিটি চরিত্রকে আলাদা টোকেন হিসেবে ধরা হয়।
সারাংশ
Lucene এ Analyzer এবং Tokenizer খুবই গুরুত্বপূর্ণ উপাদান। Analyzer একটি বৃহত্তর কনসেপ্ট যা টোকেনাইজেশন এবং ফিল্টারিং নিয়ে কাজ করে, এবং Tokenizer শুধুমাত্র টেক্সটকে টোকেনে ভাগ করার জন্য ব্যবহৃত হয়। Lucene আপনাকে বিভিন্ন ধরনের টোকেনাইজার এবং অ্যানালাইজার সরবরাহ করে, যার মধ্যে আপনি আপনার প্রয়োজন অনুসারে সঠিকটি বেছে নিতে পারেন। এছাড়াও, কাস্টম Tokenizer এবং Analyzer তৈরি করাও সম্ভব, যা আপনার বিশেষ চাহিদা অনুযায়ী কাজ করবে।
Apache Lucene হল একটি শক্তিশালী ওপেন সোর্স সার্চ লাইব্রেরি যা ডেটা ইনডেক্সিং এবং অনুসন্ধানের জন্য ব্যবহৃত হয়। এটি মূলত টেক্সট ডেটা অনুসন্ধান এবং বিশ্লেষণ করতে ব্যবহৃত হয়, এবং বিভিন্ন ধরনের অনুসন্ধান অ্যাপ্লিকেশন তৈরি করতে সহায়তা করে। Analyzer হল Lucene-এর একটি মৌলিক উপাদান, যা ডেটা ইনডেক্স করার সময় টেক্সট প্রক্রিয়া এবং অনুসন্ধানের জন্য বিভিন্ন বিশ্লেষণ পদ্ধতি প্রয়োগ করে।
এটি টেক্সট ডেটার মধ্যে থেকে অপ্রয়োজনীয় তথ্য সরিয়ে ফেলে এবং অনুসন্ধানের জন্য টেক্সটকে সঠিকভাবে প্রক্রিয়া করে। Analyzer বিভিন্ন Tokenization এবং Filtering প্রক্রিয়া ব্যবহার করে, যাতে সঠিকভাবে অনুসন্ধান ফলাফল পাওয়া যায়।
১. Analyzer এর ভূমিকা
Lucene এ Analyzer প্রধানত দুটি গুরুত্বপূর্ণ কাজ সম্পন্ন করে:
- Tokenization: এটি ইনপুট টেক্সটকে ছোট ছোট অংশে ভাগ করে (যেমন শব্দ বা ফ্রেজ) যাতে সেগুলি আরও সহজে বিশ্লেষণ এবং অনুসন্ধান করা যায়।
- Filtering: এটি টোকেনগুলো থেকে অপ্রয়োজনীয় অংশ (যেমন স্টপ-ওয়ার্ড বা পাংচুয়েশন) সরিয়ে ফেলে, যাতে অনুসন্ধান আরো সঠিক এবং কার্যকরী হয়।
২. Analyzer কিভাবে কাজ করে?
Lucene এ একটি Analyzer সাধারণত Tokenizer এবং Filter দিয়ে গঠিত। এখানে প্রথমে টেক্সটকে tokens এ বিভক্ত করা হয় এবং তারপর সেগুলোর উপর কিছু filtering অপারেশন চালানো হয়। বিভিন্ন ধরনের Analyzer থাকে, যেমন:
- StandardAnalyzer
- WhitespaceAnalyzer
- KeywordAnalyzer
- StopAnalyzer
- CustomAnalyzer
এগুলি টেক্সট ইনডেক্সিং এবং অনুসন্ধান প্রক্রিয়ায় ব্যবহার করা হয়।
উদাহরণ:
যদি আমাদের একটি সাধারণ টেক্সট "Lucene is an amazing search library!" থাকে, তাহলে StandardAnalyzer এটি এরকম ভাবে প্রক্রিয়া করবে:
- Tokenization:
- Tokenized into:
Lucene,is,an,amazing,search,library
- Tokenized into:
- Filtering:
- Stop words like "is" and "an" may be removed, and the result may be:
Lucene,amazing,search,library
- Stop words like "is" and "an" may be removed, and the result may be:
এই প্রক্রিয়ায়, Analyzer অনুসন্ধানের জন্য সঠিক টোকেনগুলো ব্যবহার করে এবং টেক্সটের অপ্রয়োজনীয় অংশ সরিয়ে দেয়।
৩. Lucene এর মধ্যে Analyzer এর বিভিন্ন ধরন
৩.১ StandardAnalyzer
এটি Lucene এর একটি সাধারণ এবং সর্বাধিক ব্যবহৃত Analyzer। এটি সাধারণভাবে টোকেনাইজেশন, স্টপ-ওয়ার্ড ফিল্টারিং এবং স্টেমিং সাপোর্ট করে। এটি সমস্ত ধরনের সাধারণ ভাষায় অনুসন্ধান ইন্ডেক্সিং করতে সাহায্য করে।
Analyzer analyzer = new StandardAnalyzer();
৩.২ WhitespaceAnalyzer
এই Analyzer শুধুমাত্র সাদা স্পেস দ্বারা টোকেন বিভক্ত করে, অর্থাৎ এটি অন্যান্য কোন ফিল্টারিং বা স্টপ-ওয়ার্ড রিমুভাল সাপোর্ট করে না।
Analyzer analyzer = new WhitespaceAnalyzer();
৩.৩ KeywordAnalyzer
এই Analyzer টেক্সটকে একটি সম্পূর্ণ শব্দ হিসেবে গ্রহণ করে এবং কোন টোকেনাইজেশন বা ফিল্টারিং প্রয়োগ করে না। এটি নির্দিষ্ট কিছু বিশেষ শব্দের জন্য ব্যবহার করা হয় যেখানে আপনি একটি শব্দকে একক ইউনিট হিসেবে রাখতে চান।
Analyzer analyzer = new KeywordAnalyzer();
৩.৪ StopAnalyzer
এটি বিশেষভাবে stop-words যেমন "the", "is", "and" ইত্যাদি সরাতে ব্যবহার হয়। এটি সাধারণত সাধারণ শব্দগুলো বাদ দেয় যা অনুসন্ধান প্রক্রিয়ায় অপ্রয়োজনীয়।
Analyzer analyzer = new StopAnalyzer();
৩.৫ CustomAnalyzer
আপনি যদি নিজস্ব প্রয়োজনে Analyzer তৈরি করতে চান, তবে CustomAnalyzer তৈরি করা যায় যেখানে আপনি টোকেনাইজেশন এবং ফিল্টারিং পদ্ধতি কাস্টমাইজ করতে পারেন।
Analyzer analyzer = new CustomAnalyzer();
৪. Analyzer এর মাধ্যমে Indexing এবং Searching
Indexing এবং Searching দুই ক্ষেত্রেই Analyzer ব্যবহৃত হয়। ইনডেক্স করার সময়, Analyzer ডেটার মধ্যে থেকে টোকেন তৈরি করে এবং সেগুলিকে ইনডেক্সে যুক্ত করে, এবং অনুসন্ধানের সময়, Analyzer অনুসন্ধান ক্যোয়ারিকে সঠিক টোকেনে রূপান্তর করে এবং সেগুলির সাথে ইনডেক্সের তুলনা করে।
Indexing Example:
Analyzer analyzer = new StandardAnalyzer();
IndexWriterConfig config = new IndexWriterConfig(analyzer);
IndexWriter writer = new IndexWriter(directory, config);
Document doc = new Document();
doc.add(new TextField("content", "Lucene is a search engine library", Field.Store.YES));
writer.addDocument(doc);
writer.close();
এখানে, StandardAnalyzer টেক্সট Lucene is a search engine library কে টোকেনাইজ করবে এবং ইনডেক্সে যোগ করবে।
Searching Example:
Analyzer analyzer = new StandardAnalyzer();
IndexReader reader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(reader);
QueryParser parser = new QueryParser("content", analyzer);
Query query = parser.parse("search library");
TopDocs results = searcher.search(query, 10);
এখানে, StandardAnalyzer ব্যবহার করে search library ক্যোয়ারি টোকেনাইজ করা হবে এবং ইনডেক্সের মধ্যে অনুসন্ধান করা হবে।
৫. Analyzer এর কাজের উপকারিতা
- Text Normalization: Analyzer টেক্সটকে একটি নির্দিষ্ট ফর্ম্যাটে রূপান্তর করতে সহায়তা করে, যাতে এটি অনুসন্ধান এবং ইনডেক্সের জন্য প্রস্তুত হয়।
- Efficient Searching: এটি ডেটার মধ্যে সঠিক টোকেন বের করে এবং অপ্রয়োজনীয় তথ্য সরিয়ে দেয়, যার ফলে অনুসন্ধান আরও দ্রুত হয়।
- Flexibility: আপনি নিজের প্রয়োজন অনুসারে কাস্টম analyzer তৈরি করতে পারেন এবং বিভিন্ন টোকেনাইজেশন এবং ফিল্টারিং পদ্ধতি প্রয়োগ করতে পারেন।
সারাংশ
Analyzer Lucene এর একটি গুরুত্বপূর্ণ উপাদান, যা টেক্সট ডেটাকে প্রক্রিয়া এবং বিশ্লেষণ করতে সহায়তা করে। এটি Tokenization এবং Filtering এর মাধ্যমে ইনডেক্সিং এবং অনুসন্ধান প্রক্রিয়াকে দক্ষ করে তোলে। Lucene তে বিভিন্ন ধরনের Analyzer রয়েছে, যা বিভিন্ন টোকেনাইজেশন এবং ফিল্টারিং পদ্ধতি প্রয়োগ করে। StandardAnalyzer, WhitespaceAnalyzer, KeywordAnalyzer এবং CustomAnalyzer এর মতো বিভিন্ন ধরনের Analyzer আপনি ব্যবহার করতে পারেন যাতে আপনার অনুসন্ধান প্রক্রিয়া আরও কার্যকরী এবং সঠিক হয়।
Lucene একটি শক্তিশালী ওপেন সোর্স ফুল-টেক্সট সূচক (index) এবং অনুসন্ধান (search) লাইব্রেরি যা Java প্রোগ্রামিং ভাষায় তৈরি করা হয়েছে। এটি ডেটাবেস বা অন্য কোনো তথ্যের মধ্যে ফাস্ট এবং দক্ষ অনুসন্ধান করতে ব্যবহৃত হয়। Analyzers হল এমন উপাদান যা Lucene সূচক তৈরি এবং অনুসন্ধান প্রক্রিয়ায় ব্যবহৃত টেক্সট ডেটার প্রিপ্রসেসিং (প্রসেসিং) সম্পাদন করে। বিভিন্ন ধরনের Analyzer ব্যবহার করে আপনি আপনার সূচক এবং অনুসন্ধান পদ্ধতিকে কাস্টমাইজ করতে পারেন।
এখানে আমরা Lucene এর StandardAnalyzer, WhitespaceAnalyzer, এবং Custom Analyzer এর ব্যবহার এবং তাদের পার্থক্য নিয়ে আলোচনা করব।
১. StandardAnalyzer
StandardAnalyzer Lucene-এ সবচেয়ে সাধারণ এবং ব্যবহৃত অ্যানালাইজার। এটি সাধারণ টেক্সট প্রক্রিয়াজাতকরণের জন্য তৈরি করা হয়েছে এবং শব্দ বিভাজন (tokenization), স্টপওয়ার্ড রিমুভাল, এবং শব্দগুলির স্নোফ্লেকিং (stemming) পরিচালনা করে।
StandardAnalyzer কাজের পদ্ধতি:
- Tokenization: এটি টেক্সট ডেটাকে ছোট ছোট টোকেন বা শব্দে বিভক্ত করে।
- Stop-words removal: এটি এমন কিছু সাধারণ শব্দ, যেমন "the", "is", "in", ইত্যাদি, যা সাধারণত অনুসন্ধানে অতিরিক্ত কিছু যোগ করে না, তা সরিয়ে দেয়।
- Lowercasing: সমস্ত শব্দকে ছোট হাতের অক্ষরে রূপান্তরিত করা হয়।
- Stemming: এটি শব্দের মূল রূপে রূপান্তরিত করে, যেমন "running" কে "run"-এ রূপান্তরিত করা হয়।
StandardAnalyzer ব্যবহার উদাহরণ:
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.RAMDirectory;
public class StandardAnalyzerExample {
public static void main(String[] args) throws Exception {
Analyzer analyzer = new StandardAnalyzer();
RAMDirectory index = new RAMDirectory();
IndexWriter writer = new IndexWriter(index, new IndexWriterConfig(analyzer));
Document doc = new Document();
doc.add(new TextField("content", "Lucene is an amazing library for searching", Field.Store.YES));
writer.addDocument(doc);
writer.close();
}
}
এখানে, StandardAnalyzer ব্যবহৃত হয়েছে এবং এটি ডকুমেন্টের মধ্যে টেক্সট ইনডেক্স করবে।
২. WhitespaceAnalyzer
WhitespaceAnalyzer একটি সহজ এবং মৌলিক অ্যানালাইজার যা কেবলমাত্র সাদা স্থান (whitespace) এর মাধ্যমে শব্দ বিভাজন করে। এর মানে হল যে, এটি কোনো স্টপওয়ার্ড সরানো বা স্নোফ্লেকিং করার মতো অন্যান্য প্রক্রিয়া সম্পাদন করে না। এটি সাধারণত তখন ব্যবহার করা হয় যখন আপনি শুধুমাত্র শব্দ বিভাজন করতে চান এবং কোনো অতিরিক্ত প্রক্রিয়া প্রয়োগ করতে চান না।
WhitespaceAnalyzer কাজের পদ্ধতি:
- Tokenization: শুধুমাত্র সাদা স্থান বা স্পেস দ্বারা শব্দ বিভাজন করা হয়, কোনও স্টপওয়ার্ড বা স্নোফ্লেকিং প্রক্রিয়া চালানো হয় না।
WhitespaceAnalyzer ব্যবহার উদাহরণ:
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.whitespace.WhitespaceAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.RAMDirectory;
public class WhitespaceAnalyzerExample {
public static void main(String[] args) throws Exception {
Analyzer analyzer = new WhitespaceAnalyzer();
RAMDirectory index = new RAMDirectory();
IndexWriter writer = new IndexWriter(index, new IndexWriterConfig(analyzer));
Document doc = new Document();
doc.add(new TextField("content", "Lucene is great", Field.Store.YES));
writer.addDocument(doc);
writer.close();
}
}
এখানে, WhitespaceAnalyzer ব্যবহার করা হয়েছে যেখানে শুধুমাত্র সাদা স্থান দিয়ে শব্দ বিভাজন করা হয়েছে, অন্য কোনো প্রক্রিয়া করা হয়নি।
৩. Custom Analyzer
কিছু ক্ষেত্রে, আপনার টেক্সট প্রক্রিয়াজাতকরণের জন্য একটি কাস্টম অ্যানালাইজারের প্রয়োজন হতে পারে, যেখানে আপনি Tokenization, Stop-words removal, এবং Stemming এর মত কিছু কাস্টম প্রক্রিয়া প্রয়োগ করতে পারেন। Custom Analyzer তৈরি করতে, আপনি Lucene-এর বিভিন্ন অ্যানালাইজার এবং টোকেনフィল্ট ব্যবহার করতে পারেন।
Custom Analyzer কাজের পদ্ধতি:
- Custom Tokenization: কাস্টম টোকেনাইজেশন প্যাটার্ন ব্যবহার করে টোকেন গুলি বিভাজন করা।
- Stop-words removal: আপনার প্রয়োজন অনুযায়ী স্টপ-ওয়ার্ড তালিকা তৈরি করা।
- Stemming or Lemmatization: কাস্টম শব্দের স্নোফ্লেকিং বা লেম্যাটাইজেশন।
Custom Analyzer উদাহরণ:
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.core.WhitespaceTokenizer;
import org.apache.lucene.analysis.StopwordAnalyzerBase;
import org.apache.lucene.analysis.util.CharArraySet;
import org.apache.lucene.analysis.TokenStream;
import java.io.IOException;
public class CustomAnalyzer extends Analyzer {
private CharArraySet stopWords;
public CustomAnalyzer() {
// Custom stopwords
stopWords = new CharArraySet(3, true);
stopWords.add("the");
stopWords.add("is");
stopWords.add("an");
}
@Override
protected TokenStreamComponents createComponents(String fieldName) {
WhitespaceTokenizer source = new WhitespaceTokenizer();
TokenStream filter = new StopFilter(source, stopWords); // Stopword filter
return new TokenStreamComponents(source, filter);
}
public static void main(String[] args) throws IOException {
CustomAnalyzer analyzer = new CustomAnalyzer();
TokenStream tokenStream = analyzer.tokenStream("content", "Lucene is an amazing search library");
tokenStream.reset();
while (tokenStream.incrementToken()) {
CharTermAttribute term = tokenStream.getAttribute(CharTermAttribute.class);
System.out.println(term.toString());
}
}
}
এখানে, CustomAnalyzer তৈরি করা হয়েছে যেখানে আমরা কাস্টম স্টপওয়ার্ড এবং সাদা স্থান দ্বারা টোকেন বিভাজন ব্যবহার করেছি।
৪. StandardAnalyzer, WhitespaceAnalyzer, এবং Custom Analyzer এর পার্থক্য
| Feature | StandardAnalyzer | WhitespaceAnalyzer | Custom Analyzer |
|---|---|---|---|
| Tokenization | Spacing, punctuation, and special characters used | Only spaces used to split tokens | Custom logic based on user needs |
| Stop Words Removal | Yes, uses predefined stop-words list | No | Can be customized to remove user-defined words |
| Stemming | Yes, uses built-in stemming logic | No | Can be customized for stemming or lemmatization |
| Use Case | General purpose analysis | Simple tokenization for space-separated text | Highly flexible and customizable for specific needs |
সারাংশ
Lucene এ Analyzers গুরুত্বপূর্ণ ভূমিকা পালন করে। এটি টেক্সট প্রক্রিয়াজাতকরণ করে, যেমন শব্দ বিভাজন, স্টপওয়ার্ড সরানো, স্নোফ্লেকিং ইত্যাদি, যা অনুসন্ধান এবং সূচক প্রক্রিয়াকে আরও কার্যকরী এবং দ্রুত করে তোলে। StandardAnalyzer একটি সাধারণ, বহুল ব্যবহৃত অ্যানালাইজার, WhitespaceAnalyzer খুব সহজ এবং সাদামাটা, এবং Custom Analyzer আপনাকে কাস্টম টোকেনাইজেশন এবং অন্যান্য প্রক্রিয়া তৈরি করতে সহায়তা করে। আপনার প্রোজেক্টের প্রয়োজন অনুযায়ী সঠিক অ্যানালাইজার নির্বাচন করা গুরুত্বপূর্ণ।
Lucene হল একটি ওপেন সোর্স লাইব্রেরি যা টেক্সট ইনডেক্সিং এবং অনুসন্ধান (searching) করার জন্য ব্যবহৃত হয়। এটি Java ভিত্তিক এবং মূলত full-text search ফিচার প্রদান করে। লুসিনের মাধ্যমে ডকুমেন্টের মধ্যে তথ্য অনুসন্ধান এবং সেগুলিকে সঠিকভাবে ইনডেক্স করা সম্ভব হয়। লুসিনের কাজের ক্ষেত্রে tokenization অত্যন্ত গুরুত্বপূর্ণ একটি প্রক্রিয়া, যেখানে টেক্সটকে ছোট ছোট ইউনিট বা tokens এ বিভক্ত করা হয়, যাতে সেগুলো অনুসন্ধানের জন্য ব্যবহার করা যায়।
এই টিউটোরিয়ালে, আমরা Tokenizer সম্পর্কে বিস্তারিত জানব এবং দেখব এর কাজ কিভাবে লুসিনের কার্যক্রমে সহায়তা করে।
১. Tokenizer এর পরিচিতি
Tokenizer হল একটি উপাদান যা একটি টেক্সট স্ট্রিংকে ছোট ছোট ইউনিট বা tokens এ বিভক্ত করে। একে সহজ ভাষায় বলতে গেলে, Tokenizer হল সেই প্রক্রিয়া যা একটি ডকুমেন্ট বা স্ট্রিংকে বিচ্ছিন্ন অংশে (যেমন শব্দ, সংখ্যা বা অন্য কিছু) পরিণত করে। এর ফলে, টেক্সট অনুসন্ধান এবং ইনডেক্সিং আরও কার্যকরভাবে করা যায়।
২. Tokenizer এর কাজ
একটি Tokenizer লুসিনে একটি ডকুমেন্ট বা স্ট্রিংকে একাধিক tokens বা ছোট অংশে ভেঙে ফেলে। এই টোকেনগুলি পরে index এর মধ্যে সংরক্ষিত হয়। যখন অনুসন্ধান করা হয়, তখন এই টোকেনগুলির উপর ভিত্তি করে দ্রুত সার্চ অপারেশন চালানো যায়।
Tokenization এর প্রধান কাজ:
- Text to Tokens: একটি বড় টেক্সট স্ট্রিংকে ছোট ছোট শব্দ বা টোকেনে ভেঙে ফেলা হয়, যা পরবর্তীতে অনুসন্ধান এবং ইনডেক্সিংয়ের জন্য ব্যবহৃত হয়।
- Removal of Stop Words: সাধারণত, কিছু শব্দ (যেমন: "the", "is", "and") যেগুলির মান অনুসন্ধানে খুব কম, সেগুলোকে বাদ দেওয়া হয়। এই ধরনের শব্দকে stop words বলা হয়।
- Normalization: টোকেনগুলিকে সাধারিত বা normalized করা হয়, যাতে ইনডেক্সিং এবং অনুসন্ধান সহজ হয়। যেমন, ছোট হাতের অক্ষরে রূপান্তর করা বা একক রূপে নিয়া আসা।
- Stemming: শব্দের মূল রূপ (stem) বের করার জন্য, যেমন running, ran বা runner এর সবগুলোর জন্য একটি মূল রূপ run হয়ে যায়।
৩. Lucene তে Tokenizer কিভাবে কাজ করে
Lucene তে Tokenizer একটি গুরুত্বপূর্ণ অংশ, যেহেতু এটি যেভাবে টেক্সটকে ছোট ছোট ইউনিটে ভেঙে ফেলে, তার উপরই ইনডেক্সিং এবং অনুসন্ধান নির্ভর করে।
উদাহরণ: Basic Tokenizer
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
public class TokenizerExample {
public static void main(String[] args) throws Exception {
String text = "Lucene is a high-performance text search engine library";
Analyzer analyzer = new StandardAnalyzer();
TokenStream tokenStream = analyzer.tokenStream("content", text);
tokenStream.reset();
while (tokenStream.incrementToken()) {
CharTermAttribute charTermAttribute = tokenStream.getAttribute(CharTermAttribute.class);
System.out.println(charTermAttribute.toString());
}
tokenStream.end();
tokenStream.close();
}
}
এই কোডে:
- StandardAnalyzer ব্যবহার করা হয়েছে, যা একটি ধরনের Tokenizer যা সাধারণ টেক্সট স্ট্রিংকে টোকেনে বিভক্ত করে।
tokenStream.incrementToken()মেথডটি টোকেনগুলির উপর লুপ চালায় এবং প্রত্যেকটি টোকেনকে CharTermAttribute মাধ্যমে আউটপুট করে।
আউটপুট:
lucene
high
performance
text
search
engine
library
এখানে, Lucene একটি টেক্সট স্ট্রিংকে ছোট ছোট শব্দে ভেঙে ফেলেছে, এবং ইনডেক্স করার জন্য এগুলিকে ব্যবহার করা যাবে।
৪. Lucene এ Tokenizer এর প্রকারভেদ
Lucene-এ বিভিন্ন ধরনের Tokenizer এবং Analyzer ক্লাস রয়েছে, যেগুলি বিভিন্ন ধরনের টেক্সট প্রক্রিয়া (টোকেনাইজেশন, স্টপওয়ার্ড ফিল্টারিং, স্টেমিং) সম্পাদন করে। কিছু সাধারণ Tokenizer হল:
- StandardTokenizer: এটি সাধারণত স্ট্যান্ডার্ড টেক্সট টোকেনাইজেশন জন্য ব্যবহৃত হয়।
- WhitespaceTokenizer: এটি শুধুমাত্র সাদা স্পেস (space) দ্বারা টেক্সটকে ভাগ করে।
- KeywordTokenizer: এটি পুরো স্ট্রিংটিকে একটি টোকেনে পরিণত করে, অর্থাৎ পুরো টেক্সটকেই একক টোকেন হিসেবে নেয়।
- LowerCaseTokenizer: এটি টোকেনগুলিকে ছোট হাতের অক্ষরে রূপান্তরিত করে।
উদাহরণ: WhitespaceTokenizer
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.tokenizer.WhitespaceTokenizer;
import java.io.StringReader;
public class WhitespaceTokenizerExample {
public static void main(String[] args) throws Exception {
String text = "Lucene is powerful for search";
WhitespaceTokenizer tokenizer = new WhitespaceTokenizer();
tokenizer.setReader(new StringReader(text));
tokenizer.reset();
while (tokenizer.incrementToken()) {
CharTermAttribute term = tokenizer.getAttribute(CharTermAttribute.class);
System.out.println(term.toString());
}
tokenizer.end();
tokenizer.close();
}
}
আউটপুট:
Lucene
is
powerful
for
search
এখানে, WhitespaceTokenizer স্পেস অনুযায়ী টেক্সটকে টোকেনে ভাগ করেছে।
৫. Tokenizer এবং Analyzer এর মধ্যে পার্থক্য
- Tokenizer: এটি শুধুমাত্র টেক্সট স্ট্রিংকে ছোট ছোট টোকেনগুলোতে ভাগ করে।
- Analyzer: এটি টোকেনাইজেশন সহ অন্যান্য কাজ করে যেমন স্টপওয়ার্ড ফিল্টারিং, স্টেমিং এবং নর্মালাইজেশন। Analyzer একাধিক Tokenizers এবং TokenFilters ব্যবহার করতে পারে।
উদাহরণ: StandardAnalyzer (Tokenizer + Filter)
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
public class AnalyzerExample {
public static void main(String[] args) throws Exception {
String text = "Lucene is a high-performance search engine library";
Analyzer analyzer = new StandardAnalyzer();
try (TokenStream tokenStream = analyzer.tokenStream("content", text)) {
tokenStream.reset();
while (tokenStream.incrementToken()) {
CharTermAttribute charTermAttribute = tokenStream.getAttribute(CharTermAttribute.class);
System.out.println(charTermAttribute.toString());
}
}
}
}
আউটপুট:
lucene
high
performance
search
engine
library
এখানে, StandardAnalyzer টোকেনাইজেশন, স্টপওয়ার্ড ফিল্টারিং এবং সাধারণ ইনডেক্সিং ফিল্টারিং প্রক্রিয়া সম্পন্ন করেছে।
সারাংশ
Lucene তে Tokenizer হল একটি গুরুত্বপূর্ণ অংশ যা টেক্সটকে ছোট ছোট ইউনিট (টোকেন) এ ভাগ করে। এটি ডকুমেন্টের অংশ বা শব্দসমূহকে আলাদা করতে সাহায্য করে, যার মাধ্যমে দ্রুত এবং কার্যকরী অনুসন্ধান করা সম্ভব হয়। Tokenizer এর মাধ্যমে টেক্সটকে যেভাবে ভেঙে ফেলা হয়, তার উপর ভিত্তি করে অনুসন্ধান এবং ইনডেক্সিং কার্যক্রম দ্রুত হয়। Lucene তে বিভিন্ন ধরনের Tokenizer এবং Analyzer রয়েছে, যা বিভিন্ন ধরনের টোকেনাইজেশন এবং টেক্সট ফিল্টারিং কাজ করতে সক্ষম।
Apache Lucene একটি শক্তিশালী ওপেন সোর্স লাইব্রেরি যা টেক্সট ইনডেক্সিং এবং স্চার্চিংয়ের জন্য ব্যবহৃত হয়। এটি ডকুমেন্ট ইনডেক্সিংয়ের মাধ্যমে দ্রুত সার্চের সক্ষমতা প্রদান করে। Custom Analyzer এবং Tokenizer তৈরি করে আপনি কাস্টমাইজড সেচার বা ইনডেক্সিং পদ্ধতি তৈরি করতে পারেন যা আপনার প্রোজেক্টের জন্য উপযুক্ত।
এই টিউটোরিয়ালে, আমরা দেখব কীভাবে Custom Analyzer এবং Tokenizer তৈরি করা যায় এবং Lucene এর মাধ্যমে টেক্সট প্রোসেসিং কাস্টমাইজ করা যায়।
১. Lucene Analyzer এবং Tokenizer এর ভূমিকা
Analyzer এবং Tokenizer Lucene এর টেক্সট প্রোসেসিং এর প্রধান উপাদান।
- Analyzer: এটি একটি ক্লাস যা টেক্সট ডকুমেন্ট প্রক্রিয়া করার জন্য ব্যবহৃত হয়, এবং এটি ডকুমেন্টের টোকেন (বিশেষ শব্দ বা ক্যারেক্টারস) তৈরি করতে একটি Tokenizer এবং Filter এর সমন্বয়ে কাজ করে।
- Tokenizer: এটি মূলত টেক্সট স্ট্রিংকে একাধিক টোকেনে বিভক্ত করে।
আপনি যখন Custom Analyzer এবং Tokenizer তৈরি করেন, তখন আপনি টেক্সটের প্রক্রিয়াকরণ নিয়ন্ত্রণ করতে পারেন, যেমন শব্দ বিভাজন, স্টপওয়ার্ডস (stopwords) ফিল্টার, লেমাটাইজেশন বা স্টেমিং (stemming) ইত্যাদি।
২. Custom Tokenizer তৈরি করা
Lucene-এ Custom Tokenizer তৈরি করতে হলে আপনাকে Tokenizer ক্লাসটি ব্যবহার করতে হবে, যা টেক্সট স্ট্রিংকে একাধিক টোকেনে বিভক্ত করে।
উদাহরণ: Custom Tokenizer তৈরি করা
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.Tokenizer;
import org.apache.lucene.util.AttributeFactory;
import java.io.IOException;
public class CustomTokenizer extends Tokenizer {
private final CharTermAttribute charTermAttr = addAttribute(CharTermAttribute.class);
public CustomTokenizer(AttributeFactory factory) {
super(factory);
}
@Override
public boolean incrementToken() throws IOException {
clearAttributes();
String inputText = this.input.readLine();
if (inputText == null) {
return false;
}
// Custom logic to split the input text based on spaces
String[] tokens = inputText.split(" ");
for (String token : tokens) {
charTermAttr.append(token);
}
return true;
}
}
এখানে, CustomTokenizer ক্লাসটি একটি টেক্সট স্ট্রিংকে স্পেসের উপর ভিত্তি করে টোকেনে বিভক্ত করে।
৩. Custom Analyzer তৈরি করা
Custom Analyzer তৈরি করতে আপনাকে Analyzer ক্লাসটি ব্যবহার করতে হবে, যা আপনার কাস্টম Tokenizer এবং TokenFilter কনফিগার করে।
উদাহরণ: Custom Analyzer তৈরি করা
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import java.io.IOException;
public class CustomAnalyzer extends Analyzer {
@Override
protected TokenStreamComponents createComponents(String fieldName) {
Tokenizer tokenizer = new CustomTokenizer();
return new TokenStreamComponents(tokenizer);
}
}
এখানে, CustomAnalyzer ক্লাসটি আমাদের CustomTokenizer কে ব্যবহার করে। আপনার কাস্টম টোকেনাইজারের মাধ্যমে সমস্ত ইনপুট টেক্সট প্রক্রিয়া করা হবে।
৪. Lucene Indexing এবং Searching Example
Lucene ব্যবহার করে কাস্টম Analyzer এবং Tokenizer দিয়ে ডকুমেন্ট ইনডেক্সিং এবং সার্চিং করা যেতে পারে।
উদাহরণ: Indexing করা
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.analysis.Analyzer;
import java.io.IOException;
public class LuceneIndexer {
public static void main(String[] args) throws IOException {
// Create a RAMDirectory to store the index in memory
RAMDirectory index = new RAMDirectory();
Analyzer analyzer = new CustomAnalyzer();
IndexWriterConfig config = new IndexWriterConfig(analyzer);
// Create IndexWriter
IndexWriter writer = new IndexWriter(index, config);
// Create a Document and add a field
Document doc = new Document();
doc.add(new TextField("content", "This is a custom text that will be indexed", Field.Store.YES));
// Add document to index
writer.addDocument(doc);
writer.close();
// Query the index to verify
DirectoryReader reader = DirectoryReader.open(index);
System.out.println("Index has " + reader.numDocs() + " document(s)");
reader.close();
}
}
এখানে, LuceneIndexer ক্লাসটি একটি ডকুমেন্ট ইনডেক্স করছে এবং ইনডেক্স করার জন্য CustomAnalyzer ব্যবহার করছে।
উদাহরণ: Searching করা
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.analysis.Analyzer;
public class LuceneSearcher {
public static void main(String[] args) throws Exception {
RAMDirectory index = new RAMDirectory();
Analyzer analyzer = new CustomAnalyzer();
// Set up the IndexWriter
IndexWriterConfig config = new IndexWriterConfig(analyzer);
IndexWriter writer = new IndexWriter(index, config);
// Create and index a document
Document doc = new Document();
doc.add(new TextField("content", "Custom Tokenizer Test", Field.Store.YES));
writer.addDocument(doc);
writer.close();
// Set up QueryParser
QueryParser parser = new QueryParser("content", analyzer);
Query query = parser.parse("Custom");
// Search the index
DirectoryReader reader = DirectoryReader.open(index);
IndexSearcher searcher = new IndexSearcher(reader);
int hits = searcher.search(query, 10).totalHits;
System.out.println("Total hits: " + hits);
reader.close();
}
}
এখানে, LuceneSearcher ক্লাসটি ইনডেক্স করা ডকুমেন্টে CustomAnalyzer ব্যবহার করে একটি কিওয়ারি সার্চ করছে এবং এর সাথে সংশ্লিষ্ট টোকেন খুঁজে পাচ্ছে।
৫. Custom Tokenizer এবং Analyzer এর ব্যবহার
Custom Tokenizer এবং Analyzer এর মাধ্যমে আপনি:
- টেক্সট থেকে কাস্টম টোকেন তৈরি করতে পারেন।
- টোকেন ফিল্টারিং বা প্রোসেসিং কাস্টমাইজ করতে পারেন।
- আপনার ইনডেক্সিং এবং সার্চিং প্রক্রিয়া আরও কার্যকরী এবং সঠিক করতে পারেন।
এটি বিশেষত দরকার হয় যখন আপনি বিশেষ ধরনের ডেটা (যেমন নম্বর, তারিখ, পণ্য কোড) বা স্টপওয়ার্ডস এবং স্পেশাল ক্যারেক্টার প্রক্রিয়া করতে চান।
সারাংশ
Lucene ব্যবহার করে Custom Tokenizer এবং Custom Analyzer তৈরি করা খুবই শক্তিশালী উপায় যার মাধ্যমে আপনি আপনার টেক্সট ডাটা প্রক্রিয়াকে কাস্টমাইজ করতে পারেন। এটি আপনাকে আপনার ইনডেক্সিং এবং সার্চিং প্রক্রিয়া আরও নির্ভুল এবং কার্যকরী করতে সহায়তা করবে। Lucene এর এই ক্ষমতা আপনাকে উন্নত এবং কাস্টম টেক্সট প্রোসেসিং সমাধান তৈরি করতে সহায়তা করে, যা আপনার সার্চ এবং ডেটা বিশ্লেষণ কার্যক্রমকে আরও উন্নত করে তোলে।
Read more