Rouzeta - beyondnlp/nlp GitHub Wiki
Rouzeta
- Rouzeta๋ ์ด์ํธ ๋ฐ์ฌ๊ฐ ์ต๊ทผ์ ๊ณต๊ฐํ WFST๋ฅผ ๊ธฐ๋ฐ ํํ์ ๋ถ์๊ธฐ์ ํ๋ก์ ํธ๋ช ์ด๋ค.
- Rouzeta๋ ๋จ์ํ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์์์ผ ํ ์ฌ๋ฌ๊ฐ์ง ์ ๋ณด๋ค์ด ์์ง๋ง ์ด๋ฅผ ๋ถ์ํ๋ ๊ฒ์ ๋ค๋ฅธ ์ฐจ์์ ์์ ์ด๋ค.
- Rouzeta๋ฅผ ๋ค์ด ๋ฐ์ ์์ถ์ ํ๋ฉด Rouzeta์ Tagger๋๋ ํ ๋ฆฌ๊ฐ ์๊ณ Rouzeta๋๋ ํ ๋ฆฌ์ ๋ค์ 4๊ฐ์ ํ์ผ์ด ์กด์ฌํ๋ค.
korean.lexc : ํํ์ ๊ฐ์ ์ ์ด๋ฅผ ์คํ ๋งํ๋ก ํํ, ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ํํ์๊ฐ ๋ฑ์ฌ๋ผ ์๊ณ ํ์ฌ๊ฐ ์ ์ด๋ ๊ธฐ์ ๋ผ ์๋ค.
morphrules.foma : ๊ตฌ์ถ๋ ํํ์ ์คํ ๋งํ ์ค ๋ถํ์ํ edga๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํด ๊ธฐ์ ๋ ๊ท์น ํ์ผ
splithangul.foma : ์์ฑํ์ ์กฐํฉํ์ผ๋ก ๋ฐ๊พธ๊ธฐ ์ํ ๊ท์น ํ์ผ
kormoran.script : ์ต์ข
์คํ ๋งํ๋ฅผ ๋ง๋ค๊ธฐ ์ํ ์คํฌ๋ฆฝํธ ํ์ผ
- ์ ํ์ผ๋ค์ ๋ถ์ํ๊ธฐ ์ํด์๋ ํํ์ ๋ถ์์ ๋ํ ๊ธฐ๋ณธ ๊ธฐ์๊ณผ ํจ๊ป lexc, foma, xfst์ ๋ํ ์ง์๋ ํ์ํ๋ค.
- ์๋ ์ ๋ฆฌ๋ ๋ด์ฉ์ ๊ทธ๋๊ทธ๋ ํ์ํ ๋ด์ฉ์ ์์์์ด ๋์ดํ ๊ฒ์ด๋ค.
- Rouzeta Home
- https://shleekr.github.io/
- KSC5601 ํ๊ธ๋ง ์ฒ๋ฆฌ ๊ฐ๋ฅ( splithangul.foma(2352์) = ksc5601 + ๋ ,์ด )
- Rouzeta ์ฌ์ ์ ๋ฑ์ฌ๋ ์ํธ๋ฆฌ๋ ๋ชจ๋ ksc5601(2350)๋ด์ ์๋ ์์ ๋ก ๊ตฌ์ฑ๋ผ ์๋ค.
- ์๋ ๊ฒฐ๊ณผ๋ ๋ถ๊ท์น์ ๋ํ ๊ฒ๊ณผ, ksc5601์ ๋์ด๊ฐ๋ ๊ธ์์ ๋ํ ์ฒ๋ฆฌ๊ฒฐ๊ณผ์ ๋๋ค.
apply up> ๊ณ ๋ง์ ๋ค ๊ณ ๋ง/irrb/vj์/ep๋ค/ef ๊ณ ๋ง/irrb/vj์/ep๋ค/ex apply up> ๋ ๋ฐฉ๊ฐํ #ksc5601์ ๋์ด๊ฐ๋ ๊ฒ์ ???๋ก ๋ํ๋๋ค. ??? apply up> ํฒ์ ??? apply up> ๊ธฐ์ค๊น๋ค ๊ธฐ์ค/nr๊น๋ค/nc ๊ธฐ์ค/nr๊น/nc๋ค/nc ๊ธฐ์ค/nr๊น/nc๋ค/np ๊ธฐ์ค/nr๊น/nc๋ค/xn ๊ธฐ์ค/nr๊น/nc๋ค/dn ๊ธฐ์ค/nr๊น/nc์ด/pp๋ค/ef ๊ธฐ์ค/nr๊น/nc์ด/pp๋ค/ex apply up> ๋ท ???
# Background knowledge
* foma download url
* http://slideplayer.com/slide/11006062/
* http://foma.googlecode.com/
* foma notation
[ ] grouping ? any symbol ?* any sequence a a single symbol \a any symbol except a \C any symbol except a consonant, C presumably defined with "define" .#. word edge in rule contexts [a|b] a or b [C|.#.] a consonant or word edge a* any number of a symbols (a) optionally a .o. compose
* http://foma.sourceforge.net/lrec2010/lrec2010handout.pdf
* http://udel.edu/~heinz/classes/2015/608/materials/foma/foma.pdf
* https://www.cs.jhu.edu/~jason/465/PDFSlides/lect17-fsmbuild.pdf
* http://foma.sourceforge.net/dokuwiki/doku.php?id=wiki:interfacereference
* http://slideplayer.com/slide/10878857/
* FAQ: When to use lexc vs. xfst?
* lexc๋ union ์ฐ์ฐ์์ ๋ํด ์ต์ ํ ๋ผ ์์ด์ ๋ง์ ์๋ฅผ unionํ ๋ ์ฌ์ฉ์ ๋น ๋ฅด๋ค.
* explain Rouzeta
* https://github.com/dsindex/rouzeta
## Kyoto Fst Decoder
* ์คํ ๋งํ๋ฅผ ๊ตฌ์ฑํํ ์
๋ ฅ ๋ฌธ์ฅ๊ณผ ์ปดํฌ์ง์
ํ ํ minimum distance๋ฅผ ๊ตฌํ๋๋ฐ kyfd๋ฅผ ์ฌ์ฉํ๋ค.
* kyfd : http://www.phontron.com/kyfd/
* kyfd๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ OpenFst ์ Xerces-C++๊ฐ ์ค์น๋ผ ์์ด์ผ ํ๋ค.
* kyfd์ ๋ํ ์์ธํ ์ค๋ช
์ ์ดํ์ ๋ค์ ์์ฑ ์์
## Standard:์ ๊ทํํ์์ ์๊ฐํ๋ฉด ์ดํดํ๊ธฐ ์ฝ๋ค.
```
A B Concatenation
A | B Union
A & B Intersection
A* Kleene star
A+ Kleene plus
$A โContainsโ a string from A
A-B Subtraction
~A Complement of A
A.r Reverse of A
(A) Optionally A (same as A | 0)
```
#Transducer-related:
```
A:B Cross-product of A and B
A .o. B Composition of A and B # <--- ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ๊ธฐ๋ฅ
A.i Invert A # <--- ์ ์ฉ๋ฐฉํฅ์ ๋ฐ๋๋ก
A.u Extract upper side (domain) of A
A.l Extract lower side (range) of A
A .P. B Priority union of A and B
```
## Rewrite operations:
```
A -> B Rewrite strings in A as B
A (->) B Optionally rewrite A as B
A -> B || C _ D Conditional rewrite of A as B (between C and D)
[..] -> B || C _ D Insert a single B between C and D
A -> B , C -> D ,... Multiple simultaneous rewrites (w/ or w/o contexts)
A -> B ... C Markup: insert B before and C after A (w/ or w/o contexts)
```
## https://code.google.com/archive/p/foma/wikis/RegularExpressionReference.wiki
## etc
```
optional replacement (->)
longest-leftmost @->
shortest-leftmost @>
```
## Special symbols:
```
0 or [] Epsilon (the empty string)
? The โanyโ symbol
.#. Word boundary in rewrite rules
[ and ] Grouping symbols for forcing precedence
โ โ Reserved symbols need to be escaped by quotes
```
## example
## Rouzeta ์ต์์ ROOT ์ ์ธ
* ROOT๋ ๋ค์์ vertex๋ฅผ ๊ฐ์ง๋ค
```
LEXICON Root
ncLexicon ; ! ๋ณดํต๋ช
์ฌ
nbLexicon ; ! ์ซ์
nrLexicon ; ! ๊ณ ์ ๋ช
์ฌ
...
```
* acLexicon == ์ ์๋ถ์ฌ
* ๊ณ ๋ก/ac acNext
* ๊ณ ๋ก/ac๋ acNext์ edge๋ฅผ ๊ฐ์ง๋๋ฐ acNext๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒ๋ค๋ก ์ ์ํ๋ค.
```
LEXICON acLexicon ! ์ ์๋ถ์ฌ
๊ณ ๋ก/ac acNext ;
๊ณง/ac acNext ;
๊ทธ๋/ac acNext ;
...
LEXICON acNext
finLexicon ;
srLexicon ;
...
LEXICON srLexicon ! ๋ซ๋๋ฐ์ดํ
%"/sr srNext ;
%'/sr srNext ;
%)/sr srNext ;
%>/sr srNext ;
%]/sr srNext ;
%}/sr srNext ;
โ/sr srNext ;
โ/sr srNext ;
โซ/sr srNext ;
ใ/sr srNext ;
ใ/sr srNext ;
ใ/sr srNext ;
ใ/sr srNext ;
ใ/sr srNext ;
ใ/sr srNext ;
๏ผ/sr srNext ;
๏ผ/sr srNext ;
LEXICON xvLexicon ! ๋์ฌํ์์ ๋ฏธ์ฌ
๊ฑฐ๋ฆฌ/xv xvNext ;
๋นํ/xv xvNext ;
๋นํ/xv xvNext ;
...
LEXICON naNext
xvLexicon ;
LEXICON naLexicon ! ๋์์ฑ๋ณดํต๋ช
์ฌ
๊ฐ๊ฐ๋์/na naNext ;
๊ฐ๊ฐ/na naNext ;
๊ฐ๊ฒฉ/na naNext ;
๊ฐ๊ฒฉ์ธํ/na naNext ;
...
```
* ๊ฐ๊ฒฉ๋นํ๋ค => ๊ฐ๊ฒฉ + ๋นํ๋ค => naLexicon -> naNext -> xvLexicon
## korean.lexc : ํํ์(vertex)๋ค ๊ฐ์ ๊ด๊ณ(edge)๋ฅผ ๊ธฐ์
## morphrules.foma
* NounStringSet
* define NounStringSet [ NounSet | %/xn ] ;
* define NounSet [ %/na | %/nc | %/nd | %/ni | %/nm | %/nn | %/np | %/nr | %/ns | %/nu ] ;
* FilterPT0์ ๋ํ ์ ์
* '์ฌ๊ณผ'์ ๊ฐ์ ๋ฌด์ข
์ฑ ๋ช
์ฌ์ '์' ์กฐ์ฌ์ edge๋ฅผ ์ ๊ฑฐ
* ๋ฌด์ข
์ฑ + ๋ช
์ฌํ๊ทธ + ์/pt <-๋ฅผ ์ ๊ฑฐ
```
! ์/๋
! Filter0 : ์ฌ๊ณผ๋
define FilterPT0 ~$[ FILLC NounStringSet ใ
ใ
ก %_ใด %/pt ] ;
```
* FilterPT1์ ๋ํ ์ ์
* '์ฌ๋'๊ณผ ๊ฐ์ ์ ์ข
์ฑ ๋ช
์ฌ์ '๋' ์กฐ์ฌ์ edgae๋ฅผ ์ ๊ฑฐ
* ์ ์ข
์ฑ + ๋ช
์ฌํ๊ทธ + ๋/pt <- ๋ฅผ ์ ๊ฑฐ
```
! Filter1 : ์ฌ๋์
define FilterPT1 ~$[ [Coda - FILLC] NounStringSet ใด ใ
ก %_ใด %/pt ] ;
```
## splithangul.foma : ์์๋ถ๋ฆฌ

