Apache Lucene হল একটি শক্তিশালী এবং জনপ্রিয় ওপেন সোর্স লাইব্রেরি যা Java-এ টেক্সট সার্চ ইঞ্জিন তৈরি করতে ব্যবহৃত হয়। Lucene আপনাকে দ্রুত এবং কার্যকরীভাবে ডেটাতে ইনডেক্স তৈরি করতে এবং পরে তা অনুসন্ধান করতে সহায়তা করে। Analysis এবং Tokenization এই প্রক্রিয়ার দুটি অত্যন্ত গুরুত্বপূর্ণ অংশ যা Lucene এর কার্যকারিতা এবং সার্চ প্রক্রিয়াকে আরও উন্নত করে।
১. Lucene Analysis এবং Tokenization এর ধারণা
Analysis হল একটি প্রক্রিয়া যেখানে ডকুমেন্ট বা টেক্সট ফিল্ডকে প্রক্রিয়াজাত করা হয় যাতে করে সেই টেক্সট সার্চিং এর জন্য উপযোগী হতে পারে। এটি দুটি প্রধান পর্যায়ে বিভক্ত:
- Tokenization: টেক্সটকে ছোট ছোট অংশ বা "tokens" এ বিভক্ত করা।
- Filtering: টোকেন গুলি পরবর্তীতে প্রক্রিয়াজাত করা হয়, যেমন স্টপওয়ার্ড (stopwords) বাদ দেওয়া, স্টেমিং (stemming) করা, লেমাটাইজেশন (lemmatization) ইত্যাদি।
এখানে, Tokenization হল সেই প্রক্রিয়া যার মাধ্যমে লুসিন টেক্সটকে আলাদা আলাদা শব্দ বা টোকেনের মধ্যে ভাঙে, যা পরে ইনডেক্স করা হয়।
২. Lucene এর Analysis Process
Lucene এর Analysis প্রক্রিয়া ৩টি প্রধান উপাদান দিয়ে গঠিত:
- Tokenizer: এটি টেক্সটকে টোকেন বা শব্দে ভাঙে।
- Filters: এটি টোকেনগুলিকে পরবর্তীতে প্রক্রিয়াজাত করে (যেমন স্টপওয়ার্ড, স্টেমিং ইত্যাদি)।
- Analyzer: এটি টোকেনাইজার এবং ফিল্টারগুলোকে একত্রে ব্যবহার করে।
উদাহরণ: StandardAnalyzer
Lucene এর StandardAnalyzer একটি সাধারণ Analyzer যা একটি টেক্সটকে টোকেনাইজ এবং প্রক্রিয়াজাত করে।
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
public class LuceneAnalyzerExample {
public static void main(String[] args) throws Exception {
Analyzer analyzer = new StandardAnalyzer();
String text = "Lucene is a powerful search engine";
// Tokenizing the text
try (TokenStream tokenStream = analyzer.tokenStream("content", text)) {
tokenStream.reset();
while (tokenStream.incrementToken()) {
CharTermAttribute termAttr = tokenStream.getAttribute(CharTermAttribute.class);
System.out.println(termAttr.toString());
}
tokenStream.end();
}
}
}
এখানে:
- StandardAnalyzer টোকেনাইজার হিসেবে কাজ করছে।
- এটি টেক্সটকে
Lucene,is,a,powerful,search,engineইত্যাদি টোকেন গুলোতে বিভক্ত করবে।
৩. Tokenization Process
Tokenization হল টেক্সট থেকে পৃথক পৃথক শব্দ বা টোকেন বের করার প্রক্রিয়া। Lucene এর Tokenizers বিভিন্ন ধরনের টোকেনাইজেশন স্ট্রাটেজি ব্যবহার করে, যেমন:
- StandardTokenizer: সাধারণ টেক্সট থেকে শব্দ টোকেন বের করার জন্য ব্যবহৃত হয়।
- WhitespaceTokenizer: শুধুমাত্র সাদা স্থান (whitespace) দিয়ে টোকেন বিভক্ত করা হয়।
- KeywordTokenizer: পুরো টেক্সটকে একটি একক টোকেন হিসেবে গ্রহণ করা হয়।
উদাহরণ: WhitespaceTokenizer
import org.apache.lucene.analysis.Tokenizer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.core.WhitespaceTokenizer;
import java.io.StringReader;
public class TokenizerExample {
public static void main(String[] args) throws Exception {
String text = "Lucene is awesome";
Tokenizer tokenizer = new WhitespaceTokenizer();
tokenizer.setReader(new StringReader(text));
CharTermAttribute termAttribute = tokenizer.addAttribute(CharTermAttribute.class);
tokenizer.reset();
while (tokenizer.incrementToken()) {
System.out.println(termAttribute.toString());
}
tokenizer.close();
}
}
এখানে WhitespaceTokenizer ব্যবহার করা হয়েছে, যেটি শুধুমাত্র সাদা স্থান দিয়ে টোকেন বিভক্ত করবে এবং আউটপুট হবে:
Lucene
is
awesome
৪. Filters in Lucene Analysis
Filters ব্যবহার করা হয় টোকেনগুলির উপর বিভিন্ন প্রক্রিয়া প্রয়োগ করতে, যেমন স্টপওয়ার্ড (stopwords) ফিল্টার, স্টেমিং (stemming), এবং লেমাটাইজেশন (lemmatization)। এটি TokenStream এর একটি অংশ হিসেবে কাজ করে।
উদাহরণ: StopWordFilter
Lucene এর StopFilter ব্যবহার করে কিছু সাধারণ শব্দ (যেমন "is", "a", "the") বাদ দেওয়া যায়, যা সার্চ প্রক্রিয়ায় গুরুত্বপূর্ণ নয়।
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.en.EnglishAnalyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
public class StopWordFilterExample {
public static void main(String[] args) throws Exception {
String text = "The quick brown fox jumps over the lazy dog";
EnglishAnalyzer analyzer = new EnglishAnalyzer();
TokenStream tokenStream = analyzer.tokenStream("content", text);
tokenStream.reset();
while (tokenStream.incrementToken()) {
CharTermAttribute term = tokenStream.getAttribute(CharTermAttribute.class);
System.out.println(term.toString());
}
tokenStream.end();
tokenStream.close();
}
}
এখানে EnglishAnalyzer ব্যবহার করা হয়েছে, যা ইংরেজি স্টপওয়ার্ডগুলি বাদ দিয়ে বাকি টোকেনগুলো প্রসেস করে। আউটপুট হবে:
quick
brown
fox
jumps
lazy
dog
৫. Stemming in Lucene
Stemming হল টোকেনের মূল শব্দ (root word) বের করার প্রক্রিয়া। উদাহরণস্বরূপ, "running", "runner" শব্দগুলোকে "run" এ পরিণত করা হয়। Lucene PorterStemFilter ব্যবহার করে স্টেমিং করতে সহায়তা করে।
উদাহরণ: PorterStemFilter
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.en.PorterStemFilter;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.core.WhitespaceTokenizer;
import java.io.StringReader;
public class StemmingExample {
public static void main(String[] args) throws Exception {
String text = "Running runners run";
WhitespaceTokenizer tokenizer = new WhitespaceTokenizer();
tokenizer.setReader(new StringReader(text));
TokenStream tokenStream = new PorterStemFilter(tokenizer);
CharTermAttribute termAttribute = tokenStream.addAttribute(CharTermAttribute.class);
tokenStream.reset();
while (tokenStream.incrementToken()) {
System.out.println(termAttribute.toString());
}
tokenStream.close();
}
}
এখানে, PorterStemFilter "Running", "runners" এবং "run" শব্দগুলিকে "run"-এ স্টেম করবে। আউটপুট হবে:
run
runner
run
৬. Custom Analysis and Tokenization
Lucene আপনাকে কাস্টম টোকেনাইজার এবং ফিল্টার তৈরি করার সুযোগ দেয়। আপনি আপনার নির্দিষ্ট প্রয়োজন অনুযায়ী টোকেনাইজেশন এবং ফিল্টারিং কাস্টমাইজ করতে পারেন।
উদাহরণ: Custom Tokenizer
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 termAttribute = addAttribute(CharTermAttribute.class);
@Override
public boolean incrementToken() throws IOException {
clearAttributes();
int c = input.read();
if (c == -1) {
return false;
}
termAttribute.append((char) c);
return true;
}
}
এখানে একটি কাস্টম টোকেনাইজার তৈরি করা হয়েছে যা একটি একক চরিত্র পড়বে এবং তাকে টোকেন হিসেবে পরিণত করবে।
৭. Lucene Analysis Tools
Lucene এ Analyzer এর মাধ্যমে বিভিন্ন টোকেনাইজার, ফিল্টার এবং স্টেমিং ব্যবহার করা হয়। কিছু জনপ্রিয় Analyzers হল:
- StandardAnalyzer: সাধারণভাবে টেক্সট টোকেনাইজ এবং ফিল্টার করতে ব্যবহৃত হয়।
- WhitespaceAnalyzer: সাদা স্থান দিয়ে টোকেন বিভক্ত করে।
- SimpleAnalyzer: সাধারণ টোকেনাইজার যা সমস্ত অক্ষরকে lowercase করে।
সারাংশ
Lucene Analysis এবং Tokenization হল টেক্সট সার্চ সিস্টেমের গুরুত্বপূর্ণ অংশ। Tokenization টেক্সটকে টোকেনে বিভক্ত করে এবং Analysis প্রক্রিয়া টোকেনগুলির উপর বিভিন্ন ফিল্টার প্রয়োগ করে (যেমন, স্টপওয়ার্ড রিমুভাল, স্টেমিং)। Lucene এ Tokenizer, Filters, এবং Analyzer ব্যবহারের মাধ্যমে টেক্সটকে সার্চিং-এর জন্য উপযুক্ত এবং দ্রুত প্রক্রিয়াজাত করা হয়। Custom Tokenizers এবং Filters তৈরি করে আপনি আপনার সিস্টেমের জন্য বিশেষ প্রক্রিয়া কাস্টমাইজ করতে পারেন।
Read more