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 রয়েছে, যা বিভিন্ন ধরনের টোকেনাইজেশন এবং টেক্সট ফিল্টারিং কাজ করতে সক্ষম।
Read more