An explainable 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. Use politely.SELF
to keep MASK
as-is. Use politely.NULL
to remove MASK
.
from politely import SELF, NULL
styler.add_rules(
{
"์ด๐ทVCP๐(?P<MASK>๋ค๐ทEF)": (
{SELF},
{"์์๐ทEF"}, # ์์ (X) ์์ (O)
{"์
๋๋ค๐ทEF"},
),
"(?P<MASK>์ด๐ทVCP)๐๋ค๐ทEF": (
{SELF},
{NULL}, # ์ง์ฐ๊ธฐ
{NULL} # ์ง์ฐ๊ธฐ
)
})
sent = "ํ๊ธ์ ํ๊ตญ์ ๊ธ์์ด๋ค."
print(styler(sent, 1))
ํ๊ธ์ ํ๊ตญ์ ๊ธ์์์.
Here is another example of adding rules.styler.logs['guess']['out']
keeps track of all the candidates with scores.
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'])
์๋ฒ์ง๊ป์ ์ ์ค์ ๋ค์ด๊ฐ์
์.
[(['์๋ฒ์ง๐ทNNG', '๊ป์๐ทJKS', '์ ์ค๐ทNNG', '์๐ทJKB', '๋ค์ด๊ฐ๐ทVV', '์๐ทEP', '์ด์๐ทEF', '.๐ทSF'],
0.0125),
(['์๋ฒ๋๐ทNNG', '๊ป์๐ทJKS', '์ ์ค๐ทNNG', '์๐ทJKB', '๋ค์ด๊ฐ๐ทVV', '์๐ทEP', '์ด์๐ทEF', '.๐ทSF'],
0.0125)]
5๏ธโฃ Take contexts into account with the gpt2
scorer
heuristic
scorer is fast, but falls short at taking context into account:
styler = Styler(scorer="heuristic")
print("##### lm์ ์ฐ์ง ์๋ ๊ฒฝ์ฐ ๋งฅ๋ฝ ๊ณ ๋ ค X ######")
print(styler("๋ด์ผ ์ ๋ ๊ฐ์ด ์ ์ฌ ๋จน์ด์.", 0))
##### lm์ ์ฐ์ง ์๋ ๊ฒฝ์ฐ ๋งฅ๋ฝ ๊ณ ๋ ค X ######
๋ด์ผ ๋๋ ๊ฐ์ด ์ ์ฌ ๋จน์ด.
But gpt2
scorer is a bit slower, but does take context into account.
# Pytorch is required to use GPT2 scorer. Install the version that fits your environment.
pip3 install torch
from politely.modeling_gpt2_scorer import GPT2Scorer
styler = Styler(scorer="gpt2") # uses GPT2Scorer by default
print("##### lm์ ์ฐ๋ ๊ฒฝ์ฐ ๋งฅ๋ฝ ๊ณ ๋ ค O ######")
print(styler("๋ด์ผ ์ ๋ ๊ฐ์ด ์ ์ฌ ๋จน์ด์.", 0))
##### lm์ ์ฐ๋ ๊ฒฝ์ฐ ๋งฅ๋ฝ ๊ณ ๋ ค O ######
๋ด์ผ ๋๋ ๊ฐ์ด ์ ์ฌ ๋จน์. # ๊ถ์ ๊ฐ ์๋ ์ฒญ์ ์ด๋ฏ๋ก ์ด๊ฒ ๋ง์
More scoring options will be made available in the future.
Hosting the interactive demo
You can either host the interactive demo locally (You have to setup your own OPENAI_API_KEY
)
export OPENAI_API_KEY = ...
# host the demo via streamlit
streamlit run main_streamlit.py
Or just visit the demo we are hosting for you |
---|
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-4.0.0a0.tar.gz
.
File metadata
- Download URL: politely-4.0.0a0.tar.gz
- Upload date:
- Size: 13.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.1 CPython/3.12.2 Darwin/23.1.0
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | d1c4f9c8be5571158484fc9213f1ccc63539db0864553583ef64687425757449 |
|
MD5 | 1bdd494f5adbedf8ad7156114f0ad858 |
|
BLAKE2b-256 | 998ff90b792d6bbfce22a6a6c236344c2bbe4c5c9b6747e81b2e3807beb811a4 |
File details
Details for the file politely-4.0.0a0-py3-none-any.whl
.
File metadata
- Download URL: politely-4.0.0a0-py3-none-any.whl
- Upload date:
- Size: 12.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.1 CPython/3.12.2 Darwin/23.1.0
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 461b6ea726121f5d8213c5fd07ac34f56ff916e707155a2f2a820a1fca107c48 |
|
MD5 | 1e697d0666dd79c662551c07fb0f4c1d |
|
BLAKE2b-256 | 65bea0d373c85eef15aecda98d1e9776ac46bf2535ef8b1abc714c6f8cbd3228 |