Commit ef264563 authored by S.T. Galappaththi's avatar S.T. Galappaththi

Merge branch 'master' of http://gitlab.sliit.lk/2023-118/2023-118 into IT20167264

parents 27ac1157 c21017cc
import os
from sinhala_data_processor.config import RESOURCE_PATH
def load_suffixes():
suffixes = set()
suffixes_file_path = os.path.join(RESOURCE_PATH, 'suffixes_list.txt')
with open(suffixes_file_path, 'r', encoding='utf-8') as file:
for line in file:
suffix = line.strip()
suffixes.add(suffix)
return suffixes
class SinhalaStemm:
def __init__(self):
self.suffixes = load_suffixes()
def remove_suffix(self, word):
k = len(word) - 1
i = k
while i >= 0:
if self.is_suffix(word[i:]):
suffix_length = len(word) - i
root = word[:i]
return root
i -= 1
return word
def is_suffix(self, suffix):
return suffix in self.suffixes
def procedure_1(self, word):
return self.remove_suffix(word)
@staticmethod
def procedure_2(word):
root = word
k = len(word) - 1
i = len(word) - 1
while i >= 0:
if word[i] in ['ා', 'ැ', 'ෑ', 'ි', 'ී', 'ු', 'ූ', 'ෙ', 'ේ', 'ො', 'ෝ']:
root = word[:i]
k = k - (len(word) - i) + 1
break
i -= 1
return root
def procedure_3(self, word):
root_form = word
flag = True
while flag:
suffixes = self.procedure_1(root_form)
if suffixes:
new_root = root_form[:-len(suffixes)]
if self.starts_with_vowel(new_root):
new_root = self.procedure_2(new_root)
root_form = new_root
else:
flag = False
return root_form
def procedure_4(self, word):
root_form = word
flag = True
while flag:
suffixes = self.procedure_2(root_form)
if suffixes:
new_root = root_form[:-len(suffixes)]
inner_root = self.procedure_1(new_root) if new_root and new_root[-1] in ['ා', 'ැ', 'ෑ', 'ි', 'ී', 'ු',
'ූ', 'ෙ', 'ේ', 'ො',
'ෝ'] else self.procedure_2(
new_root)
new_root_form = inner_root + suffixes
root_form = new_root_form
else:
flag = False
return root_form
@staticmethod
def starts_with_vowel(self, word):
vowels = ['ා', 'ැ', 'ෑ', 'ි', 'ී', 'ු', 'ූ', 'ෙ', 'ේ', 'ො', 'ෝ']
return word and word[0] in vowels
def stem_word(self, word):
result = self.procedure_1(word)
result = self.procedure_2(result)
result = self.procedure_3(result)
result = self.procedure_4(result)
return result
def stem_words(self, words):
stemmed_words = []
for word in words:
stemmed_word = self.stem_word(word)
stemmed_words.append(stemmed_word)
return stemmed_words
...@@ -4,10 +4,6 @@ from typing import Union ...@@ -4,10 +4,6 @@ from typing import Union
import pygtrie as trie import pygtrie as trie
from sinhala_data_processor.config import RESOURCE_PATH from sinhala_data_processor.config import RESOURCE_PATH
__all__ = [
'Stemmer'
]
dependent_vowels = { dependent_vowels = {
"අ": "ා", "අ": "ා",
"ආ": "ා", "ආ": "ා",
...@@ -25,15 +21,15 @@ dependent_vowels = { ...@@ -25,15 +21,15 @@ dependent_vowels = {
def _load_stem_dictionary(): def _load_stem_dictionary():
stem_dict = dict() stem_list = []
with open(os.path.join(RESOURCE_PATH, 'stem_dictionary.txt'), 'r', encoding='utf-8') as fp: with open(os.path.join(RESOURCE_PATH, 'stem_dictionary.txt'), 'r', encoding='utf-8') as fp:
for line in fp.read().split('\n'): for line in fp.read().split('\n'):
try: try:
base, suffix = line.strip().split('\t') base, suffix = line.strip().split('\t')
stem_dict[f'{base}{suffix}'] = (base, suffix) stem_list.append([base, suffix])
except ValueError as _: except ValueError as _:
pass pass
return stem_dict return stem_list
def _load_suffixes(file: str): def _load_suffixes(file: str):
...@@ -54,16 +50,17 @@ def _load_lists(file: str) -> list: ...@@ -54,16 +50,17 @@ def _load_lists(file: str) -> list:
class SinhalaStemmer: class SinhalaStemmer:
def __init__(self): def __init__(self):
super().__init__() super().__init__()
self.stem_dictionary = _load_stem_dictionary() self.stem_list = _load_stem_dictionary()
self.suffixes = _load_suffixes(file='suffixes_list.txt') self.suffixes = _load_suffixes(file='suffixes_list.txt')
self.suffixes_normal = _load_lists(file='suffixes_list.txt') self.suffixes_normal = _load_lists(file='suffixes_list.txt')
self.suffixes_dependent_vowels = _load_lists(file='suffix_list_dependent_vowels.txt') self.suffixes_dependent_vowels = _load_lists(file='suffix_list_dependent_vowels.txt')
def step_one(self, text: str): def step_one(self, text: str):
if text in self.stem_dictionary: for items in self.stem_list:
return self.stem_dictionary[text] if items[0] == text:
else: return items[1]
return text else:
return text
def step_two(self, text: str) -> str: def step_two(self, text: str) -> str:
for subtext in self.suffixes_normal: for subtext in self.suffixes_normal:
...@@ -135,6 +132,7 @@ class SinhalaStemmer: ...@@ -135,6 +132,7 @@ class SinhalaStemmer:
for word in x: for word in x:
word = word.strip() word = word.strip()
step1_out = self.step_one(text=word) step1_out = self.step_one(text=word)
print(step1_out)
if step1_out == word: if step1_out == word:
step2_out = self.step_two(text=step1_out) step2_out = self.step_two(text=step1_out)
step3_out = self.step_three(text=step2_out) step3_out = self.step_three(text=step2_out)
...@@ -147,8 +145,10 @@ class SinhalaStemmer: ...@@ -147,8 +145,10 @@ class SinhalaStemmer:
if __name__ == "__main__": if __name__ == "__main__":
obj = SinhalaStemmer() obj = SinhalaStemmer()
input_word = "විදුලි බිල හා ජල බිල තුන් හතර ගුණයකින් වැඩිවී, වැඩි කලක් යන්නට මත්තෙන් නැවත විදුලි අර්බුදයක හා ජල අර්බුදයක බර ජනතාවගේ" input_word = "විදුලි බිල හා ජල බිල තුන් හතර ගුණයකින් වැඩිවී, වැඩි කලක් යන්නට මත්තෙන් නැවත විදුලි අර්බුදයක හා ජල අර්බුදයක බර ජනතාවගේ"
input_sentence = "සන්නිවේදනයේ මෙවලමක් ලෙස භාෂාවේ වටිනාකම වර්ධනය වූයේ මිනිසුන් වැඩි වැඩියෙන් පැතිරීමට හා අන්තර් ක්‍රියා කිරීමට පටන් ගැනීමත් සමඟ ය" input_sentence = "සන්නිවේදනයේ මෙවලමක් ලෙස භාෂාවේ වටිනාකම විදුලිඅර්බුද වර්ධනය වූයේ මිනිසුන් වැඩි වැඩියෙන් පැතිරීමට හා අන්තර් ක්‍රියා කිරීමට පටන් ගැනීමත් සමඟ ය"
print(input_sentence) input_sentence2 = 'විදුලිඅර්බුද'
# print(input_sentence2)
# input_list = ["මිනිසකු"] # input_list = ["මිනිසකු"]
out1 = obj.stemmer(input_sentence) out1 = obj.stemmer(input_sentence)
......
from sinhala_data_processor.preprocessor import SinhalaTokenizer
from sinhala_data_processor.preprocessor.stop_word_remover import StopWordRemover
from sinhala_data_processor.preprocessor.new_stemmer import SinhalaStemm
from sinhala_data_processor.preprocessor.stemmer import SinhalaStemmer
tokenizer = SinhalaTokenizer()
remover = StopWordRemover()
stemWords = SinhalaStemmer()
text = "පානදුර, දකුණ - උයන්කැලේ සමඟ කර්මාන්ත ශාලාවක හදිසි ගින්නක් හටගෙන තිබේ.පානදුර වායු සමීකරණක්"
remaining_words = remover.remove_stop_words(text)
#print(remaining_words)
# token_w = tokenizer.tokenize(text)
token_r = tokenizer.tokenize(remaining_words)
#print(token_r)
document = 'ඇතැම් වෛරස් රෝග වලට වැක්සීන හෙවත් එන්නත් ද වෛරස් නාශක ඖෂධ ද තිබුනද සියලූ‍ වෛරස් ' \
'සම්බන්ධයෙන් ඒ වැඩ කරන්නේ නැත. වසූරිය වෛරසය මිනිසා විසින් මිහිමතින් තුරන් කර තිබේ.'
doc2 = 'පානදුර, දකුණ - උයන්කැලේ ප්‍රදේශයේ කර්මාන්ත ශාලාවක හදිසි ගින්නක් හටගෙන තිබේ.පානදුර වායු සමීකරණ කර්මාන්ත ශාලාවක මෙම හදිසි ගින්න හටගෙන ඇති බව පොලීසිය පැවසුවේය.කළුතර නගර සභාවේ ගිනි නිවීම් ඒකකයේ නිලධාරීන් සහ පානදුර පොලීසියේ නිලධාරීන් එක්ව ගින්න මැඩපවත්වා ඇත.ගින්න ඇතිවීමට හේතුව මෙතෙක් අනාවරණය වී නොමැත.ගින්නෙන් කිසිඳු ජීවිත හානියක් සිදුවී නොමැති අතර සිදුවූ අලාභය පිළිබඳ මෙතෙක් තක්සේරු කර නොමැති බව ද පානදුර පොලීසිය සඳහන් කළේය.'
# tokenized_sentences = [tokenizer.tokenize(f'{ss}.') for ss in tokenizer.split_sentences(document)]
stemed = stemWords.stem(doc2)
#print(stemed)
sentence = 'මෆෝන්සේකාගෙන් අංකයක් අකාරයටම සියලු අවුරුදු ලක්ෂ අංගෝපාංගයන් ගණනක සිට වෛරස් වසංගත නිසා එළිපිටම පීඩා කරන්නේ නැතයි ආපදාවට ලක්වූ ජපාන නෞකාවේ ඉන්ධන ඉවත් කිරීමට ගිය දෙදෙනෙකු අතුරුදන්' \
'ලොව පුරා කොරෝනා ආසාදිතයන් දෙකෝටි පනස් ලක්ෂය ඉක්මවයි - නිරෝධායන සීමාවලට එරෙහිව ජර්මනියේ විරෝධතා' # your sentence
sentence2 = 'කොරෝනා මරණ මිලියනය ඉක්මවීම ශෝකජනක සන්ධිස්ථානයක් - ජගත් මහ ලේකම් කියයි'
t = tokenizer.tokenize(sentence)
stemmer = SinhalaStemmer()
for term in t:
word = term # your sentence
print(stemmer.stem(word))
#new_stm = SinhalaStemm()
#print(new_stm.stem_word(sentence2))
\ No newline at end of file
විදුලිඅර්බුද විදුලි
අංකද අංක අංකද අංක
අංකය අංක අංකය අංක
අංකයක් අංක අංකයක් අංක
...@@ -57,7 +58,7 @@ ...@@ -57,7 +58,7 @@
අක්කරයකට අක්කරයක අක්කරයකට අක්කරයක
අක්කරයක් අක්කරයක අක්කරයක් අක්කරයක
අක්කරෙයිපත්තුව අක්කරෙයිපත්තු අක්කරෙයිපත්තුව අක්කරෙයිපත්තු
අක්කරෙයිපත්තුවට අක්කරෙයිපත්තු අක්කරෙයිපත්තුවට අක්කරෙයිපත්තු
අක්කරෙයිපත්තුවේ අක්කරෙයිපත්තු අක්කරෙයිපත්තුවේ අක්කරෙයිපත්තු
අක්කරේපත්තුව අක්කරේපත්තු අක්කරේපත්තුව අක්කරේපත්තු
අක්කරේපත්තුවේ අක්කරේපත්තු අක්කරේපත්තුවේ අක්කරේපත්තු
...@@ -7312,7 +7313,7 @@ ...@@ -7312,7 +7313,7 @@
ගැටඵව ගැටඵ ගැටඵව ගැටඵ
ගැටයක් ගැටය ගැටයක් ගැටය
ගැටයේ ගැටය ගැටයේ ගැටය
ගැටලුවකට ගැටලුවක ගැටලුවකට ගැටලු
ගැටලුවකින් ගැටලුවකි ගැටලුවකින් ගැටලුවකි
ගැටළුන්ගෙන් ගැටළුන් ගැටළුන්ගෙන් ගැටළුන්
ගැටළුන්ට ගැටළුන් ගැටළුන්ට ගැටළුන්
...@@ -126,7 +126,6 @@ ...@@ -126,7 +126,6 @@
ම්වලට ම්වලට
ම්වලින් ම්වලින්
ම්වා ම්වා
යක යක
යකගෙන් යකගෙන්
යකගේ යකගේ
...@@ -186,7 +185,6 @@ ...@@ -186,7 +185,6 @@
වක වක
වකගෙන් වකගෙන්
වකගේ වකගේ
වකට
වකටම වකටම
වකම වකම
වකමත් වකමත්
......
...@@ -171,8 +171,12 @@ class HybridTransliterator: ...@@ -171,8 +171,12 @@ class HybridTransliterator:
def machine_mask(self, text: str,) -> str: def machine_mask(self, text: str,) -> str:
try: try:
# Call parent transliterator to get the initial output
rule_based = RuleBasedTransliterator()
output = rule_based.transliterator(text=text)
# Process output sentence by sentence # Process output sentence by sentence
paragraphs = text.split('\n') paragraphs = output.split('\n')
merged_para = [] merged_para = []
for paragraph in paragraphs: for paragraph in paragraphs:
......
This diff is collapsed.
This diff is collapsed.
{
"cells": [
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from sinhala_data_processor.preprocessor.stemmer import SinhalaStemmer\n",
"from sinhala_data_processor.preprocessor import SinhalaTokenizer\n",
"from sinhala_data_processor.preprocessor.stop_word_remover import StopWordRemover"
]
},
{
"cell_type": "code",
"execution_count": 21,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['විදුලිඅර්බ']\n"
]
}
],
"source": [
"stemmer_obj = SinhalaStemmer()\n",
"\n",
"input = 'විදුලි බිල හා ජල බිල තුන් හතර ගුණයකින් වැඩිවී, වැඩි කලක් යන්නට මත්තෙන් නැවත විදුලි අර්බුදයක හා ජල අර්බුදයක බර ජනතාවගේ හිස මත කඩා වැටී ඇත. විදුලිඅර්බුද මේ ඊයේ පෙරේදා දෙවනවරටත් ජල ගාස්තු සියයට 50 කට වැඩි ගණනකින් වැඩිකර ඇත. එසේම, නුදුරු අනාගතයේම විදුලි කප්පාදුවකට රජය අර අඳින බව පෙනෙන්නට තිබේ. අමාත්‍ය කංචන විජේසේකරගේ කතා බහෙන්ද ඒ බව ඉඟි කෙරේ. මීට හේතුව රටට බලපා ඇති දැඩි නියං තත්ත්වයයි. මේ නිසා ජල සහ විදුලි කප්පාදුවක් ළඟ ළඟම එන බව අප සියල්ලෝම තේරුම් ගත යුතුව ඇත. ජල සම්පාදන මණ්ඩලය ජලය කපා නොදමනවා කිව්වත් ඇත්ත නම්, පවතින නියඟය තව තව උග්‍ර වුවහොත්, ජල සම්පාදන හා පිරිපහදු මධ්‍යස්ථානවලට පානීය ජලය ලබාගැනීමේ දැඩි ගැටලුවකට මුහුණ දෙන්නට සිදුවීමයි. මෙනිසා ජලය, විදුලිය දැන් සිටම අරපිරිමැස්මෙන් භාවිත කිරීම අප කාගේත් යුතුකම වන අතර, උඩවලවේ අර්බුදය මෙන් විදුලි හා කෘෂිකර්ම ඇමැතිවරු කා කොටා නොගෙන පවතින ජලය කළමනාකරණය කර ගැනීම රජයේ වගකීම ය.' # your sentence\n",
"input2 = 'විදුලිඅර්බුද'\n",
"output = stemmer_obj.stemmer(input2)\n",
"\n",
"print(output)"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 11,
"outputs": [],
"source": [
"tokenizer = SinhalaTokenizer()\n",
"remover = StopWordRemover()"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 12,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"විදුලි බිල ජල බිල තුන් හතර ගුණයකින් වැඩිවී, කලක් යන්නට මත්තෙන් නැවත විදුලි අර්බුදයක ජල අර්බුදයක බර ජනතාවගේ හිස කඩා වැටී ඇත. ඊයේ පෙරේදා දෙවනවරටත් ජල ගාස්තු සියයට 50 කට ගණනකින් වැඩිකර ඇත. එසේම, නුදුරු අනාගතයේම විදුලි කප්පාදුවකට රජය අර අඳින පෙනෙන්නට තිබේ. අමාත්‍ය කංචන විජේසේකරගේ කතා බහෙන්ද ඉඟි කෙරේ. මීට හේතුව රටට බලපා දැඩි නියං තත්ත්වයයි. ජල විදුලි කප්පාදුවක් ළඟ ළඟම එන අප සියල්ලෝම තේරුම් ගත යුතුව ඇත. ජල සම්පාදන මණ්ඩලය ජලය කපා නොදමනවා කිව්වත් ඇත්ත නම්, පවතින නියඟය උග්‍ර වුවහොත්, ජල සම්පාදන පිරිපහදු මධ්‍යස්ථානවලට පානීය ජලය ලබාගැනීමේ දැඩි ගැටලුවකට මුහුණ දෙන්නට සිදුවීමයි. මෙනිසා ජලය, විදුලිය සිටම අරපිරිමැස්මෙන් භාවිත කිරීම අප කාගේත් යුතුකම අතර, උඩවලවේ අර්බුදය විදුලි කෘෂිකර්ම ඇමැතිවරු කා කොටා නොගෙන පවතින ජලය කළමනාකරණය කර ගැනීම රජයේ වගකීම ය.\n"
]
}
],
"source": [
"remaining_words = remover.remove_stop_words(input)\n",
"print(remaining_words)"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 13,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['විදුලි', 'බිල', 'හා', 'ජල', 'බිල', 'තුන්', 'හතර', 'ගුණයකින්', 'වැඩිවී', ',', 'වැඩි', 'කලක්', 'යන්නට', 'මත්තෙන්', 'නැවත', 'විදුලි', 'අර්බුදයක', 'හා', 'ජල', 'අර්බුදයක', 'බර', 'ජනතාවගේ', 'හිස', 'මත', 'කඩා', 'වැටී', 'ඇත', '.', 'මේ', 'ඊයේ', 'පෙරේදා', 'දෙවනවරටත්', 'ජල', 'ගාස්තු', 'සියයට', '50', 'කට', 'වැඩි', 'ගණනකින්', 'වැඩිකර', 'ඇත', '.', 'එසේම', ',', 'නුදුරු', 'අනාගතයේම', 'විදුලි', 'කප්පාදුවකට', 'රජය', 'අර', 'අඳින', 'බව', 'පෙනෙන්නට', 'තිබේ', '.', 'අමාත්\\u200dය', 'කංචන', 'විජේසේකරගේ', 'කතා', 'බහෙන්ද', 'ඒ', 'බව', 'ඉඟි', 'කෙරේ', '.', 'මීට', 'හේතුව', 'රටට', 'බලපා', 'ඇති', 'දැඩි', 'නියං', 'තත්ත්වයයි', '.', 'මේ', 'නිසා', 'ජල', 'සහ', 'විදුලි', 'කප්පාදුවක්', 'ළඟ', 'ළඟම', 'එන', 'බව', 'අප', 'සියල්ලෝම', 'තේරුම්', 'ගත', 'යුතුව', 'ඇත', '.', 'ජල', 'සම්පාදන', 'මණ්ඩලය', 'ජලය', 'කපා', 'නොදමනවා', 'කිව්වත්', 'ඇත්ත', 'නම්', ',', 'පවතින', 'නියඟය', 'තව', 'තව', 'උග්\\u200dර', 'වුවහොත්', ',', 'ජල', 'සම්පාදන', 'හා', 'පිරිපහදු', 'මධ්\\u200dයස්ථානවලට', 'පානීය', 'ජලය', 'ලබාගැනීමේ', 'දැඩි', 'ගැටලුවකට', 'මුහුණ', 'දෙන්නට', 'සිදුවීමයි', '.', 'මෙනිසා', 'ජලය', ',', 'විදුලිය', 'දැන්', 'සිටම', 'අරපිරිමැස්මෙන්', 'භාවිත', 'කිරීම', 'අප', 'කාගේත්', 'යුතුකම', 'වන', 'අතර', ',', 'උඩවලවේ', 'අර්බුදය', 'මෙන්', 'විදුලි', 'හා', 'කෘෂිකර්ම', 'ඇමැතිවරු', 'කා', 'කොටා', 'නොගෙන', 'පවතින', 'ජලය', 'කළමනාකරණය', 'කර', 'ගැනීම', 'රජයේ', 'වගකීම', 'ය', '.']\n"
]
}
],
"source": [
"t = tokenizer.tokenize(input)\n",
"print(t)"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [],
"metadata": {
"collapsed": false,
"pycharm": {
"is_executing": true
}
}
},
{
"cell_type": "code",
"execution_count": 13,
"outputs": [],
"source": [],
"metadata": {
"collapsed": false
}
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment