Apache Lucene একটি উচ্চ পারফরম্যান্স সার্চ লাইব্রেরি যা টেক্সট ডেটার উপর ইনডেক্সিং এবং সার্চিং কার্যক্রম পরিচালনা করতে ব্যবহৃত হয়। যদিও লুসিন নিজে লেমাটাইজেশন সরাসরি সমর্থন করে না, তবে আপনি এটি অন্যান্য লাইব্রেরি এবং টুলের মাধ্যমে ইন্টিগ্রেট করে সহজেই ব্যবহার করতে পারেন। লেমাটাইজেশন হলো একটি প্রাক-প্রসেসিং পদ্ধতি যা শব্দের বেস (লেমা) বের করতে সাহায্য করে। এটি শব্দের বিভিন্ন ফর্ম যেমন plural, tense ইত্যাদির মধ্যে সাদৃশ্য খুঁজে বের করতে ব্যবহৃত হয়, এবং এতে সার্চিং-এর গুণগত মান বৃদ্ধি পায়।
এই টিউটোরিয়ালে আমরা Lucene-এ লেমাটাইজেশন সম্পর্কিত ধারণা এবং এটি কিভাবে কাজ করে তা আলোচনা করব, পাশাপাশি লেমাটাইজেশন টেকনিকের ইন্টিগ্রেশন দেখাবো।
১. Lemmatization Overview
Lemmatization একটি প্রক্রিয়া যেখানে একটি শব্দের বেস ফর্ম বের করা হয়। উদাহরণস্বরূপ:
- running → run
- better → good
- cats → cat
এটি stemming এর মতোই একটি টেকনিক হলেও, stemming শব্দের চূড়ান্ত অংশ কেটে ফেলে দেয়, যা কখনও কখনও অপ্রাকৃত ফলাফল দিতে পারে। তবে, লেমাটাইজেশন শব্দের প্রকৃত অর্থ ধরে রেখে বেস ফর্ম বের করে।
লুসিন সরাসরি লেমাটাইজেশন প্রদান না করলেও, এটি অন্যান্য লাইব্রেরি যেমন Apache OpenNLP, Stanford NLP অথবা Snowball এর সাথে ইন্টিগ্রেট করা যেতে পারে।
২. Lucene এর সাথে Lemmatization ইন্টিগ্রেশন
Lucene সার্চ ইঞ্জিনে লেমাটাইজেশন প্রয়োগ করতে, আপনাকে সাধারণত কিছু প্রি-প্রসেসিং বা কাস্টম Analyzer তৈরি করতে হবে। Lucene এর Analyzer ইন্টারফেসটি এমনভাবে ডিজাইন করা হয়েছে যাতে আপনি কাস্টম টোকেনাইজার এবং স্টপার (stopword) ফিল্টার ব্যবহার করে লেমাটাইজেশন যুক্ত করতে পারেন।
২.১ Lemmatization with OpenNLP Example
এখানে, Apache OpenNLP ব্যবহার করে লেমাটাইজেশন এবং Lucene এর সাথে ইন্টিগ্রেট করা হয়েছে। প্রথমে OpenNLP এর লেমাটাইজার তৈরি করতে হবে এবং তারপর এটি Lucene-এর কাস্টম Analyzer এর মধ্যে ব্যবহার করতে হবে।
OpenNLP ডিপেনডেন্সি (pom.xml):
<dependency>
<groupId>org.apache.opennlp</groupId>
<artifactId>opennlp-tools</artifactId>
<version>1.9.3</version>
</dependency>
Custom Lemmatizer with OpenNLP
import opennlp.tools.lemmatizer.LemmatizerME;
import opennlp.tools.lemmatizer.LemmatizerModel;
import opennlp.tools.tokenize.TokenizerME;
import opennlp.tools.tokenize.TokenizerModel;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.Tokenizer;
import org.apache.lucene.util.Version;
import java.io.InputStream;
import java.io.StringReader;
public class LemmatizingAnalyzer extends Analyzer {
private LemmatizerME lemmatizer;
private Tokenizer tokenizer;
public LemmatizingAnalyzer() {
try {
// Load the lemmatizer model from the file
InputStream modelIn = getClass().getResourceAsStream("/en-lemmatizer.bin");
LemmatizerModel model = new LemmatizerModel(modelIn);
lemmatizer = new LemmatizerME(model);
// Load tokenizer model
InputStream tokenModelIn = getClass().getResourceAsStream("/en-token.bin");
TokenizerModel tokenModel = new TokenizerModel(tokenModelIn);
tokenizer = new TokenizerME(tokenModel);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected TokenStreamComponents createComponents(String fieldName) {
Tokenizer source = tokenizer;
TokenStream result = new TokenStream() {
@Override
public boolean incrementToken() {
try {
if (source.incrementToken()) {
// Get the token
String token = source.getAttribute(CharTermAttribute.class).toString();
String[] lemmatisized = lemmatizer.lemmatize(token, "v"); // Assuming verb type
String lemma = lemmatisized[0];
// Return the lemmatized token
CharTermAttribute termAtt = addAttribute(CharTermAttribute.class);
termAtt.setEmpty().append(lemma);
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
};
return new TokenStreamComponents(source, result);
}
}
এখানে, LemmatizingAnalyzer কাস্টম Analyzer তৈরি করে যেখানে OpenNLP Lemmatizer ব্যবহার করা হয়েছে।
৩. Lucene Indexing with Lemmatization
এখন, কাস্টম Analyzer ব্যবহার করে আপনি Lucene এ টোকেনাইজেশন এবং লেমাটাইজেশন একসাথে পরিচালনা করতে পারেন। Indexing এর সময়, LemmatizingAnalyzer ব্যবহার করে ইনডেক্স তৈরি করা হবে।
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import java.nio.file.Paths;
public class LemmatizationIndexer {
public void createIndex(String indexPath) {
try {
Directory directory = FSDirectory.open(Paths.get(indexPath));
IndexWriter writer = new IndexWriter(directory, new IndexWriterConfig(new LemmatizingAnalyzer()));
Document doc = new Document();
doc.add(new TextField("content", "The cats are running quickly", Field.Store.YES));
writer.addDocument(doc);
writer.commit();
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
এখানে, LemmatizingAnalyzer ব্যবহার করে ইনডেক্স তৈরি করা হচ্ছে। "The cats are running quickly" টেক্সট লেমাটাইজেশনের মাধ্যমে "cat", "run", "quickly" শব্দে পরিবর্তিত হবে।
৪. Lucene Search with Lemmatization
তখন, LemmatizingAnalyzer ব্যবহার করে আপনি সার্চিং-এও লেমাটাইজেশন প্রয়োগ করতে পারেন। ফলে, যখন আপনি "running" শব্দটি সার্চ করবেন, এটি "run" শব্দের সাথে মিলিয়ে সার্চ হবে।
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.store.FSDirectory;
public class LemmatizationSearcher {
public void search(String indexPath, String queryStr) {
try {
IndexReader reader = DirectoryReader.open(FSDirectory.open(Paths.get(indexPath)));
IndexSearcher searcher = new IndexSearcher(reader);
// Applying Lemmatizing Analyzer during search
Query query = new TermQuery(new Term("content", queryStr));
// Perform search
TopDocs docs = searcher.search(query, 10);
System.out.println("Number of hits: " + docs.totalHits);
} catch (Exception e) {
e.printStackTrace();
}
}
}
এখানে, "running" টার্মের জন্য লেমাটাইজেশন প্রয়োগ করা হবে এবং "run" শব্দের সাথে সার্চ হবে।
৫. Lemmatization এর সুবিধা
- Improved Search Results: লেমাটাইজেশন সার্চ ফলাফলকে আরও সঠিক এবং সংক্ষিপ্ত করে তোলে, কারণ এটি শব্দের বিভিন্ন ফর্মকে একই রূপে নিয়ে আসে।
- Reduces Index Size: শব্দের বেস ফর্মে ডেটা ইনডেক্স করে, ফলে ইনডেক্স সাইজ ছোট হয়।
- Better Matching: সার্চ কোয়েরি এবং ডেটার মধ্যে বেশি মিল পাওয়া যায়।
সারাংশ
Lucene তে Lemmatization সাধারণত Tokenization এবং Analyzer এর মাধ্যমে ইন্টিগ্রেট করা হয়। Apache OpenNLP বা অন্যান্য NLP টুল ব্যবহার করে লেমাটাইজেশন এবং Lucene-এ ইনডেক্সিং ও সার্চিং করার সময় এটি কার্যকরী হয়। লেমাটাইজেশন ব্যবহার করে সার্চ ফলাফল আরো সঠিক এবং দ্রুত পাওয়া যায়, এবং এটি ইন্ডেক্স সাইজও কমাতে সহায়তা করে।
Read more