Gweithrediadau

Prosesu treigladau gyda meddalwedd

Oddi ar Hedyn

The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Esboniad

Mae angen cod agored i adnabod treigladau. Byddai gymaint o bosibiliadau!

Dw i eisiau datblygu ategyn WordPress i ychwanegu treigladau cywir i chwilio. Ar hyn o bryd mae angen chwilio am 'Caer', 'Gaer', 'Nghaer' ar wahan. Gyda'r ategyn byddai modd chwilio am un ohnonyn nhw yn unig a derbyn canlyniadau gyda phob fersiwn.

Felly... os ydyn ni'n gallu sgwennu ffug-cod gyda'n gilydd byddai modd sgwennu'r ategyn a rhyddhau'r cod dan GPL.

Er mwyn cael prosiect haws:

  • Efallai gwnawn ni ddechrau gyda'r fersiwn 'geiriadur' o'r gair yn unig - yn yr enghraifft mae pobl yn debygol i chwilio am 'Caer' yn hytrach nag unrhyw fersiwn arall.
  • Anghofia gwrywaidd a benywaidd ar hyn o bryd (byddai angen rhestr o eiriau fel arall)

O'n i'n meddwl bod system gyda http://kevindonnelly.org.uk/ ond dw i'n methu ffeindio fe. Hefyd bydda'r broses datblygu yn hwyl! --Carlmorris (sgwrs) 20:20, 5 Hydref 2012 (BST)

Dyma ddolen at ramadeg Cymraeg Kevin Donnelly: [1]--hywelm (sgwrs) 23:41, 16 Hydref 2012 (BST)hywelm

Y treigladau

Llythyren Meddal Trwynol Llais H-bom
p b mh ph
t d nh th
c g ngh ch
b f m
d dd n
g /hwyl fawr g/ ng
m f
ll l
rh r
aeiouwy rhoi h arno!


Y ffug-god

// cynhyrchu llinyn gyda phob fersiwn o'r gair
// e.e. mewnbwn Caer yn cael allbwn 'Caer NEU Gaer NEU Nghaer NEU Chaer'
llinyn cynhyrchu_treigladau(llinyn $gair)
{
  llinyn $chwiliad = $gair;

  os ydy'r llythyren gyntaf o'r $gair ar y tabl? {
    // ydy felly mae'r gair yn gallu treiglo
    cer trwy pob llythyren ar y tabl {
      $chwiliad += 'NEU';
      $chwiliad += cyfnewid_llythyren_gyntaf($gair); // parchu maint y llythyren (C yn newid i G, c yn newid i g)
    }
  $chwiliad = '(' + $chwiliad + ')';
  }
  fel arall {
  // nac ydy felly dyw'r gair ddim yn dreiglo
  // e.e. aderyn, Aberystwyth,
  // byddai $chwiliad == $gair
  }

  dychwelyd $chwiliad;
}


llinyn chwilio(llinyn mewnbwn_chwiliad)
{
  cer trwy pob $gair ym $mewnbwn_chwiliad
  {
    cyfnewid cynhyrchu_treigladau($gair) am $gair
  }
}

Cod MySQL i chwilio gyda threigladau

Fe wnes i geisio ar beth tebyg gan ddefnyddio cod "LIKE" mewn chwiliad MySQL. Nes i erioed ei gwblhau, ond y syniad oedd gennyf oedd cwtogi y 3 llythyren oddi ar flaen gair, gan mai dene fydd y nifer fwyaf o lythrennau posib sy'n gysylltiedig â'r treiglo, wedyn defnyddio "LIKE" i geisio paru gweddill y gair gyda chronfa data wedi ei seilio ar eiriadur rhydd.

Cod dwi eisoes yn ei ddefnyddio ydi hwn, sydd bellach tu ôl i http://www.efrydydd.com (dwi wedi bod yn gweithio arno'n ddiweddar):

$chwilio = "SELECT id, cymraeg_u, saesneg_u, cenedl_c, cenedl_s FROM termau WHERE dangos='1' AND cymraeg_u LIKE '%$allweddair%' OR saesneg_u LIKE '%$allweddair%'"; Os nad oes gair yn gallu cael ei baru, bydd y tri llythyren cyntaf yn cael ei basio ymlaen at system cyfaddawdu, ble bydd yn dyfalu be gall fod, gan roi restr o bosibiliadau.

Perl

Darn bach o Perl i roi amrywiadau o air wedi treiglo. Dydi hwn ddim yn parchu maint llythrennau, fel y ffug-god uchod, ond gan bod SQL ddim chwaith, does dim angen rili.

my @geiriau = treiglo('gair');

BEGIN {
	my %t=(p=>['b','mh','ph'],t=>['d','nh','th'],c=>['g','ngh','ch'],b=>['f','m'],d=>['dd','n'],g=>['','ng'],ll=>['l'],'m'=>['f'],rh=>['r']);
	sub treiglo{$_[0]=~/^([cpt](?!h)|d(?!d)|[gbm]|ll|rh)(.*)$/io ? map{$_.$2} @{$t{$1}} : undef}
}

PHP

Fersiwn sydyn o’r uchod yn PHP. Lot hyllach na’r fersiwn Perl wrth gwrs ;-)

$geiriau = treiglo('gair');

function treiglo($gair){
	static $t=array('p'=>array('b','mh','ph'),'t'=>array('d','nh','th'),'c'=>array('g','ngh','ch'),'b'=>array('f','m'),'d'=>array('dd','n'),'g'=>array('','ng'),'ll'=>array('l'),'m'=>array('f'),'rh'=>array('r'));
	$g=array();
	if (preg_match('/^([cpt](?!h)|d(?!d)|[gbm]|ll|rh)(.*)$/i',$gair,$m)){
		foreach($t[strtolower($m[1])] as $x) $g[]=$x.$m[2];
		return $g;
	}
	return null;
}

Python 2.6

Rwy'n meddwl ei fod yn gweithio'n iawn ond heb ei ddefnyddio'n iawn --hywelm (sgwrs) 00:00, 25 Hydref 2012 (BST)

def  treiglo(gair):
    tabl = {}
    fersiynau = [gair]
    tabl["c"] = ["g","ngh","ch"]
    tabl["p"] = ["b","mh","ph"]
    tabl["t"] = ["d","nh","th"]
    tabl["g"] = ["","ng"]
    tabl["b"] = ["f","m"]
    tabl["d"] = ["dd","n"]
    tabl["m"] = ["f"]
    tabl["ll"] = ["l"]
    tabl["rh"] = ["r"]
    llafariaid = "aeiouwy"
    gair_gwreiddiol = gair
    gair = gair.lower()
    
    if tabl.has_key(gair[:2]):
        gair_heb_flaen = gair[2:]
        llyth_dreigl = tabl[gair[:2]] [0]
        gair_treigl = llyth_dreigl + gair_heb_flaen
        fersiynau.append(gair_treigl)
    else:
        gair_heb_flaen = gair[1:]
        llyth_flaen = gair[0]
        if tabl.has_key(llyth_flaen):
            for ll in tabl[llyth_flaen]:
                gair_treigl = ll + gair_heb_flaen
                fersiynau.append(gair_treigl)
        elif llyth_flaen in llafariaid:
            gair_treigl = 'h'+ gair
            fersiynau.append(gair_treigl)
        else:
            #ddim yn treiglo
            pass
"""
os byddwch yn chwilio am ymadrodd yn lle gair, bydd y darn canlynol yn newid llythrennau blaen
y geiriau, heblaw am y cyntaf, i ddechrau gyda llythyren fach - eisiau ei gywiro
"""           
    if gair_gwreiddiol.isupper():
        for g in range(0, len(fersiynau)):
            fersiynau[g] = fersiynau[g].capitalize()  
            
    return fersiynau

if __name__ == '__main__':
    gair = raw_input("Pa air?")
    chwilio_am = treiglo(gair)
    print chwilio_am
 

Ategyn WordPress

Wedi nocio rhywbeth sydyn at ei gilydd a'i rhoi mewn ategyn efo ambell beth defnyddiol arall dwi'n defnyddio ar safleoedd Cymraeg (trefnolion dyddiad a chywiro collnodau ar eiriau fel 'sdim). Dydi'r SQL ddim yn arbennig o effeithlon, ond mae'n dilyn patrwm WordPress. Croeso i rywun awgrymu pethau eraill i ychwanegu. Neu addasu yn ôl yr angen. [IS]

http://slebog.net/pecynnau/wordpress/cymraeg/cymraeg.zip