Created
October 18, 2017 15:39
-
-
Save mkhuda/e704f73830af13c63be41b3015be7605 to your computer and use it in GitHub Desktop.
Text processing helper on Rails, used to process "RAW" data of KBBI.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module TextProcessingHelper | |
MAIN_ARR = [ | |
['dr', 'dari'], | |
['dl', 'dalam'], | |
['dng', 'dengan'], | |
['dsb', 'dan sebagainya'], | |
['dp', 'dari pada'], | |
['dst', 'dan seterusnya'], | |
['krn', 'karna'], | |
['kpd', 'kepada'], | |
['msl', 'misalnya'], | |
['sbg', 'sebagai'], | |
['spt', 'seperti'], | |
['utk', 'untuk'], | |
['pd', 'pada'], | |
['yg', 'yang'] | |
] | |
MAIN_ARR_KATEGORI = [ | |
['a', 'adjektiva', 'kata yang menjelaskan nomina (kata benda)'], | |
['n', 'nomina', 'kata benda'], | |
['p', 'partikel', 'kelas kata yang meliputi kata depan, kata sambung, kata seru, kata sandang, ucapan salam'], | |
['v', 'verba', 'kata kerja'], | |
['adv', 'adverbia', 'kata yang menjelaskan verba, adjektiva dan jenis verba lain'], | |
['kl', 'klasik', 'kata yang berlabel yang digunakan dalam ragam kesusastraan Melayu Klasik'], | |
['sas', 'sastra', 'sejenis kata yang menjelaskan tentang karya sastra'], | |
['cak' , 'cakapan', 'ragam cakapan untuk menandai kata dalam ragam tidak baku'], | |
['cn', 'cina', 'berasal dari Bahasa Cina atau berhubungan dengan Cina'], | |
['jw', 'jawa', 'berasal dari Bahasa Jawa atau berhubungan dengan Jawa'], | |
['jk', 'jakarta', 'kata yang berhubungan dengan Bahasa Melayu Jakarta'], | |
['mat', 'matematika', 'kata yang berhubungan dengan Ilmu Matematika'], | |
['bio', 'biologi', 'kata yang berhubungan dengan Ilmu Biologi'], | |
['fis', 'fisika', 'kata yang berhubungan dengan Ilmu Fisika'], | |
['hidm', 'hidrometeorologi', 'kata yang berhubungan dengan cabang ilmu meteorologi'], | |
['tek', 'teknologi', 'kata yang berhubungan dengan dunia Teknologi'], | |
['dok', 'kedokteran', 'kata yang berhubungan dengan Ilmu Kedokteran'], | |
['kim', 'kimia', 'kata yang berhubungan dengan Ilmu Kimia'], | |
['bl', 'bali', 'kata yang berhubungan dengan Bali atau Bahasa Bali'], | |
['ark', 'arkeologi', 'kata yang berhubungan dengan zaman kuno maupun dunia purbakala'], | |
['sd', 'sunda', 'berasal dari Bahasa Sunda atau berhubungan dengan Sunda'], | |
['pol', 'politik', 'kata yang berhubungan dengan dunia politik'], | |
['geo', 'geografi', 'kata yang berhubungan dengan geografi atau geologi'], | |
['isl', 'islam', 'kata yang berhubungan dengan Agama Islam'], | |
['kris', 'kristen', 'kata yang berhubungan dengan Agama Kristen'], | |
['kat', 'katolik', 'kata yang berhubungan dengan Agama Katolik'], | |
['mk', 'minangkabau', 'kata yang berhubungan dengan Minangkabau'], | |
['ar', 'arab', 'kata yang berasal dari Bahasa Arab'], | |
['bld', 'belanda', 'kata yang berasal dari Bahasa Belanda'] | |
] | |
def process_singkatan() | |
print "Enter Step (1 until 8 steps) [type [number]]: " | |
step = $stdin.gets.chomp | |
if step == '1' | |
GlossaryKataKbbi.where(id: 1..5000).each do |data| | |
GlossaryKataKbbi.record_timestamps=false | |
id = data.id | |
string_decoder = HTMLEntities.new.decode(data.artikata) | |
string_parse = Nokogiri::HTML.fragment(string_decoder) | |
final_string = string_parse.to_s | |
self.process_glossary(final_string) | |
GlossaryKataKbbi.find_by(:id => id).update_attribute(:artikatafinal, final_string) | |
end | |
elsif step == '2' | |
GlossaryKataKbbi.where(id: 5001..10000).each do |data| | |
GlossaryKataKbbi.record_timestamps=false | |
id = data.id | |
string_decoder = HTMLEntities.new.decode(data.artikata) | |
string_parse = Nokogiri::HTML.fragment(string_decoder) | |
final_string = string_parse.to_s | |
self.process_glossary(final_string) | |
GlossaryKataKbbi.find_by(:id => id).update_attribute(:artikatafinal, final_string) | |
end | |
elsif step == '3' | |
GlossaryKataKbbi.where(id: 10001..15000).each do |data| | |
GlossaryKataKbbi.record_timestamps=false | |
id = data.id | |
string_decoder = HTMLEntities.new.decode(data.artikata) | |
string_parse = Nokogiri::HTML.fragment(string_decoder) | |
final_string = string_parse.to_s | |
self.process_glossary(final_string) | |
GlossaryKataKbbi.find_by(:id => id).update_attribute(:artikatafinal, final_string) | |
end | |
elsif step == '4' | |
GlossaryKataKbbi.where(id: 15001..20000).each do |data| | |
GlossaryKataKbbi.record_timestamps=false | |
id = data.id | |
string_decoder = HTMLEntities.new.decode(data.artikata) | |
string_parse = Nokogiri::HTML.fragment(string_decoder) | |
final_string = string_parse.to_s | |
self.process_glossary(final_string) | |
GlossaryKataKbbi.find_by(:id => id).update_attribute(:artikatafinal, final_string) | |
end | |
elsif step == '5' | |
GlossaryKataKbbi.where(id: 20001..25000).each do |data| | |
GlossaryKataKbbi.record_timestamps=false | |
id = data.id | |
string_decoder = HTMLEntities.new.decode(data.artikata) | |
string_parse = Nokogiri::HTML.fragment(string_decoder) | |
final_string = string_parse.to_s | |
self.process_glossary(final_string) | |
GlossaryKataKbbi.find_by(:id => id).update_attribute(:artikatafinal, final_string) | |
end | |
elsif step == '6' | |
GlossaryKataKbbi.where(id: 25001..30000).each do |data| | |
GlossaryKataKbbi.record_timestamps=false | |
id = data.id | |
string_decoder = HTMLEntities.new.decode(data.artikata) | |
string_parse = Nokogiri::HTML.fragment(string_decoder) | |
final_string = string_parse.to_s | |
self.process_glossary(final_string) | |
GlossaryKataKbbi.find_by(:id => id).update_attribute(:artikatafinal, final_string) | |
end | |
elsif step == '7' | |
GlossaryKataKbbi.where(id: 30001..35000).each do |data| | |
GlossaryKataKbbi.record_timestamps=false | |
id = data.id | |
string_decoder = HTMLEntities.new.decode(data.artikata) | |
string_parse = Nokogiri::HTML.fragment(string_decoder) | |
final_string = string_parse.to_s | |
self.process_glossary(final_string) | |
GlossaryKataKbbi.find_by(:id => id).update_attribute(:artikatafinal, final_string) | |
end | |
else | |
GlossaryKataKbbi.where(id: 35001..40000).each do |data| | |
GlossaryKataKbbi.record_timestamps=false | |
id = data.id | |
string_decoder = HTMLEntities.new.decode(data.artikata) | |
string_parse = Nokogiri::HTML.fragment(string_decoder) | |
final_string = string_parse.to_s | |
self.process_glossary(final_string) | |
GlossaryKataKbbi.find_by(:id => id).update_attribute(:artikatafinal, final_string) | |
end | |
end | |
end | |
def process_detecting_artikata() | |
result = [] | |
GlossaryKataKbbi.where(id: 14408).each do |data| | |
split_by_punc = data.artikatafinal.split(';') | |
split_shift = split_by_punc.shift | |
split_by_punc.each do |p| | |
result << process_detect_punctuation(data.katakunci, p) | |
end | |
end | |
return result | |
end | |
def process_glossary(string) | |
MAIN_ARR.each {|rep| string.gsub!(rep[0], rep[1])} | |
end | |
def process_split_br(string) | |
# strip dengan br karna arti kata dengan bentuk lain dipisahkan dengan <br/> | |
# selanjutnya untuk di parsing berdasarkan punctuation ; lihat (process_detect_punctuation) | |
string.split(/<\s*[Bb][Rr]\s*\/*>/) | |
end | |
def process_detect_punctuation(string_source, string) | |
## method | |
### DASH METHOD | |
# 1. jika kata pertama adalah double strip, bisa jadi akan adanya kata imbuhan | |
# setelahnya berbentuk tag bold => maka lanjutkan method nomor 2 | |
# 2. jika kata pertama adalah double strip dan kedua adalah bold => dipastikan itu adalah kata imbuhan baru (codename: imbuhanbaru) [STOP] | |
# 3. jika kata pertama adalah double strip dan kedua bukan bold => (codename: bukanimbuhanbaru) | |
### BOLD METHOD | |
# 1. jika kata pertama adalah bold => maka lanjutkan method nomor 2 | |
# 2. jika bold berisi nomor => (codename: boldnumber) | |
# 3. jika bold berisi middle dot => (codename: middledot) | |
raw_method = '' | |
string_lstrip = string.lstrip | |
string_gsub = string_lstrip.gsub('--', '-- ') | |
partition = string_gsub.partition(" ") | |
first_partition = partition.first | |
second_partition = partition.last | |
second_sub_partition = Nokogiri::HTML.fragment(second_partition) | |
if (first_partition.include? '--') | |
if (second_sub_partition.children[0].name == 'b') | |
raw_method += 'imbuhanbaru' | |
string_source = second_sub_partition.children[0].text | |
else | |
raw_method += 'dashednobold' | |
end | |
end | |
if Nokogiri::HTML.fragment(first_partition).children[0].name == 'b' | |
raw_method += 'bold' | |
end | |
if is_num?(Nokogiri::HTML.fragment(first_partition).children[0].text) | |
raw_method += 'number' | |
end | |
if first_partition.match(/[\u00B7]/) | |
raw_method += 'middledot' | |
end | |
return [string_source, raw_method, string] | |
end | |
def is_num?(str) | |
!!Integer(str) | |
rescue ArgumentError, TypeError | |
false | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment