ابزار Persianp با هدف پردازش متون فارسی طراحی و پیادهسازی شده است. قابلیتهایی که نسخه نهایی ابزار انجام میدهد به شرح زیر است:
- نرمالسازی
- واحدسازی (tokenization)
- جملهیابی
- بنواژهیابی (یا ریشهیابی) با دو روش آماری و غیرآماری
- تعیین ایستواژهها (stopwords)
- تشخیص عبارات اسمی (noun phrase chunking)
- تشخیص موجودیتهای اسمی (named entity recognition)
نکته مهمی که در تهیه این ابزار رعایت شده، هماهنگی و انطباق این بخشها با یکدیگر است که در مجموع منجر به کارایی بهتر هر یک از بخشها میشود. در صورتی که برای فعالیتهای تجاری خود به نسخه نهایی ابزار Persianp نیاز دارید لطفا با ایمیل(های) زیر مکاتبه نمایید:
mohseni [d0t] cs [At] gmail.com و یا
mahdi [d0t] mohseni [At] ut.ac.ir
نسخه 1.0 ابزار Persianp، برای استفاده در فعالیتهای صرفاً تحقیقاتی ارائه شده و قابل دانلود است. پیشپردازشهای که نسخه 1.0 انجام میدهد شامل نرمالسازی، واحدسازی، جملهیابی، برچسبگذاری اجزای کلام، بنواژهیابی (ریشهیابی) غیرآماری و تعیین ایستواژهها است. استفاده از این ابزار تنها برای فعالیتهای پژوهشی غیرتجاری مجاز است و استفاده از آن به هر شیوه و تحت هر عنوانی در فعالیتهای تجاری، به صورت مستقیم و غیر مستقیم، جایز نیست.
در صورت نیاز به ارجاعدهی میتوان به مقاله زیر ارجاع داد:
Mahdi Mohseni, Javad Ghofrani and Heshaam Faili. 2016. Persianp: a Persian Text Processing Toolbox. To be appeared in Springer Lecture Note in Computer Science.
تقاضا میشود برای افزایش کیفیت ابزار، پیشنهادها یا گزارش خطاها ارسال گردد.
پیشپردازشهایی که ابزار Persianp نسخه 1.0 انجام میدهد شامل موارد زیر است:
نرمالساز (Normalizer) : کاراکترهای غیر متعارف یا کم کاربرد را حذف و کد کاراکترهای مشابه را یکسانسازی میکند.
واحدساز (Tokenizer) : مرز کلمات را تشخیص و آن را به فهرستی از کلمات تبدیل میکند.
جملهیاب : جملهیابی برای پردازشهای بعدی لازم است بنابرین در صورت لزوم انجام میشود.
برچسبگذار (Part-Of-Speech Tagger) : بر اساس بافت هر کلمه در متن برچسبّهای زیر را به کلمه منتسب میکند: اسم (N)، فعل (V)، صفت (AJ)، قید (ADV)، حرف اضافه (P)، حرف ربط (CON)، حرف تعریف (DET)، عدد (NUM)، حرف اضافه پسین یا “را” (POSTP)، ضمیر (PRO)، جداکننده (PUNC)، شاخص (IDEN)، حرف صوت (INT)، متفرقه یا مابقی (RES). نسخه برخط برچسبگذار در اینجا قابل استفاده است.
بنواژهیاب (Lemmatizer) : بر اساس بافت هر کلمه در متن، بنواژه هر کلمه را تعیین میکند. نسخه برخط آن را در اینجا قابل استفاده است.
ایستواژهیاب : ایستواژههای (stopwords) متن را مشخص میکند.
ابتدا باید در محلی که فایل jar برنامه قرار دارد پوشه res که حاوی فایلهای برنامه است کپی شود.
$ java -cp persianp-toolbox-1.0.jar com.persianp.nlp.process.Process -input inputfile.txt -output outputfile.txt -task (tokenize|tag|lemmatize|taglemmatize) [-nostopword] [-prop propertyFile.properties]
شرح پارامترهای ورودی:
input : نام فایل ورودی که شامل متن خام با فرمت UTF-8 است.
output : نام فایل خروجی است و قالب آن به این صورت است که در هر خط یک کلمه قرار دارد و با توجه به پارامتر task، برچسب یا بنواژه کلمه (یا هر دو آن) بعد از کلمه آورده میشود.
task : نام عملی که باید انجام شود را مشخص میکند. چهار عمل tokenize (واحدسازی)، tag (برچسبگذاری اجزای کلام)، lemmatize (بنواژهیابی) و taglemmatize (هر دو برچسبگذاری اجزای کلام و بنواژهیابی) را میتوان مشخص کرد.
nostopword : در صورتی که نیاز به حذف ایستواژهها داشته باشید با آوردن این پارامتر ایستواژهها بر اساس فهرست از پیش تعیینشدهای حذف میشوند ودر فایل خروجی ظاهر نمیشوند.
prop : میتوان همه یا بخشی از پارامترها را در یک فایل properties وارد کرد و آن را با این پارامتر به برنامه معرفی کرد. مثال:
Properties file (properties.txt):
input = /home/mahdi/input.txt
output = /home/mahdi/output.txt
$ java -cp persianp-toolbox-1.0.jar com.persianp.nlp.process.Process -prop properties.txt
نمونه متن فایل ورودی:
فایل خروجی به دست آمده:
یک یک NUM
متن متن N
نمونه نمونه AJ
برای برای P
آزمایش آزمایش N
سامانه سامانه N
پردازشی پردازشی AJ
است بودن V
. . PUNC
فایل persianp-toolbox-1.0.jar را میتوان به کتابخانههای برنامه اضافه و از آن استفاده کرد. البته ابتدا باید پوشه res را که حاوی فایلهای برنامه است در محل مناسب (معمولا در مجاورت فایل jar) کپی شود. نمونه کد زیر نحوه استفاده را نشان می دهد:
public static void main(String[] args) {
TestPersianp testPersianp = new TestPersianp();
testPersianp.process();
}
private void process() {
try {
Properties properties = new Properties();
properties.load(this.getClass().getClassLoader().getResourceAsStream("persianp.properties"));
Process process = new Process(properties);
InputStream in = this.getClass().getClassLoader().getResourceAsStream("testText.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));
String line;
while ((line = br.readLine()) != null) {
process.process(line);
System.out.println(process.getText());
// process.getTokens();
// process.getTokensText();
// process.getTags();
// process.getLemmas();
// process.getNonStopwordTokens();
int sentenceSize = process.getSentencesSize();
for (int j = 0; j < sentenceSize; ++j) {
// List
// List
// List
List
for (int k = 0; k < tokens.size(); ++k) {
System.out.println(tokens.get(k).getText() + "\t\t\t" + tokens.get(k).getLemma() + "\t\t\t" + tokens.get(k).getTag());
}
}
}
in.close();
br.close();
} catch (Exception e){
e.printStackTrace();
}
}
}
نکته: اگر ابزار پردازشی را از طریق ترمینال یا خط فرمان اجرا میکنید این پارامترها باید در یک فایل properties آورده شوند.
پارامترهای مرتبط با نرمالساز:
معمولاً استفاده از این پارامترها و تغییر مقدار پیشفرض منجر به کارایی بهتر نمیشود ولی چون احتمال دارد در کارهای خاصی استفاده شود در نظر گرفته شدهاند.
isDigitValid: آیا کاراکترهای عددی معتبر در نظر گرفته شوند؟ (مقادیر: true / false مقدار پیشفرض: true)
isPunctuationValid: آیا کاراکترهای جداکننده معتبر در نظر گرفته شوند؟(مقادیر: true / false مقدار پیشفرض: true)
isWhileSpaceValid: آیا کاراکترهای فاصله معتبر در نظر گرفته شوند؟(مقادیر: true / false مقدار پیشفرض: true)
toLowerCase: آیا کاراکترهای لاتین به حالت کوچک تبدیل شوند؟ (مقادیر: true / false مقدار پیشفرض: false)
پارامترهای مرتبط با واحدساز:
newMutsFile: اگر علاوه بر کلمات چندبخشی که برنامه پوشش میدهد، کلمات چندبخشی (مانند "میلی متری") وجود داشته باشد و ابزار آنها را پوشش نمیدهد میتوان یک فایل دیگر شامل کلمات چندبخشی مورد نظر به برنامه معرفی کرد. فرمت فایل مذکور به این صورت است که در هر خط یک کلمه قرار دارد. (مقدار: آدرس فایل)
mutsFile: اگر نیاز است ابزار، کلمات چندبخشی را که خود در نظر میگیرد اصلاً لحاظ نکند و تنها فهرستی از کلمات چندبخشی دیگر را در نظر بگیرد میتوان از این پارامتر استفاده کرد. فرمت فایل مذکور به این صورت است که در هر خط یک کلمه قرار دارد. (مقدار: آدرس فایل)
پارامترهای مرتبط با ایستواژهیاب:
newStopWordFile: اگر علاوه بر ایستواژههایی که برنامه پوشش میدهد، ایستواژههایی وجود داشته باشد و ابزار آنها را پوشش نمیدهد میتوان یک فایل دیگر شامل ایستواژههای مورد نظر به برنامه معرفی کرد. فرمت فایل مذکور به این صورت است که در هر خط یک کلمه قرار دارد. (مقدار: آدرس فایل)
stopWordFile: اگر نیاز است ابزار، ایستواژههایی را که خود در نظر میگیرد اصلاً لحاظ نکند و تنها فهرستی از ایستواژههای دیگر را در نظر بگیرد میتوان از این پارامتر استفاده کرد. فرمت فایل مذکور به این صورت است که در هر خط یک کلمه قرار دارد. (مقدار: آدرس فایل)
پارامترهای مرتبط با بنواژهیاب:
verbLemmaInfinitive: آیا بنواژهیاب بنواژه افعال را به صورت مصدری تبدیل کند؟ (مقادیر: true / false مقدار پیشفرض: true)
wordLemmaFile: اگر برنامه در بنواژهسازی کلمات خاصی اشتباه عمل میکند میتوان این کلمات و بنواژه صحیح آنها را در فایلی به برنامه معرفی کرد. فرمت فایل مذکور به این صورت است که در هر سطر فایل یک کلمه و بنواژه آن که با tab از هم جدا شدهاند قرار دارد. (مقدار: آدرس فایل)