```
define split ๊ฐ -> ใฑ ใ
%_%_ .o.
๊ฐ -> ใฑ ใ
%_ใฑ .o.
๊ฐ -> ใฑ ใ
%_ใด .o.
๊ฐ -> ใฑ ใ
%_ใท ;
regex split;
apply down> ๊ฐ
ใฑใ
__
apply down> ๋
๋
apply down> ๋ค
๋ค
apply down> ๊ฐ
ใฑใ
_ใฑ
apply down> ๊ฐ
ใฑใ
_ใด
```
## ์ด๋ฏธํํ
```
%_ใ
๊ฒ/ec ecNext ;
%_ใ
๊นจ/ec ecNext ;
%_ใ
๊ป/ec ecNext ;
๊ฐ/ec ecNext ;
๊ฐ๊ฐ/ec ecNext ;
```
* %๊ฐ ๋ถ์ ๊ฒ์ ์์ ์ด ์์ฑ๋์ง ์์ ์ข
์ฑ์ ๋ถ์ธ๋ค.
## ํ์ธ ํ์1
* '<' ์ ์๋ฏธ
```
LEXICON neLexicon ! ์์ด
< Alphabet+ %/ne > neNext ;
```
## FILLC
* %_%_์๋ฏธ
* ์ข
์ฑ์ด ์์์ ํ์ํ๊ธฐ ์ํ ๊ฒ์ผ๋ก ๋ณด์(ex>๋ฐ๋ณด : '๋ณด'์ ์ข
์ฑ์ด ์์)
```
# morphrules.foma
define FILLC %_%_ ; ! No-coda
```
## ์ข
์ฑ ์ ๋ฌด์ ๋ฐ๋ผ ์กฐ์ฌ๊ฐ ๋ฌ๋ผ์ง๋ ๊ฒฝ์ฐ์ ์ฒ๋ฆฌ
* '์ฌ๊ณผ'๋ ์ข
์ฑ์ด ์๊ธฐ ๋๋ฌธ์ '๊ฐ'๋ง ํ์ฉํ๋ค.( ์ฆ '์ด'๊ฐ ๋ถ์ ์ ์๋ค. )
* '์ฌ๋'์ ์ข
์ฑ์ด ์๊ธฐ ๋๋ฌธ์ '์ด'๋ง ํ์ฉํ๋ค.( ์ฆ '๊ฐ'๊ฐ ๋ถ์ ์ ์๋ค. )
* FILLC NounStringSet๋ ์ข
์ฑ์ด ์๋ ๋ช
์ฌ์ ๋ถ๋ ๋ช
์ฌํ๊ทธ๋ฅผ ์๋ฏธํ๋ค( ex> ์ฌ๊ณผ )
* [Code - FILLC] NounStringSet๋ ์ข
์ฑ์ด ์๋ ๋ช
์ธ์ ๋ถ๋ ๋ช
์ฌํ๊ทธ๋ฅผ ์๋ฏธํ๋ค( ex> ์ฌ๋ )
* /ps <- ์ฃผ์ ๊ฒฉ ์กฐ์ฌ ํ๊ทธ
```
! ์ด/๊ฐ
! FilterPS0 : ์ฌ๊ณผ๊ฐ
define FilterPS0 ~$[ FILLC NounStringSet ใ
ใ
ฃ FILLC %/ps ] ;
! FilterPS1 : ์ฌ๋์ด
define FilterPS1 ~$[ [Coda - FILLC] NounStringSet ใฑ ใ
FILLC %/ps ] ;
```
## apply up && apply down
```
foma[0]: define test ๊ฐ ๋ -> ๋ค ๋ผ;
defined test: 578 bytes. 3 states, 12 arcs, Cyclic.
foma[0]: regex test;
578 bytes. 3 states, 12 arcs, Cyclic.
foma[1]: up
apply up> ๊ฐ๋
???
apply up> ๋ค๋ผ
๋ค๋ผ
...
foma[1]: down
apply down> ๊ฐ๋
๋ค๋ผ
apply down> ๊ฐ ๋
๊ฐ ๋
```

