ruby에서 영어 번역 놀이! : 정규식으로 어순의 차이를 해결해 보았습니다.

gsub 방법으로 번역을 놀아 보았습니다.



Ruby라는 언어에는 문자열을 쉽게 변환하는 "gsub"라는 메서드가 있습니다.

fruits.rb
input = "apple"
input.gsub("apple","banana")   #=>"banana"

이런 식으로 "apple"을 "banana"로 바꿀 수 있습니다.
gsub 메소드를 알았을 때, 「이것으로 번역할 수 있다고 버리는… ?」라고 생각했기 때문에 해 보았습니다.
"I love you"를 일본어로 번역하는 코드를 작성해 보겠습니다.

love.rb
input = "I love you"
input_1 = input.gsub("I","私は")               #=>"私は love you"
input_2 = input_1.gsub("love","愛してる")    #=>"私は 愛してる you"
input_3 = input_2.gsub("you","あなたを")    #=>"私は 愛してる あなたを"

"I love you"⇒ ⇒ "나는 사랑해 너를"
어순에 위화감이 있습니다만, 모든 영어를 일본어로 바꿀 수 있었습니다.
그건 그렇고, 코드를 더 짧게 만들고 싶다면

love.rb
input = "I love you"
input.gsub(/I|love|you/, "I"=>"私は","love"=>"愛してる","you"=>"あなたを")
#=>"私は 愛してる あなたを"

라고 쓸 수도 있습니다.

그런데, 여기부터가 본제입니다.
위화감이 있는 것은, 일본어와 영어에서는 어순이 다르기 때문.
"I love you"에서 문제가 되는 것은 "love"와 "you"의 순서가 반대
라는 점입니다.
범용성도 높이고 싶네요. "I tell you"나 "I beg you"에도 똑같이 대응하고 싶다.
즉,

"어떤 단어"(공백) "you"⇒ "you"(공백) "어떤 단어"

로 바꾸고 싶다.

거기서


“you의 앞에 있는 단어를, you의 뒤에 가져온다” 코드를 써 보기로 했습니다.

정규식 캡처를 사용하여 단어 순서를 바꿉니다.



결론부터 가면, 이런 코드로 할 수 있었습니다. (실행 환경은 irb)

love.rb(추가 부분)
input = "I love you"

if input =~ /([A-Za-z]+\s)you/
input.gsub(($1)+"you" , "you\s"+($1))
end                                     

#=>"I you love"

정규 표현은 갑자기 보면 조금 깜짝 놀라는 분도 있다고 생각하기 때문에 (바로 내가 그렇게), 천천히 설명하려고 생각합니다.

우선 input의 캐릭터 라인 속에서, 「어떤 단어가 있어, 그 뒤에 공백이 있어, 그 뒤에 you라고 써 있는」부분을 찾습니다.
그러한 부분을 정규 표현으로 표현하면
 /([A-Za-z]+\s)you/ 가 되는 것입니다.


그리고 "()"로 묶인 부분, ([A-Za-z]+\s) (은)는 향후, ($1)이라고 하는 이름으로 코드상에서 취급할 수 있게 되었습니다.

그런데, if input =~/([A-Za-z]+\s)you/ 라는 처리에 의해, "I love you"속에서 "love you"라는 곳이 꺼내져, "love(공백)"부분이 ($1)로 취급할 수 있게 되었습니다.


그리고는, "($1)+you"를 gsub 메소드로 변환해, "you+\s (공백) +($1)" 로 변형했습니다.

이 코드로 love you를 you love에.

love.rb(추가 부분)
input.gsub(($1)+"you" , "you\s"+($1))


공백을 넣지 않으면 "youlove"가 되어 버리고, 나중에 일본어로 변환할 수 없게 되어 버립니다. 공백은 "\s"로 표현할 수 있습니다.

걸린 점은 ($1)을 """로 둘러싸면 출력이 잘되지 않는다는 것입니다. 그래서 "+"를 사용하여 문자열을 결합하고 있습니다.

그러면, ""I love you"를 올바른 일본어의 어순으로 번역한다"작업을 해 보겠습니다.

love.rb(추가 부분)
input = "I love you"

if input =~ /([A-Za-z]+\s)you/
input =  input.gsub(($1)+"you" , "you\s"+($1))
end
#=> "I you love "

input.gsub(/I|love|you/, "I"=>"私は","love"=>"愛してる","you"=>"あなたを")
#=> "私は あなたを 愛してる "

단어 순서가 정확합니다!

나는 정규 표현이 매우 서투르지만, 이런 식으로 놀아 본 결과 조금 친해졌다고 하는 이야기였습니다.
정규 표현은 텍스트를 하는 것만으로는 어색하기 어려운 일이 없기 때문에, 손을 움직여 보면 「의외로 간단잖아」라고 생각할지도 모릅니다.

끝까지 읽어 주신 분, 감사합니다.
틀린 곳이 있으면 지적해 주세요.

좋은 웹페이지 즐겨찾기