Apache Lucene একটি শক্তিশালী এবং জনপ্রিয় ওপেন-সোর্স লাইব্রেরি যা টেক্সট ডকুমেন্টে অনুসন্ধান (search) এবং ইনডেক্সিং (indexing) করতে ব্যবহৃত হয়। Lucene ডকুমেন্টগুলিকে ইনডেক্স করে এবং তারপরে এই ইনডেক্সের উপর বিভিন্ন ধরনের অনুসন্ধান কার্যক্রম চালাতে সক্ষম হয়। Custom Analyzer এবং Tokenizer হল দুটি গুরুত্বপূর্ণ কনফিগারেশন উপাদান যা আপনাকে আপনার ডেটা ইনডেক্স করার এবং অনুসন্ধান ফলাফল কার্যকরীভাবে পেতে সাহায্য করে।
এই টিউটোরিয়ালে, আমরা Lucene Custom Analyzer এবং Tokenizer এর ধারণা এবং উদাহরণ সহ আলোচনা করব।
১. Lucene তে Analyzer এবং Tokenizer এর ভূমিকা
Analyzer এবং Tokenizer একে অপরের সাথে সম্পর্কিত দুটি গুরুত্বপূর্ণ উপাদান যা Lucene তে টেক্সট প্রসেসিং এর জন্য ব্যবহৃত হয়।
- Analyzer: এটি একটি ক্লাস যা ইনডেক্সিং বা অনুসন্ধান প্রক্রিয়া চলাকালীন টেক্সটকে প্রস্তুত করতে ব্যবহৃত হয়। এটি টেক্সটকে টোকেন (token) বা শব্দের মধ্যে বিভক্ত করে এবং প্রক্রিয়ার জন্য একটি স্ট্রিম তৈরি করে। Analyzers সাধারণত Tokenizer এবং Filters এর সংমিশ্রণ হয়ে থাকে।
- Tokenizer: এটি একটি উপাদান যা ইনপুট স্ট্রিংকে টোকেন বা শব্দের মধ্যে বিভক্ত করে। সাধারণত, WhitespaceTokenizer, StandardTokenizer, বা KeywordTokenizer এর মতো বিভিন্ন ধরনের Tokenizer ব্যবহার করা হয়।
২. Lucene Custom Analyzer কিভাবে কাজ করে
Lucene তে Custom Analyzer তৈরি করা যেতে পারে যা আপনার ডেটার বৈশিষ্ট্য অনুযায়ী বিশেষ টোকেনাইজেশন, ফিল্টারিং এবং স্ট্রিং প্রসেসিং প্রয়োগ করতে সহায়তা করে।
Custom Analyzer উদাহরণ:
ধরা যাক, আমরা একটি কাস্টম অ্যানালাইজার তৈরি করতে চাই যা প্রথমে LowerCaseFilter প্রয়োগ করবে, তারপর StopWordsFilter প্রয়োগ করবে এবং শেষে WhitespaceTokenizer ব্যবহার করবে।
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.standard.StandardTokenizer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.core.LowerCaseFilter;
import org.apache.lucene.analysis.core.StopFilter;
import org.apache.lucene.analysis.util.StopwordAnalyzerBase;
import org.apache.lucene.analysis.CharTokenizer;
import org.apache.lucene.analysis.CharArraySet;
import java.io.IOException;
public class CustomAnalyzer extends Analyzer {
private final CharArraySet stopWords;
public CustomAnalyzer(CharArraySet stopWords) {
this.stopWords = stopWords;
}
@Override
protected TokenStreamComponents createComponents(String fieldName) {
// Step 1: Tokenizer
StandardTokenizer tokenizer = new StandardTokenizer();
// Step 2: Apply filters
TokenStream tokenStream = new LowerCaseFilter(tokenizer);
tokenStream = new StopFilter(tokenStream, stopWords);
// Returning TokenStream
return new TokenStreamComponents(tokenizer, tokenStream);
}
}
এখানে, আমরা StandardTokenizer ব্যবহার করেছি, যা টেক্সটকে টোকেন বা শব্দে ভাগ করে, তারপর LowerCaseFilter এবং StopFilter ব্যবহার করে। এটি একটি কাস্টম অ্যানালাইজার তৈরি করছে যা স্টপওয়ার্ড এবং ক্যাপিটালাইজেশন প্রক্রিয়াকে সরিয়ে ফেলে।
৩. Lucene তে Custom Tokenizer কিভাবে কাজ করে
Lucene তে Tokenizer হল এমন একটি উপাদান যা ইনপুট স্ট্রিং বা টেক্সটকে পৃথক পৃথক টোকেন (শব্দ বা প্যাটার্ন) তে বিভক্ত করে। এটি একটি বিশেষ ধরনের CharTokenizer ব্যবহার করে যা আপনার ইনপুট স্ট্রিং কে ভেঙে টোকেন তৈরি করে।
Custom Tokenizer উদাহরণ:
ধরা যাক, আমরা একটি কাস্টম টোকেনাইজার তৈরি করতে চাই যা কোনো স্পেস, কমা বা ডটের মাধ্যমে ইনপুট স্ট্রিংটিকে টোকেনে বিভক্ত করবে।
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.CharTokenizer;
import java.io.IOException;
public class CustomTokenizer extends CharTokenizer {
public CustomTokenizer() {
super();
}
@Override
protected boolean isTokenChar(char c) {
// Tokenize on spaces, commas, or periods
return !(c == ' ' || c == ',' || c == '.');
}
}
এখানে, CustomTokenizer টোকেনাইজারের isTokenChar মেথডের মাধ্যমে চেক করা হচ্ছে যে, কোন চরিত্রগুলি টোকেন হিসাবে গ্রহণযোগ্য এবং কোনগুলি নয়। স্পেস, কমা বা ডটগুলি টোকেন হিসাবে গণ্য হবে না।
৪. Lucene Custom Analyzer এবং Tokenizer ব্যবহার করার সুবিধা
- Text Preprocessing: কাস্টম অ্যানালাইজার এবং টোকেনাইজার আপনার টেক্সটকে প্রক্রিয়া করার সময় বিভিন্ন ফিল্টার ও পরিবর্তন প্রয়োগ করতে সক্ষম, যা ইনডেক্সিং এবং অনুসন্ধানকে আরও কার্যকরী করে তোলে।
- Language-specific Tokenization: যদি আপনি একটি বিশেষ ভাষার জন্য শব্দ ভাঙতে চান, তবে কাস্টম টোকেনাইজার ব্যবহার করে আপনি ভাষার প্রয়োজনীয়তা অনুযায়ী টোকেনাইজেশন সেটআপ করতে পারেন।
- Performance Optimization: অ্যানালাইজার এবং টোকেনাইজারের মাধ্যমে আপনি ডেটাকে ছোট ছোট টুকরোতে ভেঙে, সঠিকভাবে ম্যাপিং করতে পারবেন যা অনুসন্ধানের গতি উন্নত করে।
৫. Lucene Custom Analyzer এবং Tokenizer এর ব্যবহার উদাহরণ
এখানে একটি পূর্ণাঙ্গ উদাহরণ দেওয়া হল যেখানে কাস্টম অ্যানালাইজার এবং টোকেনাইজার ব্যবহার করা হয়েছে:
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.standard.StandardTokenizer;
import org.apache.lucene.analysis.core.LowerCaseFilter;
import org.apache.lucene.analysis.core.StopFilter;
import org.apache.lucene.analysis.util.CharArraySet;
import org.apache.lucene.analysis.TokenStream;
import java.io.StringReader;
import java.io.IOException;
public class CustomAnalyzerExample {
public static void main(String[] args) throws IOException {
String text = "This is an example of Lucene Custom Tokenizer and Analyzer.";
// Step 1: Create stop words set
CharArraySet stopWords = CharArraySet.copy(CharArraySet.EMPTY_SET);
// Step 2: Create Custom Analyzer
Analyzer analyzer = new CustomAnalyzer(stopWords);
// Step 3: Tokenizing the input text
TokenStream tokenStream = analyzer.tokenStream("field", new StringReader(text));
CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class);
// Step 4: Printing tokens
tokenStream.reset();
while (tokenStream.incrementToken()) {
System.out.println(charTermAttribute.toString());
}
tokenStream.end();
tokenStream.close();
}
}
এখানে, আমরা CustomAnalyzer এবং StandardTokenizer ব্যবহার করে একটি কাস্টম অ্যানালাইজার তৈরি করেছি যা টেক্সটের টোকেন তৈরি করবে। StopFilter ব্যবহার করে অপ্রয়োজনীয় শব্দগুলি সরিয়ে ফেলেছি।
৬. Conclusion
Lucene তে Custom Analyzer এবং Tokenizer ব্যবহার করার মাধ্যমে আপনি আপনার ডেটার উপর কাস্টম প্রসেসিং, টোকেনাইজেশন এবং ফিল্টারিং প্রয়োগ করতে পারেন। এটি আপনার অনুসন্ধান এবং ইনডেক্সিং কার্যক্রম আরও কার্যকরী এবং দ্রুত করতে সহায়তা করে। কাস্টম অ্যানালাইজার এবং টোকেনাইজার ব্যবহারের মাধ্যমে আপনার ডেটার বিশেষ বৈশিষ্ট্য অনুযায়ী কাস্টমাইজড কার্যক্রম তৈরি করতে পারেন, যা আরও সুনির্দিষ্ট এবং পারফর্ম্যান্ট অনুসন্ধান ফলাফল প্রদান করে।
Apache Lucene একটি অত্যন্ত শক্তিশালী এবং জনপ্রিয় ফুল-টেক্সট সার্চ লাইব্রেরি যা Java-ভিত্তিক অ্যাপ্লিকেশনগুলিতে ডেটা ইনডেক্সিং এবং সার্চ ফিচার তৈরি করতে ব্যবহৃত হয়। Lucene বিভিন্ন ধরনের analyzer এবং tokenizer সরবরাহ করে, যা সার্চ ইন্ডেক্স তৈরির জন্য টেক্সট প্রক্রিয়াকরণের ক্ষেত্রে গুরুত্বপূর্ণ ভূমিকা পালন করে।
Custom Analyzer এবং Tokenizer এর মাধ্যমে আপনি আপনার নিজস্ব টেক্সট প্রক্রিয়াকরণ কৌশল তৈরি করতে পারেন, যা আপনার সার্চ প্রক্রিয়াকে আরও নির্ভুল এবং কার্যকরী করতে সাহায্য করবে। এই টিউটোরিয়ালে, আমরা Custom Analyzer এবং Tokenizer এর প্রয়োজনীয়তা এবং তাদের ব্যবহারের কৌশলগুলি বিস্তারিতভাবে আলোচনা করব।
১. Lucene Analyzer এবং Tokenizer এর ভূমিকা
১.১ Analyzer:
Lucene এর Analyzer একটি ফিল্টার যা ইনডেক্সিং এবং সার্চ অপারেশনে টেক্সট প্রক্রিয়াকরণে সাহায্য করে। এটি ইনপুট টেক্সটকে শব্দ বা tokens-এ ভাগ করে এবং এগুলিকে একটি নির্দিষ্ট ফরম্যাটে প্রক্রিয়াজাত করে।
১.২ Tokenizer:
Tokenizer একটি বিশেষ ধরনের analyzer যা ইনপুট টেক্সটকে tokens-এ ভাঙে। টোকেনাইজেশন হল টেক্সট প্রক্রিয়াকরণের প্রথম ধাপ, যেখানে টেক্সটকে পৃথক শব্দ বা ইউনিটে ভাগ করা হয়।
Lucene তে, সাধারণভাবে, টোকেনাইজারটি শব্দের মধ্যে সীমারেখা চিহ্নিত করে (যেমন, স্পেস বা পাঞ্চুয়েশন), এবং পরবর্তীতে TokenFilter গুলি এই টোকেনগুলিকে প্রসেস করে।
২. Custom Analyzer এবং Tokenizer এর প্রয়োজনীয়তা
Lucene এর ডিফল্ট StandardAnalyzer অনেক সাধারণ প্রক্রিয়ায় ব্যবহৃত হয়, তবে কিছু বিশেষ প্রয়োজনের জন্য আপনি একটি Custom Analyzer এবং Tokenizer তৈরি করতে পারেন। এই কাস্টমাইজেশন আপনাকে একটি নির্দিষ্ট টেক্সট প্রক্রিয়াকরণের কৌশল তৈরি করতে সক্ষম করে, যেমন কাস্টম টোকেনাইজেশন বা নির্দিষ্ট শব্দের জন্য ফিল্টারিং।
কাস্টম অ্যানালাইজার এবং টোকেনাইজারের প্রয়োজনীয়তা:
- Language-Specific Text Processing: কিছু ভাষার জন্য বিশেষ ধরনের টোকেনাইজেশন এবং ফিল্টারিং প্রয়োজন হতে পারে (যেমন, অক্ষরের স্টেমিং বা লেমাটাইজেশন)।
- Noise Word Removal: কিছু শব্দ যেমন stop words (যেমন, "the", "is", "and") খুব কম গুরুত্বপূর্ণ হতে পারে সার্চ প্রসেসে। কাস্টম analyzer এই শব্দগুলো বাদ দিতে সাহায্য করে।
- Case Sensitivity: কিছু বিশেষ কেস সেনসিটিভ সার্চের জন্য আপনি কাস্টম analyzer তৈরি করতে পারেন যা ইনডেক্সিং এবং সার্চের সময় কেস সেনসিটিভ বা কেস ইনসেনসিটিভ হ্যান্ডেল করবে।
- Text Normalization: আপনি কিছু নির্দিষ্ট শব্দ বা চরিত্রগুলিকে স্বাভাবিক (normalize) করতে পারেন, যেমন "didn't" কে "did not" এ রূপান্তর করা।
৩. Custom Analyzer তৈরি করা
Lucene তে কাস্টম Analyzer তৈরি করতে হলে আপনাকে একটি TokenStream তৈরি করতে হবে, যা টোকেনাইজার এবং টোকেন ফিল্টারগুলি একত্রে ব্যবহার করবে। নিচে একটি কাস্টম analyzer তৈরি করার উদাহরণ দেওয়া হলো।
উদাহরণ: কাস্টম Analyzer
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.standard.StandardTokenizer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.CharArraySet;
import org.apache.lucene.analysis.StopwordAnalyzerBase;
public class CustomAnalyzer extends Analyzer {
@Override
protected TokenStreamComponents createComponents(String fieldName) {
// Standard tokenizer for breaking text into tokens
StandardTokenizer tokenizer = new StandardTokenizer();
// Creating a custom stop word set
CharArraySet stopWords = new CharArraySet(StopwordAnalyzerBase.ENGLISH_STOP_WORDS_SET, true);
// Token stream filter to remove stop words
TokenStream tokenStream = new org.apache.lucene.analysis.StopFilter(tokenizer, stopWords);
return new TokenStreamComponents(tokenizer, tokenStream);
}
}
এখানে:
- StandardTokenizer টোকেনাইজেশন প্রক্রিয়া সম্পন্ন করে, অর্থাৎ এটি টেক্সটকে শব্দে ভাগ করে।
- StopFilter ব্যবহার করা হয়েছে, যাতে stop words গুলি বাদ দেওয়া যায়।
৪. Custom Tokenizer তৈরি করা
একটি কাস্টম Tokenizer তৈরি করা অনেকটাই আলাদা, কারণ এটি মূলত টেক্সটকে টোকেনে বিভক্ত করার জন্য ব্যবহৃত হয়। নিচে একটি কাস্টম Tokenizer তৈরি করার উদাহরণ দেওয়া হলো:
উদাহরণ: কাস্টম Tokenizer
import org.apache.lucene.analysis.Tokenizer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import java.io.IOException;
public class CustomTokenizer extends Tokenizer {
private final CharTermAttribute termAttribute = addAttribute(CharTermAttribute.class);
@Override
public boolean incrementToken() throws IOException {
// Tokenization logic: splitting by space
clearAttributes();
int start = input.read();
int end = input.read();
if (start == -1) return false;
termAttribute.append(String.valueOf((char) start));
return true;
}
}
এখানে, CustomTokenizer input.read() দ্বারা টেক্সটকে টোকেনে বিভক্ত করে। এটি একটি সাধারণ উদাহরণ, যেখানে স্পেস দিয়ে টোকেন বিভক্ত করা হচ্ছে।
৫. Custom Tokenizer এবং Analyzer ব্যবহারের উদাহরণ
MapStruct-এর সাথে কাস্টম analyzer এবং tokenizer ব্যবহার করতে, কাস্টম analyzer তৈরি করুন এবং তারপরে সেটি একটি IndexWriter বা IndexSearcher এ ব্যবহৃত করুন।
উদাহরণ: Indexing with Custom Analyzer
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;
public class IndexingExample {
public static void main(String[] args) throws Exception {
Directory directory = new RAMDirectory();
CustomAnalyzer analyzer = new CustomAnalyzer();
IndexWriter writer = new IndexWriter(directory, new IndexWriterConfig(analyzer));
// Example: Indexing a document
Document doc = new Document();
doc.add(new TextField("field", "This is an example sentence", Field.Store.YES));
writer.addDocument(doc);
writer.close();
}
}
এখানে, CustomAnalyzer ব্যবহার করে একটি ইনডেক্স তৈরি করা হচ্ছে যেখানে CustomTokenizer এবং StopFilter সংযুক্ত করা হয়েছে।
৬. Custom Tokenizer এবং Analyzer এর প্রয়োজনীয়তা
- Language-Specific Tokenization: বিশেষ ভাষার জন্য কাস্টম tokenizer এবং analyzer ব্যবহার করা যেতে পারে যেমন বাংলা বা আরবি ভাষা, যেখানে নির্দিষ্ট টোকেনাইজেশন প্রক্রিয়া প্রয়োজন।
- Performance Optimization: কাস্টম টোকেনাইজেশন ও ফিল্টারিং ব্যবহার করে আপনি ইন্ডেক্সিং এবং সার্চের সময় পারফরম্যান্স অপটিমাইজ করতে পারেন।
- Text Normalization: কোনো নির্দিষ্ট শব্দ বা ক্যারেক্টার রূপান্তর বা ফিল্টারিং প্রক্রিয়া কাস্টম analyzer দিয়ে সম্পাদন করা যায়।
- Custom Stop Words: ডিফল্ট stop words লিস্ট থেকে কিছু শব্দ বাদ দেওয়ার জন্য কাস্টম analyzer তৈরি করা যায়।
সারাংশ
Custom Analyzer এবং Tokenizer তৈরি করার মাধ্যমে আপনি Lucene এর সার্চ ইঞ্জিনকে আরো কাস্টমাইজ করতে পারেন, যা আপনার প্রোজেক্টের নির্দিষ্ট চাহিদা পূরণে সহায়তা করবে। এই কাস্টম অ্যানালাইজার এবং টোকেনাইজার ব্যবহার করে আপনি নির্দিষ্ট ভাষা, টেক্সট প্রক্রিয়াকরণ, স্টপওয়ার্ড ফিল্টারিং, এবং অন্যান্য কাস্টম কনভার্শন লজিক প্রয়োগ করতে পারেন, যা সার্চ পারফরম্যান্স এবং সঠিকতা উন্নত করতে সাহায্য করবে।
Apache Lucene একটি শক্তিশালী ইন্ডেক্সিং এবং সার্চ টুল যা ডেটাবেস বা ফাইল সিস্টেমে তথ্য অনুসন্ধান (search) করতে ব্যবহৃত হয়। Lucene সার্চ ইঞ্জিন তৈরি করতে ব্যবহৃত হয় এবং এটি সাধারণত ইনডেক্সিং, টোকেনাইজেশন, এবং কুয়েরি প্রসেসিংয়ের জন্য বিভিন্ন Analyzer ব্যবহার করে।
Lucene এ Analyzer একটি গুরুত্বপূর্ণ উপাদান, যা ইনডেক্সিং এবং সার্চ প্রক্রিয়াকে কাস্টমাইজ করতে সাহায্য করে। আপনি যদি আপনার নির্দিষ্ট প্রয়োজনে বিশেষভাবে কাস্টম টোকেনাইজেশন বা প্রিপ্রসেসিং করতে চান, তবে Custom Analyzer তৈরি করা প্রয়োজন।
এই টিউটোরিয়ালে আমরা দেখব কিভাবে Analyzer ক্লাসটি এক্সটেন্ড করে একটি Custom Analyzer তৈরি করা যায়।
১. Lucene Analyzer Overview
Lucene এ Analyzer একটি ক্লাস যা মূলত TokenStream তৈরি করতে ব্যবহৃত হয়। TokenStream হল এমন একটি স্ট্রীম যা ইনডেক্সিং বা সার্চিংয়ের জন্য প্রক্রিয়াজাত টোকেন সরবরাহ করে। এটি সাধারণত Tokenizer এবং TokenFilter এর সমন্বয়ে তৈরি হয়।
- Tokenizer: এটি ইনপুট টেক্সটকে টোকেন (শব্দ বা অন্যান্য ইউনিট) এ বিভক্ত করে।
- TokenFilter: এটি টোকেনগুলির উপর প্রক্রিয়া চালায় যেমন স্টপওয়ার্ড রিমুভাল, লিমিটাইজেশন বা স্টেমিং।
২. Custom Analyzer তৈরি করা
Lucene এর মধ্যে কাস্টম Analyzer তৈরি করতে হলে, Analyzer ক্লাসটি এক্সটেন্ড করতে হবে এবং সেই সাথে প্রয়োজনীয় টোকেনাইজার এবং ফিল্টার কনফিগার করতে হবে। এর মাধ্যমে আপনি নিজের বিশেষ লজিক প্রয়োগ করতে পারেন, যেমন স্টপওয়ার্ড রিমুভাল, শব্দটিকে ছোট হাতের অক্ষরে রূপান্তর করা ইত্যাদি।
উদাহরণ: Custom Analyzer
ধরা যাক, আপনি একটি কাস্টম Analyzer তৈরি করতে চান যা ইনডেক্সিংয়ের সময় স্টপওয়ার্ড রিমুভ এবং টোকেনকে ছোট হাতের অক্ষরে রূপান্তর করবে।
Step 1: Custom Analyzer তৈরি করা
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.standard.StandardTokenizer;
import org.apache.lucene.analysis.core.LowerCaseFilter;
import org.apache.lucene.analysis.en.EnglishStopWords;
public class CustomAnalyzer extends Analyzer {
@Override
protected TokenStreamComponents createComponents(String fieldName) {
// Standard tokenizer
StandardTokenizer tokenizer = new StandardTokenizer();
// Lowercase filter
TokenStream tokenStream = new LowerCaseFilter(tokenizer);
// Remove stop words
tokenStream = new EnglishStopWords(tokenStream);
return new TokenStreamComponents(tokenizer, tokenStream);
}
}
এখানে:
- StandardTokenizer: এটি ইনপুট স্ট্রিংকে শব্দে বিভক্ত করবে।
- LowerCaseFilter: এটি সমস্ত টোকেনকে ছোট হাতের অক্ষরে রূপান্তর করবে।
- EnglishStopWords: এটি ইংরেজি স্টপওয়ার্ড রিমুভ করার জন্য ব্যবহার করা হচ্ছে।
Step 2: Custom Analyzer ব্যবহার করা
এখন, আপনি এই কাস্টম Analyzer ব্যবহার করে টোকেনাইজেশন এবং ইনডেক্সিং করতে পারবেন।
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.index.IndexWriterConfig;
public class CustomAnalyzerExample {
public static void main(String[] args) throws Exception {
// Create a RAM directory to store the index
RAMDirectory directory = new RAMDirectory();
// Create a Custom Analyzer
Analyzer analyzer = new CustomAnalyzer();
// Create IndexWriter configuration
IndexWriterConfig config = new IndexWriterConfig(analyzer);
// Create an IndexWriter
IndexWriter writer = new IndexWriter(directory, config);
// Create a document to index
Document doc = new Document();
doc.add(new Field("content", "The quick brown fox jumps over the lazy dog", Field.Store.YES, Field.Index.ANALYZED));
// Add the document to the index
writer.addDocument(doc);
// Commit the changes and close the writer
writer.commit();
writer.close();
System.out.println("Indexing completed.");
}
}
এখানে, RAMDirectory ব্যবহার করা হয়েছে যাতে ইনডেক্সিংয়ের ডেটা RAM এ সংরক্ষিত থাকে। এরপর IndexWriter দিয়ে ডকুমেন্ট ইনডেক্স করা হচ্ছে এবং কাস্টম Analyzer দিয়ে টোকেনাইজেশন এবং প্রক্রিয়াজাত করা হচ্ছে।
৩. Custom Tokenizer এবং TokenFilter ব্যবহার করা
আপনি Tokenizer এবং TokenFilter ক্লাসগুলোকে কাস্টমাইজ করেও Custom Analyzer তৈরি করতে পারেন।
উদাহরণ: Custom Tokenizer
import org.apache.lucene.analysis.Tokenizer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import java.io.IOException;
public class CustomTokenizer extends Tokenizer {
private final CharTermAttribute termAtt = addAttribute(CharTermAttribute.class);
@Override
public boolean incrementToken() throws IOException {
clearAttributes();
// Custom tokenization logic goes here
String input = "The quick brown fox";
termAtt.append(input);
return true;
}
}
এখানে, CustomTokenizer ক্লাসটি একটি কাস্টম টোকেনাইজার তৈরি করছে যা ইনপুট টেক্সটকে টোকেনাইজ করবে। আপনি এটিকে Analyzer এর মধ্যে ব্যবহার করতে পারেন।
৪. Custom Analyzer এর সুবিধা
- Fine-grained Control: কাস্টম অ্যানালাইজার ব্যবহার করে আপনি টোকেনাইজেশন, স্টপওয়ার্ড রিমুভাল, লিমিটাইজেশন, স্টেমিং ইত্যাদি কাস্টমাইজ করতে পারেন।
- Flexibility: কোনো নির্দিষ্ট টেক্সট প্রক্রিয়া প্রয়োগ করার জন্য এটি অত্যন্ত সুবিধাজনক।
- Performance: কাস্টম অ্যানালাইজার ব্যবহার করে আপনি ইন্ডেক্সিং বা সার্চ পারফরম্যান্স উন্নত করতে পারেন, যেমন স্টপওয়ার্ড ফিল্টার, টোকেন ফিল্টার ইত্যাদি।
সারাংশ
Lucene এ Custom Analyzer তৈরি করা খুবই সহজ এবং এটি টোকেনাইজেশন, ফিল্টারিং এবং অন্যান্য ডেটা প্রক্রিয়ায় অধিক নিয়ন্ত্রণ প্রদান করে। কাস্টম অ্যানালাইজার ব্যবহার করে আপনি আপনার ইনডেক্সিং এবং সার্চ প্রক্রিয়াকে আরও দক্ষ এবং কাস্টমাইজড করতে পারেন। Tokenizer এবং TokenFilter ক্লাসগুলোকে কাস্টমাইজ করার মাধ্যমে আপনি আরো সুনির্দিষ্টভাবে ডেটা প্রক্রিয়া করতে পারবেন।
Lucene হল একটি ওপেন সোর্স লুকআপ এবং সনাক্তকরণ লাইব্রেরি যা টেক্সট ডেটা ইনডেক্স এবং সার্চ করার জন্য ব্যবহৃত হয়। TokenStream এবং Tokenizer লুসিনের দুটি গুরুত্বপূর্ণ উপাদান যা ডেটা ইনডেক্সিং এবং সার্চিং প্রক্রিয়ার সময় টোকেন তৈরি এবং প্রক্রিয়া করার জন্য ব্যবহৃত হয়।
এই টিউটোরিয়ালে আমরা TokenStream এবং Tokenizer এর কাজ এবং কনফিগারেশন সম্পর্কিত ধারণা দেখব।
১. TokenStream এর ধারণা
TokenStream হল লুসিনের একটি কম্পোনেন্ট যা ইনডেক্সিং এবং সার্চিং এর জন্য টোকেন উৎপন্ন করে। এটি মূলত শব্দের একটি ধারাবাহিকতা, যেগুলি টেক্সট থেকে বের করা হয় এবং পরে ইনডেক্সিং বা সার্চিং প্রক্রিয়ায় ব্যবহৃত হয়।
TokenStream দুটি মৌলিক কাজ করে:
- Tokenization: টেক্সট থেকে শব্দ (tokens) আলাদা করা।
- Filtering: টোকেনের উপর বিভিন্ন প্রক্রিয়া বা ফিল্টার প্রয়োগ করা, যেমন স্টপওয়ার্ড (stopwords) অপসারণ, লোয়ারকেস করা ইত্যাদি।
উদাহরণস্বরূপ, যখন আপনি একটি টেক্সট ইনডেক্স করেন, TokenStream সেই টেক্সটকে ছোট ছোট ইউনিটে (টোকেন) ভেঙে দেয়, এবং প্রতিটি টোকেনকে প্রক্রিয়া করার জন্য বিভিন্ন ফিল্টার প্রয়োগ করা হতে পারে।
২. Tokenizer এর ধারণা
Tokenizer হল একটি কম্পোনেন্ট যা TokenStream তৈরি করে। এটি মূলত একটি টেক্সটকে বিভিন্ন টোকেন (যেমন শব্দ, সিলেবল, স্পেস, বা অন্যান্য আলাদা অংশ) এ বিভক্ত করে।
টোকেনাইজার বিভিন্ন ধরনের হতে পারে যেমন:
- StandardTokenizer: এটি সাধারণত ভাষাগত নীতির ভিত্তিতে টেক্সটকে টোকেন করে।
- WhitespaceTokenizer: এটি শুধুমাত্র স্পেস ব্যবহার করে টেক্সটকে টোকেনাইজ করে।
- KeywordTokenizer: এটি পূর্ণ স্ট্রিংকে একটি একক টোকেনে পরিণত করে, যেমন একক শব্দ বা বাক্যাংশ।
৩. Tokenizer কনফিগারেশন
টোকেনাইজার কনফিগারেশন সাধারণত একটি Analyzer এর অংশ হিসেবে ব্যবহৃত হয়। আপনি একটি টোকেনাইজারকে ফিল্টারগুলির সাথে কনফিগার করে বিভিন্ন ধরনের টোকেন তৈরি করতে পারেন।
উদাহরণ: StandardTokenizer কনফিগারেশন
Analyzer analyzer = new StandardAnalyzer();
এখানে, StandardAnalyzer একটি StandardTokenizer ব্যবহার করে টেক্সটকে টোকেনাইজ করে এবং কিছু সাধারণ ফিল্টার প্রয়োগ করে (যেমন স্টপওয়ার্ড ফিল্টার)।
উদাহরণ: WhitespaceTokenizer কনফিগারেশন
Analyzer analyzer = new Analyzer() {
@Override
protected TokenStreamComponents createComponents(String fieldName) {
Tokenizer tokenizer = new WhitespaceTokenizer();
TokenStream tokenStream = new LowerCaseFilter(tokenizer);
return new TokenStreamComponents(tokenizer, tokenStream);
}
};
এখানে, WhitespaceTokenizer স্পেস ব্যবহার করে টেক্সটকে টোকেনাইজ করে এবং LowerCaseFilter ব্যবহার করে প্রতিটি টোকেনকে ছোট হাতের অক্ষরে রূপান্তরিত করে।
৪. TokenStream কনফিগারেশন
TokenStream কনফিগার করা হয় একটি Analyzer এর অংশ হিসেবে, যা টোকেনাইজার এবং ফিল্টারগুলির সাথে একত্রিত হয়।
উদাহরণ: TokenStream কনফিগারেশন
Analyzer analyzer = new Analyzer() {
@Override
protected TokenStreamComponents createComponents(String fieldName) {
Tokenizer tokenizer = new WhitespaceTokenizer();
TokenStream tokenStream = new StopFilter(tokenizer, StopAnalyzer.ENGLISH_STOP_WORDS_SET);
return new TokenStreamComponents(tokenizer, tokenStream);
}
};
এখানে, StopFilter ব্যবহার করা হয়েছে যা স্টপওয়ার্ড (যেমন "the", "is", "at" ইত্যাদি) ফিল্টার করে, যাতে তারা ইনডেক্সিং প্রক্রিয়ায় অন্তর্ভুক্ত না হয়।
৫. Tokenizer এবং TokenStream এর ব্যবহার
উদাহরণ: Indexing with TokenStream
String text = "Lucene is a powerful search library";
Analyzer analyzer = new StandardAnalyzer();
try (Directory directory = FSDirectory.open(Paths.get("index"))) {
IndexWriterConfig config = new IndexWriterConfig(analyzer);
try (IndexWriter writer = new IndexWriter(directory, config)) {
Document doc = new Document();
doc.add(new TextField("content", text, Field.Store.YES));
writer.addDocument(doc);
}
}
এখানে, StandardAnalyzer ব্যবহার করা হয়েছে এবং TokenStream এর মাধ্যমে টেক্সটটিকে টোকেনাইজ করা হয়েছে, যা ইনডেক্সিং প্রক্রিয়ায় ব্যবহৃত হয়।
উদাহরণ: Searching with TokenStream
String queryStr = "Lucene search";
QueryParser parser = new QueryParser("content", analyzer);
Query query = parser.parse(queryStr);
try (Directory directory = FSDirectory.open(Paths.get("index"));
DirectoryReader reader = DirectoryReader.open(directory)) {
IndexSearcher searcher = new IndexSearcher(reader);
TopDocs results = searcher.search(query, 10);
for (ScoreDoc scoreDoc : results.scoreDocs) {
Document doc = searcher.doc(scoreDoc.doc);
System.out.println(doc.get("content"));
}
}
এখানে, QueryParser এর মাধ্যমে TokenStream কনফিগার করা হয়েছে, যা সার্চের জন্য টোকেন তৈরি করে।
৬. TokenStream এবং Tokenizer এর সুবিধা
- Tokenization: টেক্সট ডেটাকে ছোট ছোট টোকেন এ বিভক্ত করে, যাতে সহজে প্রসেসিং এবং সার্চ করা যায়।
- Filtering: ফিল্টার ব্যবহারের মাধ্যমে অপ্রয়োজনীয় টোকেন যেমন স্টপওয়ার্ড বা কমন শব্দ সরিয়ে ফেলা হয়।
- Customization: ব্যবহারকারীরা টোকেনাইজার এবং ফিল্টার কাস্টমাইজ করতে পারেন, যেমন ভাষাগত ফিল্টার বা কাস্টম শব্দ তালিকা।
- Text Normalization: টোকেনাইজিংয়ের মাধ্যমে ডেটার ছোট হাতের অক্ষরে রূপান্তর, স্টপওয়ার্ড ফিল্টারিং, এবং অন্যান্য নরমালাইজেশন করা যায়।
সারাংশ
TokenStream এবং Tokenizer হল লুসিনের গুরুত্বপূর্ণ কম্পোনেন্ট যা টেক্সট ডেটা প্রসেসিংয়ের জন্য ব্যবহৃত হয়। Tokenizer টেক্সটকে টোকেন বা শব্দে বিভক্ত করে, এবং TokenStream সেই টোকেনগুলির উপর ফিল্টার এবং প্রসেসিং অপারেশন চালায়। লুসিনে ইনডেক্সিং এবং সার্চিং প্রক্রিয়ায় এই দুটি কম্পোনেন্ট অত্যন্ত গুরুত্বপূর্ণ ভূমিকা পালন করে এবং ডেটার দ্রুত প্রক্রিয়াকরণ এবং কার্যকরী সার্চের জন্য অপরিহার্য।
Apache Lucene হল একটি ওপেন সোর্স লাইব্রেরি যা ব্যবহারকারীদের জন্য টেক্সট অনুসন্ধান (text search) এবং ইনডেক্সিং (indexing) করার সুবিধা প্রদান করে। এটি খুব দ্রুত এবং স্কেলেবল, যা বড় পরিসরের ডেটাবেসে কার্যকরীভাবে ব্যবহার করা যায়। লুসিন সাধারণত analyzers এবং tokenizers ব্যবহার করে ডেটা ইনডেক্স এবং সার্চ করে থাকে। তবে, আপনি যদি কোনও নির্দিষ্ট ডেটার উপর আরও কাস্টমাইজেশন চান, তাহলে আপনাকে custom analyzer এবং custom tokenizer তৈরি করতে হবে।
এই টিউটোরিয়ালে, আমরা দেখব কিভাবে Custom Analyzer এবং Tokenizer তৈরি করা যায়।
১. Lucene Analyzer এবং Tokenizer এর ভূমিকা
- Analyzer: একটি Analyzer হল একটি ক্লাস যা টেক্সটকে ইনডেক্স করার জন্য প্রস্তুত করে। এটি টেক্সটকে ছোট টুকরোয় ভাগ করে (tokenize), প্রয়োজনীয় স্টপওয়ার্ড সরিয়ে ফেলে এবং শব্দের বেস ফর্মে রূপান্তর করে (stemming)। এটি ইনডেক্সিংয়ের জন্য গুরুত্বপূর্ণ অংশ।
- Tokenizer: Tokenizer হল একটি উপাদান যা টেক্সটকে ছোট ছোট টুকরো বা "tokens" (যেমন শব্দ বা ফ্রেজ) এ ভেঙে ফেলে। Tokenizer শব্দগুলির মধ্যে সীমানা নির্ধারণ করে এবং পরে এগুলিকে আরও প্রসেসিংয়ের জন্য Analyzer-এ পাঠায়।
২. Custom Analyzer এবং Tokenizer তৈরি করার প্রয়োজনীয়তা
মাঝে মাঝে আপনি স্ট্যান্ডার্ড লুসিন analyzer বা tokenizer দিয়ে কাজ করতে পারেন না যদি আপনার ডেটা নির্দিষ্ট কাস্টমাইজেশন দাবি করে। এর জন্য custom analyzer এবং tokenizer তৈরি করা হয়। যেমন:
- Custom Tokenizer: যদি আপনার ডেটাতে বিশেষ ধরনের স্পেসিফিকেশন থাকে (যেমন কমা বা সেমিকোলন দিয়ে পৃথক করা টোকেন), তাহলে আপনি একটি কাস্টম tokenizer তৈরি করতে পারেন।
- Custom Analyzer: এটি তখন ব্যবহৃত হয় যখন আপনাকে ইনডেক্সিং করার সময় টেক্সট প্রক্রিয়াকরণের জন্য কাস্টম লজিক প্রয়োজন হয়, যেমন শব্দের সঠিকভাবে লেমাটাইজেশন বা ফিল্টারিং ইত্যাদি।
৩. Custom Tokenizer উদাহরণ
লুসিনের WhitespaceTokenizer সাধারণত স্পেস দিয়ে শব্দগুলো ভাগ করে। তবে, যদি আপনার টেক্সটে পিরিয়ড বা কমা দ্বারা পৃথক করা শব্দ থাকে, তবে আপনি একটি কাস্টম tokenizer তৈরি করতে পারেন।
Custom Tokenizer Class:
import org.apache.lucene.analysis.Tokenizer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import java.io.IOException;
public class CustomTokenizer extends Tokenizer {
private final CharTermAttribute termAtt = addAttribute(CharTermAttribute.class);
@Override
public boolean incrementToken() throws IOException {
clearAttributes();
int c;
while ((c = input.read()) != -1) {
// Logic to split based on commas
if (c == ',' || c == '.') {
return true;
}
termAtt.append((char) c);
}
return false;
}
}
এখানে, CustomTokenizer ক্লাসটি একটি কাস্টম লজিক ব্যবহার করে টোকেন তৈরি করবে, যেখানে এটি কমা বা পিরিয়ড দেখে টোকেনের সীমা নির্ধারণ করবে।
৪. Custom Analyzer উদাহরণ
আপনার যদি এমন পরিস্থিতি থাকে যেখানে আপনি টোকেনাইজ করার পর কিছু নির্দিষ্ট ফিল্টার বা স্টপওয়ার্ড ফিল্টার ব্যবহার করতে চান, তাহলে Custom Analyzer তৈরি করা প্রয়োজন।
Custom Analyzer Class:
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.core.LowerCaseFilter;
import org.apache.lucene.analysis.standard.StandardTokenizer;
import org.apache.lucene.analysis.CharTokenizer;
import java.io.IOException;
import java.io.Reader;
public class CustomAnalyzer extends Analyzer {
@Override
protected TokenStreamComponents createComponents(String fieldName) {
Tokenizer source = new StandardTokenizer();
TokenStream filter = new LowerCaseFilter(source); // Convert to lowercase
return new TokenStreamComponents(source, filter);
}
}
এখানে CustomAnalyzer ক্লাসটি একটি কাস্টম লজিক ব্যবহার করে ইনডেক্সিং করবে। StandardTokenizer প্রথমে টেক্সটটিকে টোকেনে ভাগ করবে এবং LowerCaseFilter টোকেনগুলোকে ছোট হাতের অক্ষরে পরিণত করবে। আপনি বিভিন্ন ধরনের ফিল্টার ব্যবহার করতে পারেন, যেমন StopwordFilter, SynonymFilter, অথবা কাস্টম ফিল্টার।
৫. Analyzer এবং Tokenizer ব্যবহার করা
Custom Analyzer এবং Tokenizer তৈরি করার পর, এগুলি লুসিনের ইনডেক্সিং এবং সার্চ প্রক্রিয়ায় ব্যবহার করতে হবে।
Indexing with Custom Analyzer and Tokenizer:
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.RAMDirectory;
public class CustomAnalyzerExample {
public static void main(String[] args) throws Exception {
RAMDirectory ramDirectory = new RAMDirectory();
Analyzer analyzer = new CustomAnalyzer();
IndexWriter writer = new IndexWriter(ramDirectory, new IndexWriterConfig(analyzer));
Document doc = new Document();
doc.add(new Field("content", "This is a test, with a comma!", Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(doc);
writer.close();
}
}
এখানে, CustomAnalyzer ব্যবহার করে একটি ডকুমেন্ট ইনডেক্স করা হয়েছে, যেখানে content ফিল্ডে একটি টেক্সট রয়েছে, যেটি কমা দিয়ে পৃথক করা শব্দ ব্যবহার করেছে।
৬. Searching with Custom Analyzer:
ইনডেক্স করার পর আপনি কাস্টম Analyzer ব্যবহার করে অনুসন্ধানও করতে পারেন।
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.search.Query;
public class CustomAnalyzerSearch {
public static void main(String[] args) throws Exception {
RAMDirectory ramDirectory = new RAMDirectory();
Analyzer analyzer = new CustomAnalyzer();
// Assume the index has been created previously
DirectoryReader reader = DirectoryReader.open(ramDirectory);
IndexSearcher searcher = new IndexSearcher(reader);
// Use QueryParser with the custom analyzer
QueryParser parser = new QueryParser("content", analyzer);
Query query = parser.parse("comma");
// Perform the search
int docId = searcher.search(query, 1).scoreDocs[0].doc;
System.out.println("Found document with ID: " + docId);
}
}
এখানে, QueryParser ব্যবহার করে CustomAnalyzer এর মাধ্যমে অনুসন্ধান করা হয়েছে। এটি content ফিল্ডে comma শব্দ অনুসন্ধান করবে এবং সংশ্লিষ্ট ডকুমেন্ট ID রিটার্ন করবে।
সারাংশ
Lucene এ Custom Analyzer এবং Tokenizer তৈরি করা খুবই কার্যকরী, যখন আপনাকে নির্দিষ্ট কাস্টম প্রক্রিয়ায় টেক্সট ইনডেক্স বা সার্চ করতে হয়। Custom Tokenizer শব্দগুলো কীভাবে টোকেনে বিভক্ত হবে তা নিয়ন্ত্রণ করে এবং Custom Analyzer ইনডেক্সিং বা সার্চ প্রক্রিয়ায় প্রয়োজনীয় ফিল্টার বা কাস্টম প্রক্রিয়া যুক্ত করে।
এগুলি ব্যবহার করে আপনি আপনার অনুসন্ধান প্রক্রিয়া আরও কার্যকরী এবং নির্দিষ্ট ডেটার জন্য সঠিকভাবে কাস্টমাইজড করতে পারবেন।
Read more