## test1
```
foma[0]: define A %_ใท -> %_ใน || _ %/irrd %/vb ใ
;
defined A: 898 bytes. 7 states, 30 arcs, Cyclic.
foma[0]: regex A ;
898 bytes. 7 states, 30 arcs, Cyclic.
foma[1]: view
```

## test2
```
foma[0]: define A [ํ๋:one] ;
defined A: 235 bytes. 2 states, 1 arc, 1 path.
foma[0]: define B [one:ใใก] ;
defined B: 235 bytes. 2 states, 1 arc, 1 path.
foma[0]: define C [ใใก:ไธ] ;
defined C: 235 bytes. 2 states, 1 arc, 1 path.
foma[1]: regex A .o. B .o. C ;
294 bytes. 2 states, 1 arc, 1 path.
foma[1]: view
```
*  .o.
*  .o.
* 

## notation
* define A a -> b || c _ d ;
* define ์ฌ๋ณผ๋ช
ํ์ฌ์ํ -> ๋ค์์ํ || ์ด์ ์กฐ๊ฑด_๋ค์์กฐ๊ฑด
* m+1 ๋ค/EC ๋ค/EF SF 207832 4444
```
foma[0]: define test ๋ค%/EC -> ๋ค%/EF || _@%/SF;
defined test: 524 bytes. 3 states, 10 arcs, Cyclic.
foma[0]: regex test;
524 bytes. 3 states, 10 arcs, Cyclic.
```

