Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@mkhuda
Created October 18, 2017 15:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mkhuda/e704f73830af13c63be41b3015be7605 to your computer and use it in GitHub Desktop.
Save mkhuda/e704f73830af13c63be41b3015be7605 to your computer and use it in GitHub Desktop.
Text processing helper on Rails, used to process "RAW" data of KBBI.
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