PyKoSpacing
Python 包,用于自动韩语单词间距。
可以在 这里找到 R 版本。
介绍
单词间距是韩国文本分析预处理的重要部分之一。准确的间距对后续的文本分析的准确性有很大影响。PyKoSpacing
具有相当准确的自动单词间距性能,特别适用于来源于 SNS 或者 SMS 的在线文本。
例如,
"아버지가방에들어가신다。" 可以间距如下。
- "아버지가 방에 들어가신다。" 意思是 "我的父亲进入房间。"
- "아버지 가방에 들어가신다。" 意思是 "我的父亲进入包里。"
常识上,第一个是正确答案。
PyKoSpacing
基于从大型语料库(来自 Chan-Yub Park的超过一亿篇新闻文章)训练的深度学习模型。
性能
测试集 | 准确率 |
---|---|
Sejong(口语风格)语料库(1M) | 97.1% |
OOOO(文学风格)语料库(3M) | 94.3% |
- 准确率 = 正确间距的字符数 / 测试数据中的字符总数。
- 如果规范化合成词,性能可能会提高。
安装
PyPI 安装
前置要求:
正确安装 python3
正确安装 pip
pip install tensorflow
pip install keras
Windows-Ubuntu 情况下:当遇到以下错误时。
错误:/usr/lib/x86_64-linux-gnu/libstdc++.so.6: 版本 `GLIBCXX_3.4.22' 未找到
sudo apt-get install libstdc++6
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade (这需要很长时间。)
Darwin(m1) 情况下:你应该以不同的方式安装 tensorflow。(使用 Miniforge3)
# 为 Mac 安装 Miniforge3
curl -O https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-MacOSX-arm64.sh
chmod +x Miniforge3-MacOSX-arm64.sh
sh Miniforge3-MacOSX-arm64.sh
# 激活 Miniforge3 虚拟环境
# 你应该使用 Python 版本 3.10 或更低
source ~/miniforge3/bin/activate
# 安装 Tensorflow 依赖项
conda install -c apple tensorflow-deps
# 安装基础版 tensorflow
python -m pip install tensorflow-macos
# 安装 metal 插件
python -m pip install tensorflow-metal
从 GitHub 安装使用
pip install git+https://github.com/haven-jeon/PyKoSpacing.git
示例
>>> from pykospacing import Spacing
>>> spacing = Spacing()
>>> spacing("김형호영화시장분석가는'1987'의네이버영화정보네티즌10점평에서언급된단어들을지난해12월27일부터올해1월10일까지통계프로그램R과KoNLP패키지로텍스트마이닝하여분석했다.")
"김형호 영화시장 분석가는 '1987'의 네이버 영화 정보 네티즌 10점 평에서 언급된 단어들을 지난해 12월 27일부터 올해 1월 10일까지 통계 프로그램 R과 KoNLP 패키지로 텍스트마이닝하여 분석했다."
>>> # 应用必须没有间距的单词列表
>>> spacing('귀밑에서턱까지잇따라난수염을구레나룻이라고한다.')
'귀 밑에서 턱까지 잇따라 난 수염을 구레나 룻이라고 한다.'
>>> spacing = Spacing(rules=['구레나룻'])
>>> spacing('귀밑에서턱까지잇따라난수염을구레나룻이라고한다.')
'귀 밑에서 턱까지 잇따라 난 수염을 구레나룻이라고 한다.'
使用 csv 文件设置规则。(你只需要使用 set_rules_by_csv()
方法。)
$ cat test.csv
인덱스,단어
1,네이버영화
2,언급된단어
>>> from pykospacing import Spacing
>>> spacing = Spacing(rules=[''])
>>> spacing.set_rules_by_csv('./test.csv', '단어')
>>> spacing("김형호영화시장분석가는'1987'의네이버영화정보네티즌10점평에서언급된단어들을지난해12월27일부터올해1월10일까지통계프로그램R과KoNLP패키지로텍스트마이닝하여분석했다.")
"김형호 영화시장 분석가는 '1987'의 네이버영화 정보 네티즌 10点 平에서 언급된단어들을 지난해 12 월 27 일부터 올해 1 月 10일까지 통계 程序 R과 KoNLP 패키지로 텍스트마이닝하여 분석했다."
在命令行上运行(感谢 lqez)。
$ cat test_in.txt
김형호영화시장분석가는'1987'의네이버영화정보네티즌10점평에서언급된단어들을지난해12월27일부터올해1월10일까지통계프로그램R과KoNLP패키지로텍스트마이닝하여분석했다.
아버지가방에들어가신다.
$ python -m pykospacing.pykos test_in.txt
김형호 영화시장 분석가는 '1987'의 네이버 영화 정보 네티즌 10점 평에서 언급된 단어들을 지난해 12월 27일부터 올해 1월 10일까지 통계 프로그램 R과 KoNLP 패키지로 텍스트마이닝하여 분석했다.
아버지가 방에 들어가신다.
当前模型在某些情况下当输入包含英文字符时存在问题。
PyKoSpacing 提供 ignore
和 ignore_pattern
参数来解决这个问题。
-
关于
ignore
参数 (str, 可选)ignore='none'
:不会应用任何预处理或后处理。输出将与模型输出相同。ignore='pre'
:应用预处理删除与ignore_pattern
匹配的字符。这些删除的字符将在模型预测后合并。这种选择总是会在删除的字符之后加空格,因为不知道删除的字符是会在左边、右边还是两边都有空格。ignore='post'
:将忽略ignore_pattern
匹配的字符在模型输出中的结果。这种选择的问题在于,模型输入中的英文字符也会影响到附近的非英文字符。ignore='pre2'
:应用预处理删除与ignore_pattern
匹配的字符,并对预处理文本和原始文本进行预测。这使得它知道在删除的字符左边、右边还是两边加空格。然而,这种选择需要进行两次预测,这会使计算时间加倍。- 默认值:
ignore='none'
-
关于
ignore_pattern
参数 (str, 可选)
你可以为ignore_pattern
输入你自己的正则表达式模式。正则表达式模式应为你想忽略的字符模式。- 默认值:
ignore_pattern=r'[^가-힣ㄱ-ㅣ!-@[-`{-~\s]+,*( [^가-힣ㄱ-ㅣ!-@[-`{-~\s]+,*)*[.,!?]* *'
,它匹配非韩语和非ASCII符号的字符、单词或句子。
- 默认值:
ignore
参数的示例
>>> from pykospacing import Spacing
>>> spacing = Spacing()
>>> spacing("친구와함께bmw썬바이저를썼다.", ignore='none')
"친구와 함께 bm w 썬바이저를 썼다."
>>> spacing("친구와함께bmw썬바이저를썼다.", ignore='pre')
"친구와 함께bmw 썬바이저를 썼다."
>>> spacing("친구와함께bmw썬바이저를썼다.", ignore='post')
"친구와 함께 bm w 썬바이저를 썼다."
>>> spacing("친구와함께bmw썬바이저를썼다.", ignore='pre2')
"친구와 함께 bmw 썬바이저를 썼다."
<SOURCE_TEXT>
spacing("chicken박스를열고닭다리를꺼내입에문다.crispy한튀김옷덕에내입주변은glossy해진다.", ignore='none') "chicken박스를 열고 닭다리를 꺼내 입에 문다. crispy 한튀김 옷 덕에 내 입 주변은 glossy해진다." spacing("chicken박스를열고닭다리를꺼내입에문다.crispy한튀김옷덕에내입주변은glossy해진다.", ignore='pre') "chicken박스를 열고 닭다리를 꺼내 입에 문다.crispy 한 튀김옷 덕에 내 입 주변은glossy 해진다." spacing("chicken박스를열고닭다리를꺼내입에문다.crispy한튀김옷덕에내입주변은glossy해진다.", ignore='post') "chicken박스를 열고 닭다리를 꺼내 입에 문다. crispy 한튀김 옷 덕에 내 입 주변은 glossy해진다." spacing("chicken박스를열고닭다리를꺼내입에문다.crispy한튀김옷덕에내입주변은glossy해진다.", ignore='pre2') "chicken박스를 열고 닭다리를 꺼내 입에 문다. crispy 한 튀김옷 덕에 내 입 주변은 glossy해진다."
spacing("김형호영화시장분석가는'1987'의네이버영화정보네티즌10점평에서언급된단어들을지난해12월27일부터올해1월10일까지통계프로그램R과KoNLP패키지로텍스트마이닝하여분석했다.", ignore='none') "김형호 영화시장 분석가는 '1987'의 네이버 영화 정보 네티즌 10점 평에서 언급된 단어들을 지난해 12월 27일부터 올해 1월 10일까지 통계 프로그램 R과 KoNLP 패키지로 텍스트마이닝하여 분석했다." spacing("김형호영화시장분석가는'1987'의네이버영화정보네티즌10점평에서언급된단어들을지난해12월27일부터올해1월10일까지통계프로그램R과KoNLP패키지로텍스트마이닝하여분석했다.", ignore='pre') "김형호 영화시장 분석가는 '1987'의 네이버 영화 정보 네티즌 10점 평에서 언급된 단어들을 지난해 12월 27일부터 올해 1월 10일까지 통계 프로그램R과KoNLP 패키지로 텍스트마이닝하여 분석했다." spacing("김형호영화시장분석가는'1987'의네이버영화정보네티즌10점평에서언급된단어들을지난해12월27일부터올해1월10일까지통계프로그램R과KoNLP패키지로텍스트마이닝하여분석했다.", ignore='post') "김형호 영화시장 분석가는 '1987'의 네이버 영화 정보 네티즌 10점 평에서 언급된 단어들을 지난해 12월 27일부터 올해 1월 10일까지 통계 프로그램 R과 KoNLP 패키지로 텍스트마이닝하여 분석했다." spacing("김형호영화시장분석가는'1987'의네이버영화정보네티즌10점평에서언급된단어들을지난해12월27일부터올해1월10일까지통계프로그램R과KoNLP패키지로텍스트마이닝하여분석했다.", ignore='pre2') "김형호 영화시장 분석가는 '1987'의 네이버 영화 정보 네티즌 10점 평에서 언급된 단어들을 지난해 12월 27일부터 올해 1월 10일까지 통계 프로그램 R과 KoNLP 패키지로 텍스트마이닝하여 분석했다."
#### 模型架构
![](https://yellow-cdn.veclightyear.com/2b54e442/67455e4a-32fe-45e0-aec2-684d1e07ac9f.png)
#### 训练详情
- 训练代码使用了比 PyKoSpacing 更高级的架构,但也包含了 PyKoSpacing 的学习逻辑.
- https://github.com/haven-jeon/Train_KoSpacing
#### 引用
```markdowns
@misc{heewon2018,
author = {Heewon Jeon},
title = {KoSpacing: 自动韩语分词},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {\url{https://github.com/haven-jeon/KoSpacing}}