## test3
foma> read lexc test3.lexc;
foma> view;
```
Multichar_Symbols /ac /ad /ai /am ! ๋ถ์ฌ
/di /dm /dn /du ! ๊ดํ์ฌ
/ec /ed /ef /en /ep /ex ! ์ด๋ฏธ
/it ! ๊ฐํ์ฌ
/na /nc /nd /ni /nm /nn /np /nr /ns /nu /nb ! ์ฒด์ธ
/pa /pc /pd /po /pp /ps /pt /pv /px /pq /pm ! ์กฐ์ฌ
/vb /vi /vj /vx /vn ! ์ฉ์ธ
/xa /xj /xn /xv ! ์ ์ฌ
/sc /se /sf /sl /sr /sd /su /sy /so ! ์ฌ๋ฒ
/nh /ne /un ! ํ์ (cHinese, English)
/irrL /irrb /irrd /irrh /irrl /irrs /irru ! ๋ถ๊ท์น ์ฝ๋ํ
%_ใด %_ใน %_ใ
%_ใ
%_ใ
%_ใ
! ์ข
์ฑ์ผ๋ก ์์ (์ด๋ฏธ, ์กฐ์ฌ)
Definitions
Digit = %0|1|2|3|4|5|6|7|8|9 ;
Alphabet = a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|
A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z ;
Hanja = ๏จ ;
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
LEXICON Root
ncLexicon ; ! ๋ณดํต๋ช
์ฌ
LEXICON ncLexicon ! ๋ณดํต๋ช
์ฌ
๊ฐ๊ฑด๋ฌผ/nc ncNext ;
๋ค์ด๋ฒ/nc ncNext ;
LEXICON ncNext
pxpxLexicon ;
finLexicon ;
LEXICON pxpxLexicon ! ๋ณด์กฐ์ฌ-๋ณด์กฐ์ฌ
๊น์ง/px๋ง/px pxpxNext ;
๋ง/px๋/px pxpxNext ;
๋ฐ์/px๋/px pxpxNext ;
๊น์ง/px๋/px pxpxNext ;
์กฐ์ฐจ/px๋/px pxpxNext ;
๊น์ง/px๋/px pxpxNext ;
๋ฟ/px๋ง/px pxpxNext ;
๋ง์ /px๋/px pxpxNext ;
๋ฐ์/px%_ใด/px pxpxNext ;
๋ง/px์ผ๋ก/pa๋/px pxpxNext ;
LEXICON finLexicon
# ;
```

