A rule-based politeness styler for the Korean Language
Project description
Politely
A rule-based politeness styler for the Korean language |
---|
Quick Start ๐
1๏ธโฃ Install politely
pip3 install politely
2๏ธโฃ Split your text into sentences
Split your text into sentences with whatever tools you prefer. Here, we use kiwipiepy
for the sake of demonstration:
from kiwipiepy import Kiwi
# an excerpt from ๋๋ฐฑ๊ฝ (๊น์ ์ )
text = """์์๋ฆฌ๋ฅผ ๋๋ฃจ ๋์ด๋๋ค๊ฐ ๋จ์ด ๋ค์๊น๋ด ์์ผ๋ก ์
์ ํ์ด๋ง๊ณ ๋ ๊ทธ ์์์ ๊น๊น๋๋ค. ๋ณ๋ก ์ฐ์ค์ธ ๊ฒ๋ ์๋๋ฐ ๋ ์จ๊ฐ ํ๋ฆฌ๋๋ ์ด ๋์ ๊ณ์ง์ ๊ฐ ๋ฏธ์ณค๋ ํ๊ณ ์์ฌํ์๋ค.
๊ฒ๋ค๊ฐ ์กฐ๊ธ ๋ค์๋ ์ ์ง๊ป๋ฅผ ํ ๊ธํ ๊ธ ๋์๋ณด๋๋ ํ์ฃผ์น๋ง์ ์์ผ๋ก ๊ผ๋ ๋ฐ๋ฅธ์์ ๋ฝ์์ ๋์ ํฑ๋ฐ์ผ๋ก ๋ถ์ฅ ๋ด๋ฏธ๋ ๊ฒ์ด๋ค.
์ธ์ ๊ตฌ์ ๋์ง ๋์ด ๊น์ด ํฑ ๋ผ์น๋ ๊ตต์ ๊ฐ์ ์ธ ๊ฐ๊ฐ ์์ ๋ฟ๋ฏ์ด ์ฅ์๋ค. "๋ ์ง์ ์ด๊ฑฐ ์์ง?" ํ๊ณ ์์์๋ ํฐ์๋ฆฌ๋ฅผ ํ๊ณ ๋ ์ ๊ฐ ์ค ๊ฒ์ ๋จ์ด ์๋ฉด์ ํฐ์ผ๋ ํ
๋ ์ฌ๊ธฐ์ ์ผ๋ฅธ ๋จน์ด ๋ฒ๋ฆฌ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ ํ๋ ์๋ฆฌ๊ฐ, "๋ ๋ด๊ฐ์๊ฐ ๋ง์๋จ๋ค." "๋ ๊ฐ์ ์ ๋จน๋๋ค. ๋๋ ๋จน์ด๋ผ." ๋๋ ๊ณ ๊ฐ๋ ๋๋ฆฌ์ง ์๊ณ ์ผํ๋ ์์ผ๋ก ๊ทธ ๊ฐ์๋ฅผ ๋๋ก ์ด๊นจ ๋๋จธ๋ก ์ฅ ๋ฐ์ด ๋ฒ๋ ธ๋ค.
๊ทธ๋ฌ๋๋ ๊ทธ๋๋ ๊ฐ๋ ๊ธฐ์์ด ์๊ณ , ๋ฟ๋ง ์๋๋ผ ์๊ทผ์๊ทผํ๊ณ ์ฌ์์น ์๊ฒ ์จ์๋ฆฌ๊ฐ ์ ์ ๊ฑฐ์น ์ด์ง๋ค. ์ด๊ฑด ๋ ๋ญ์ผ ์ถ์ด์ ๊ทธ๋์์ผ ๋น๋ก์ ๋์๋ค๋ณด๋ ๋๋ ์ฐธ์ผ๋ก ๋๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ด ๋๋ค์ ๋ค์ด์จ ๊ฒ์ ๊ทผ ์ผ๋
์งธ ๋์ด์ค์ง๋ง ์ฌํ๊ป ๊ฐ๋ฌด์ก์กํ ์ ์์ด์ ์ผ๊ตด์ด ์ด๋ ๊ฒ๊น์ง ํ๋น๋ฌด์ฒ๋ผ ์๋นจ๊ฐ์ง ๋ฒ์ด ์์๋ค.
๊ฒ๋ค๊ฐ ๋์ ๋
์ ์ฌ๋ฆฌ๊ณ ํ์ฐธ ๋๋ฅผ ์๋ ๊ฒ ์์๋ณด๋๋ ๋์ค์๋ ๋๋ฌผ๊น์ง ์ด๋ฆฌ๋ ๊ฒ์ด ์๋๋.
๊ทธ๋ฆฌ๊ณ ๋ฐ๊ตฌ๋๋ฅผ ๋ค์ ์ง์ด๋ค๋๋ ์ด๋ฅผ ๊ผญ ์
๋ฌผ๊ณ ๋ ์์ด์ง ๋ฏ ์๋น ์ง ๋ฏ ๋
ผ๋์ผ๋ก ํกํ๊ฒ ๋ฌ์๋๋ ๊ฒ์ด๋ค."""
kiwi = Kiwi()
sents = [sent.text.strip() for sent in kiwi.split_into_sents(text)]
3๏ธโฃ Speak politely
with Styler
Instantiate an object of Styler
, and style your sentences in a polite or formal manner with it:
from politely import Styler
from pprint import pprint
styler = Styler()
pprint(" ".join([styler(sent, 1) for sent in sents])) # 1 = polite
('์์๋ฆฌ๋ฅผ ๋๋ฃจ ๋์ด๋๋ค๊ฐ ๋จ์ด ๋ค์๊น ๋ด ์์ผ๋ก ์
์ ํ์ด๋ง๊ณ ๋ ๊ทธ ์์์ ๊น๊น๋์. ๋ณ๋ก ์ฐ์ค์ธ ๊ฒ๋ ์๋๋ฐ ๋ ์จ๊ฐ ํ๋ฆฌ๋๋ ์ด ๋์ '
'๊ณ์ง์ ๊ฐ ๋ฏธ์ณค๋ ํ๊ณ ์์ฌํ์ด์. ๊ฒ๋ค๊ฐ ์กฐ๊ธ ๋ค์๋ ์ ์ง๊ป๋ฅผ ํ ๊ธํ ๊ธ ๋์๋ณด๋๋ ํ์ฃผ์น๋ง์ ์์ผ๋ก ๊ผ๋ ๋ฐ๋ฅธ ์์ ๋ฝ์์ ์ ํฑ '
'๋ฐ์ผ๋ก ๋ถ์ฅ ๋ด๋ฏธ๋ ๊ฒ์์. ์ธ์ ๊ตฌ์ ๋์ง ๋์ด ๊น์ด ํฑ ๋ผ์น๋ ๊ตต์ ๊ฐ์ ์ธ ๊ฐ๊ฐ ์์ ๋ฟ๋ฏ์ด ์ฅ์์ด์. "๋ ์ง์๋ ์ด ๊ฑฐ ์์ฃ ? '
'"ํ๊ณ ์์ ์๋ ํฐ ์๋ฆฌ๋ฅผ ํ๊ณ ๋ ์ ๊ฐ ์ค ๊ฒ์ ๋จ์ด ์๋ฉด์ ํฐ์ผ ๋ ํ
๋ ์ฌ๊ธฐ์ ์ผ๋ฅธ ๋จน์ด ๋ฒ๋ฆฌ๋์. ๊ทธ๋ฆฌ๊ณ ๋ ํ๋ ์๋ฆฌ๊ฐ,"๋น์ '
'๋ด ๊ฐ์๊ฐ ๋ง์์ด์. ""๋ ๊ฐ์ ์ ๋จน์ด์. ๋น์ ์ด๋ ๋จน์ด์. "์ ๋ ๊ณ ๊ฐ๋ ๋๋ฆฌ์ง ์๊ณ ์ผํ๋ ์์ผ๋ก ๊ทธ ๊ฐ์๋ฅผ ๋๋ก ์ด๊นจ ๋๋จธ๋ก ์ฅ '
'๋ฐ์ด ๋ฒ๋ ธ์ด์. ๊ทธ๋ฌ๋๋ ๊ทธ๋๋ ๊ฐ๋ ๊ธฐ์์ด ์๊ณ , ๋ฟ๋ง ์๋๋ผ ์๊ทผ์๊ทผํ๊ณ ์ฌ์ํ์ง ์๊ฒ ์จ์๋ฆฌ๊ฐ ์ ์ ๊ฑฐ์น ์ด์ ธ์. ์ด๊ฑฐ๋ ๋ ๋ญ์ผ '
'์ถ์ด์ ๊ทธ ๋์์ผ ๋น๋ก์ ๋์๋ค๋ณด๋ ์ ๋ ์ฐธ์ผ๋ก ๋๋์ด์. ์ ํฌ๊ฐ ์ด ๋๋ค์ ๋ค์ด์จ ๊ฒ์ ๊ทผ ์ผ ๋
์งธ ๋ผ ์ค์ง๋ง ์ฌํ๊ป ๊ฐ๋ฌด์ก์กํ ์ ์๋ '
'์ด์ ์ผ๊ตด์ด ์ด๋ ๊ฒ๊น์ง ํ๋น๋ฌด์ฒ๋ผ ์๋นจ๊ฐ์ง ๋ฒ์ด ์์์ด์. ๊ฒ๋ค๊ฐ ๋์ ๋
์ ์ฌ๋ฆฌ๊ณ ํ์ฐธ ์ ๋ฅผ ์๋ ๊ฒ ์์๋ณด๋๋ ๋์ค์๋ ๋๋ฌผ๊น์ง ์ด๋ฆฌ๋ '
'๊ฒ ์๋
์. ๊ทธ๋ฆฌ๊ณ ๋ฐ๊ตฌ๋๋ฅผ ๋ค์ ์ง์ด ๋ค๋๋ ์ด๋ฅผ ๊ผญ ์
๋ฌผ๊ณ ๋ ์์ด์ง ๋ฏ ์๋น ์ง ๋ฏ ๋
ผ๋์ผ๋ก ํกํ๊ฒ ๋ฌ์๋๋ ๊ฒ์์.')
pprint(" ".join([styler(sent, 2) for sent in sents])) # 2 = formal
('์์๋ฆฌ๋ฅผ ๋๋ฃจ ๋์ด๋๋ค๊ฐ ๋จ์ด ๋ค์๊น ๋ด ์์ผ๋ก ์
์ ํ์ด๋ง๊ณ ๋ ๊ทธ ์์์ ๊น๊น๋๋๋ค. ๋ณ๋ก ์ฐ์ค์ธ ๊ฒ๋ ์๋๋ฐ ๋ ์จ๊ฐ ํ๋ฆฌ๋๋ ์ด ๋์ '
'๊ณ์ง์ ๊ฐ ๋ฏธ์ณค๋ ํ๊ณ ์์ฌํ์ต๋๋ค. ๊ฒ๋ค๊ฐ ์กฐ๊ธ ๋ค์๋ ์ ์ง๊ป๋ฅผ ํ ๊ธํ ๊ธ ๋์๋ณด๋๋ ํ์ฃผ์น๋ง์ ์์ผ๋ก ๊ผ๋ ๋ฐ๋ฅธ ์์ ๋ฝ์์ ์ ํฑ '
'๋ฐ์ผ๋ก ๋ถ์ฅ ๋ด๋ฏธ๋ ๊ฒ๋๋ค. ์ธ์ ๊ตฌ์ ๋์ง ๋์ด ๊น์ด ํฑ ๋ผ์น๋ ๊ตต์ ๊ฐ์ ์ธ ๊ฐ๊ฐ ์์ ๋ฟ๋ฏ์ด ์ฅ์์ต๋๋ค. "๋ ์ง์๋ ์ด ๊ฑฐ '
'์์ต๋๊น? "ํ๊ณ ์์ ์๋ ํฐ ์๋ฆฌ๋ฅผ ํ๊ณ ๋ ์ ๊ฐ ์ค ๊ฒ์ ๋จ์ด ์๋ฉด์ ํฐ์ผ ๋ ํ
๋ ์ฌ๊ธฐ์ ์ผ๋ฅธ ๋จน์ด ๋ฒ๋ฆฌ๋๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ํ๋ '
'์๋ฆฌ๊ฐ,"๋น์ ๋ด ๊ฐ์๊ฐ ๋ง์์ต๋๋ค. ""๋ ๊ฐ์ ์ ๋จน์ต๋๋ค. ๋น์ ์ด๋ ๋จน์ญ์์ค. "์ ๋ ๊ณ ๊ฐ๋ ๋๋ฆฌ์ง ์๊ณ ์ผํ๋ ์์ผ๋ก ๊ทธ ๊ฐ์๋ฅผ '
'๋๋ก ์ด๊นจ ๋๋จธ๋ก ์ฅ ๋ฐ์ด ๋ฒ๋ ธ์ต๋๋ค. ๊ทธ๋ฌ๋๋ ๊ทธ๋๋ ๊ฐ๋ ๊ธฐ์์ด ์๊ณ , ๋ฟ๋ง ์๋๋ผ ์๊ทผ์๊ทผํ๊ณ ์ฌ์ํ์ง ์๊ฒ ์จ์๋ฆฌ๊ฐ ์ ์ '
'๊ฑฐ์น ์ด์ง๋๋ค. ์ด๊ฑฐ๋ ๋ ๋ญ์ผ ์ถ์ด์ ๊ทธ ๋์์ผ ๋น๋ก์ ๋์๋ค๋ณด๋ ์ ๋ ์ฐธ์ผ๋ก ๋๋์ต๋๋ค. ์ ํฌ๊ฐ ์ด ๋๋ค์ ๋ค์ด์จ ๊ฒ์ ๊ทผ ์ผ ๋
์งธ ๋ผ '
'์ค์ง๋ง ์ฌํ๊ป ๊ฐ๋ฌด์ก์กํ ์ ์๋ ์ด์ ์ผ๊ตด์ด ์ด๋ ๊ฒ๊น์ง ํ๋น๋ฌด์ฒ๋ผ ์๋นจ๊ฐ์ง ๋ฒ์ด ์์์ต๋๋ค. ๊ฒ๋ค๊ฐ ๋์ ๋
์ ์ฌ๋ฆฌ๊ณ ํ์ฐธ ์ ๋ฅผ ์๋ ๊ฒ '
'์์๋ณด๋๋ ๋์ค์๋ ๋๋ฌผ๊น์ง ์ด๋ฆฌ๋ ๊ฒ ์๋๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐ๊ตฌ๋๋ฅผ ๋ค์ ์ง์ด ๋ค๋๋ ์ด๋ฅผ ๊ผญ ์
๋ฌผ๊ณ ๋ ์์ด์ง ๋ฏ ์๋น ์ง ๋ฏ ๋
ผ๋์ผ๋ก '
'ํกํ๊ฒ ๋ฌ์๋๋ ๊ฒ๋๋ค.')
4๏ธโฃ add_rules
of your own
you can add your own rules with add_rules
method:
styler.add_rules(
{"์ด๐ทVCP๐(?P<MASK>๋ค๐ทEF)": (
{"๋ค๐ทEF"},
{"์์๐ทEF"}, # ์์.
{"์ต๋๋ค๐ทEF"},
)
})
sent = "ํ๊ธ์ ํ๊ตญ์ ๊ธ์์ด๋ค."
print(styler(sent, 1))
ํ๊ธ์ ํ๊ตญ์ ๊ธ์์์.
You can add multiple rules altogether too. Use politely.SELF
to refer to the original word.
from politely import SELF
styler.add_rules(
{
r"(?P<MASK>(์๋น |์๋ฒ์ง|์๋ฒ๋)๐ทNNG)": (
{f"์๋น ๐ทNNG"},
{f"์๋ฒ์ง๐ทNNG", f"์๋ฒ๋๐ทNNG"},
{f"์๋ฒ์ง๐ทNNG", f"์๋ฒ๋๐ทNNG"}
),
r"(์๋น |์๋ฒ์ง|์๋ฒ๋)๐ทNNG๐(?P<MASK>\S+?๐ทJKS)": (
{SELF}, # no change, replace with the original
{f"๊ป์๐ทJKS"},
{f"๊ป์๐ทJKS"}
),
r"(?P<MASK>แซ๋ค๐ทEF)": (
{SELF}, # no change, replace with the original
{"์๐ทEP๐์ด์๐ทEF"},
{"์๐ทEP๐์ต๋๋ค๐ทEF"},
)
}
)
sent = "์๋น ๊ฐ ์ ์ค์ ๋ค์ด๊ฐ๋ค."
print(styler(sent, 1))
from pprint import pprint
pprint(styler.logs['guess']['out']) # you can look up the candidates from here
์๋ฒ์ง๊ป์ ์ ์ค์ ๋ค์ด๊ฐ์
์.
[(['์๋ฒ์ง๐ทNNG', '๊ป์๐ทJKS', '์ ์ค๐ทNNG', '์๐ทJKB', '๋ค์ด๊ฐ๐ทVV', '์๐ทEP', '์ด์๐ทEF', '.๐ทSF'],
0.0125),
(['์๋ฒ๋๐ทNNG', '๊ป์๐ทJKS', '์ ์ค๐ทNNG', '์๐ทJKB', '๋ค์ด๊ฐ๐ทVV', '์๐ทEP', '์ด์๐ทEF', '.๐ทSF'],
0.0125)]
Hosting the interactive demo
You can either host the interactive demo locally (you first have to sign up for papago API to get your secrets)
export NAVER_CLIENT_ID = ...
export NAVER_CLIENT_SECRET = ...
# host the demo via streamlit
streamlit run main_deploy.py
Or just visit the demo we are hosting for you |
---|
What politely
can't ๐
politely
's Styler
cannnot take contexts into account because its conjugation algorithm is fundamentally rule-based. The algorithm is nothing but a chain of glorified if-else's. As a consequence of this, Styler
can't disambiguate context-dependent conjugations, like so:
# ๊ถ์ / ์ฒญ์ ์ ์ฐจ์ด๋ ๋งฅ๋ฝ์ ์์กด
print(styler("์ ๋ ์ฐ๋ ๊ธฐ๋ฅผ ์ฃผ์์.", 2))
print(styler("์, ๊ฐ์ด ์ฐ๋ ๊ธฐ๋ฅผ ์ฃผ์์.", 2))
์ ๋ ์ฐ๋ ๊ธฐ๋ฅผ ์ค์ต๋๋ค.
์, ๊ฐ์ด ์ฐ๋ ๊ธฐ๋ฅผ ์ค์ต๋๋ค. (should be "์, ๊ฐ์ด ์ฐ๋ ๊ธฐ๋ฅผ ์ฃผ์์๋ค")
# ์ด๋ฅด + ์ด -> ์ด๋ฅด๋ฌ/์ผ๋ฌ ๋ํ ๋งฅ๋ฝ์ ์์กด
print(styler("ํ์ง ๋ง๋ผ๊ณ ์ผ๋ ๋ค.", 2))
print(styler("์ ์์ ์ด๋ฅด๋ ๋ค.", 2))
ํ์ง ๋ง๋ผ๊ณ ์ผ๋ ์ต๋๋ค.
์ ์์ ์ผ๋ ์ต๋๋ค. (should be "์ ์์ ์ด๋ฅด๋ ์ต๋๋ค")
By whom? ๐
- funded by: Faculty of Oriental Studies at the University of Oxford
- led & developed by: Jieun Kiaer (Associate Professor of Korean Language and Linguistics at the University of Oxford)
- co-developed by: Research assistant Eu-Bin KIM (Msc. in Applied Linguistics at the University of Oxford, Bsc. in AI at the University of Manchester )
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file politely-3.2.3.tar.gz
.
File metadata
- Download URL: politely-3.2.3.tar.gz
- Upload date:
- Size: 9.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: python-httpx/0.23.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | db81e9540511fe4b951c740a473c3e0ade156a4df02787e3aaad508c401fc6ca |
|
MD5 | 96ab191f9631450bc2a45815f633eeb1 |
|
BLAKE2b-256 | 87e3edf9061a642d43d8574169c55ae2ab03e1b294710cbf69ffcbdea3aeddd9 |
File details
Details for the file politely-3.2.3-py3-none-any.whl
.
File metadata
- Download URL: politely-3.2.3-py3-none-any.whl
- Upload date:
- Size: 9.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: python-httpx/0.23.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4294b89a6f59c8fa340e5f8439253f33430f2952cfc08a1c9a28095dca6f998a |
|
MD5 | 65ebe2ddc09a6b7113dd37294daa2b79 |
|
BLAKE2b-256 | d7fb735bb0923a0f31f9e07a369c7bcbce2c7de409d8ed3bbb2accdb1770abdf |