## apply ordered rule
* \*์ ๋ํ ์ฒ๋ฆฌ ( simbol )์ ์ ์ํ์ฌ ์ฌ์ฉ
* ๋ค/EC ๋ค/EF || _ \*/SF
* foma ์์๋ถํด ๋ฐฉ๋ฒ์ ์ดํด
## lexc & xfst
* lexc์ ๊ธฐ์ ๋ ์ํธ๋ฆฌ๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ ์ด edge๋ก ์์ฑ์ด ๋๋ค.
* ์ฌ๋ฌ ์์ ์ ํ๋์ edge๋ก ํํํ๊ธฐ ์ํด์๋ Multichar_Symbols์ ๋ฐ๋ก ์ ์๊ฐ ํ์

* ์ด์ ๋ฐํด xfst์ ๊ธฐ์ ํ ๋๋ ๊ณต๋ฐฑ๋จ์๋ก edge๊ฐ ์์ฑ

* @๋ ์คํ ๋งํ์ ํํ๋์ง ์๋ ์ฌ๋ณผ๋ค์ ์ฌ์งํฉ์ด๋ค.
# sample1

```
define n1 ๋ค ์ -> daum;
define n2 ๋ค -> ใท ใ
;
define n3 [ ใท | ใ
];
define n4 n1 .o. n2 ;
regex n4;
```
# sample2

## ~$[n3] ์ถ๊ฐ
```
define n1 ๋ค ์ -> daum;
define n2 ๋ค -> ใท ใ
;
define n3 [ ใท | ใ
];
define n4 n1 .o. n2 .o. ~$[n3];
regex n4;
```
# sample3

## ~$[n3] ์ถ๊ฐ
```
define n1 ๋ค ์ -> daum;
define n2 ๋ค -> ใท ใ
;
define n3 [ ใท ];
define n4 n1 .o. n2 .o. ~$[n3];
regex n4;
```
# sample4

## ~$[n3] ์ถ๊ฐ
```
define n1 ๋ค ์ -> daum;
define n2 ๋ค -> ใท ใ
;
define n3 [ ใ
];
define n4 n1 .o. n2 .o. ~$[n3];
regex n4;
```
# complement

## complement์ฐ์ฐ์ output string์๋ง ์ ์ฉ๋๋ค.
## ์ฐ์ฐ์์์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋ค.
```
define n1 ๋ค ์ -> daum;
define n2 ๋ค -> ใท ใ
;
define n3 ์ -> ใ
ใ
กใ
;
define test n1 .o. n2 .o. n3;
regex test;
```
## complement ์ฐ์ฐ ํ ์คํ ๋งํ

```
define n1 ๋ค ์ -> daum;
define n2 ๋ค -> ใท ใ
;
define n3 ์ -> ใ
ใ
กใ
;
define n4 [ ใท | ใ
| ใ
| %_ | ใ
];
define test n1 .o. n2 .o. n3 .o. ~$[n4];
regex test;
```
## ์ ์คํ ๋งํ๋ฅผ ํ์ผ๋ก ๋ด๋ฆฌ๋ฉด(: write att > output.txt )
```
0 0 @_IDENTITY_SYMBOL_@ @_IDENTITY_SYMBOL_@
0 0 ใ
ใ
กใ
ใ
ใ
กใ
0 0 daum daum
0 0 ์ ใ
ใ
กใ
0 1 ๋ค daum
1 0 ์ @0@
0
```
## complement ์ฐ์ฐ ์์ ๋ณ๊ฒฝ

```
define n1 ๋ค ์ -> daum;
define n2 ๋ค -> ใท ใ
;
define n3 ์ -> ใ
ใ
กใ
;
define n4 [ ใท | ใ
| ใ
| %_ | ใ
];
define test ~$[n4] .o. n1 .o. n2 .o. n3;
regex test;
```
# insert operation test

* ์ฌ๋ณผ์ฌ์ด์ ์ด๋ค ์กฐ๊ฑด์์ ๋ค๋ฅธ ์ฌ๋ณผ์ ์ถ๊ฐํ ๋ ์๋์ ๊ฐ์ด ์ฌ์ฉ
## [..] -> B || C _ D Insert a single B between C and D
```
define test [..] -> B || C _ D ;
regex test
apply down> CDA
CBDA
```
# optional insert operation test

* A์ฌ๋ณผ์์ B์ฌ๋ณผ์ ์์ฑ
```
define test A (->) B;
regex test;
apply down> A
A
B
```
# replace operation test

* A์ฌ๋ณผ์ B์ฌ๋ณผ๋ก ๋ณ๊ฒฝ
```
define test A -> B;
regex test;
foma[1]: down
apply down> A
B
apply down> AAA
BBB
apply down> BBB
BBB
apply down> BAB
BBB
```