Skip to content

Commit

Permalink
update:验证项目准确度
Browse files Browse the repository at this point in the history
  • Loading branch information
NoHeartPen committed Nov 7, 2022
1 parent a90f763 commit 287cb50
Show file tree
Hide file tree
Showing 12 changed files with 32,281 additions and 6 deletions.
30 changes: 24 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

本项目的“非辞書形”指的一个被《大辞泉》等权威辞典收录的单词在实际使用中出现的形态,不只是语法上的动词活用。

简单地说,本项目主要从如下 4 个方面针对日语的剪贴板查词进行了优化
简单地说,本项目主要从如下 4 个方面对日语的剪贴板查词进行了优化

## 简日汉字

Expand Down Expand Up @@ -72,9 +72,11 @@
在上面 6 个例句中,英语只出现了 having、had 2 个「非辞書形」,而日语出现了 6 个传统语法观念下的「非辞書形」,但只关注词尾假名的话,就只有 3 个「非辞書形」。

这里强调只关注词尾假名是因为传统的日语语法对于`高かった`划分为`高かっ```2个部分,即`高かっ`才是活用形,但是本项目只关注与原型等长的部分即`高か`,所以使用本项目查词时请只划`高か`不要划`高かっ`(如果是词汇量较小的初学者,可以关注[日本語用言活用辞書 byGary](https://www.pdawiki.com/forum/forum.php?mod=viewthread&tid=40881&extra=page=2&filter=typeid&typeid=71)项目,该项目基于日语传统语法,划词时不需考虑原型与活用之间的差距)。

英语为了解决的这个问题,采用了穷举的做法。

但如果用按照传统的日语语法的思路穷举的话,日语的工作量将是一个天文数字;而按照传统语法的思路归纳规律也会面临同样的问题:因为我们不是在挑选经典的例句,而是在穷举所有可能会出现的情况
但如果用按照传统的日语语法的思路穷举的话,日语的工作量将是一个天文数字;而按照传统语法的思路归纳规律也会面临同样的问题:因为我们不是在挑选经典的例句,而是在穷举所有可能会出现的句子

所以,本项目与基于西方语言学理论的 Hunspell 技术和欧路词典采用的技术都不同:只关注「辞書形」词尾假名的变化。

Expand All @@ -87,7 +89,7 @@
如果要查询 2 句话中的动词,第 1 句话对应的辞書形是降る,第 2 句话是降りる,所以我们应该选中`降り`来查第 1 句(和辞書形降る的字符数一致),选中`降りま`来查第 2 句(和辞書形降りる的字符数一致)。

但采取“正统”的日语语法分析,我们也要结合上下文才能判断这里到底是`降りる`还是`降る`
但采取“正统”的日语语法分析,我们也要结合上下文才能判断出该选择`降りる`还是`降る`

所以,日语的剪贴板查词优化有一个绕不开的优化点就是:既然能获取的上下文语境的极为有限,那么就应该返回所有可能存在的结果。

Expand Down Expand Up @@ -165,19 +167,35 @@ v3 版本提供的是推导辞書形的代码,使那些不支持 mdx 格式的

如果你遇到问题,欢迎与我交流,我的邮箱是 NoHeartPen@outlook.com

# [endorse](endorse)

本项目在剪贴板查词的使用场景下的准确率远超传统的 NLP 工具(比如 Mecab ),有关下图的更多内容下图请到[endorse](endorse)文件夹。

![|500](https://markdoen-1304943362.cos.ap-nanjing.myqcloud.com//Pasted_image_20221106131719.png)
(使用语料:青空文库 DVD-ROM 2007 年 10 月 1 日時点)
![|500](https://markdoen-1304943362.cos.ap-nanjing.myqcloud.com//Pasted_image_20221106152040.png)
(使用语料:维基百科 20221020 数据,下载自:[https://dumps.wikimedia.org/jawiki/](https://dumps.wikimedia.org/jawiki/)

本项目能达到 99%的准确率主要原因有 2 点:

1. 会返回所有可能的结果;
2. 通过限定输入降低了工作量——只划与原型等长的“非辞書形”这个做法绕开了动词活用嵌套和接续语法等棘手问题

虽然 Mecab 的准确率只有 70%左右,但这不意味着 Mecab 的算法有什么大的问题。因为 Mecab 并不是为剪贴板这样能获取的上下文语境信息极为有限的使用场景而设计的工具。但是,这个2者的准确率可以说明:“日语的形态分析(形態素解析)最好返回**所有**可能的辞書形”。

# 鸣谢

首先,感谢网友[满星 MAX](https://space.bilibili.com/571730518/dynamic)[MrCorn0-0](https://github.com/MrCorn0-0)等人,Ta 们为项目提供了宝贵的技术经验
首先,感谢网友[满星 MAX](https://space.bilibili.com/571730518/dynamic)[MrCorn0-0](https://github.com/MrCorn0-0)等人,Ta 们在这方面的尝试为项目提供了宝贵的技术经验

- [hunspell_ja_JP](https://github.com/MrCorn0-0/hunspell_ja_JP)
- [日本語用言活用辞書 byGary](https://www.pdawiki.com/forum/forum.php?mod=viewthread&tid=40881&extra=page=2&filter=typeid&typeid=71)
- [日本語活用形辞書](https://forum.freemdict.com/t/topic/12031)
- [Python 辅助 MDX 转 MOBI(以 AHD5th 为例)](https://www.bilibili.com/read/cv11110087)
- [英语词汇构词法规则库(三合一版)(亦:英语变形词规则库)](https://www.bilibili.com/read/cv11110160)

其次,感谢我的同学 LHY、LRY 和 amob、cinnamon 等网友:Ta 们在项目尚处于初期时,就热情地参与进来,并提供了若干珍贵的建议和反馈,让项目一步一步完善到现在;也非常感谢 YL、ZY、CKR、DSL 等诸位老师:虽然没有在项目上提供直接的指导,但诸位老师在日语上的深厚造诣和对我的悉心栽培让我有兴趣、也有能力完成这个项目;
感谢我的同学 LHY、LRY 和 amob、cinnamon 等网友:Ta 们在项目尚处于初期,热情地参与进来,并提供了若干珍贵的建议和反馈,让项目一步一步完善到现在 ;也感谢 YL、ZY、CKR、DSL 等诸位老师:虽然没有在项目上提供直接的指导,但正是诸位老师在日语上的深厚造诣和对我的悉心栽培让我有兴趣、也有能力完成这个项目;

最后,也非常感谢日本国立国语研究所的诸位老师们:虽然素未谋面,但你们整理分享的研究数据、公开的学术论文、举办的讲座等等让我获益良多,使我数次从“山重水复疑无路”的死胡同中挣脱出来
最后,非常感谢日本国立国语研究所的诸位老师们:虽然素未谋面,但 Ta 们整理分享的数据、公开的论文、举办的讲座也是我数次能从“山重水复疑无路”的死胡同中挣脱出来的关键

# 支持项目

Expand Down
55 changes: 55 additions & 0 deletions endorse/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# 介绍

本文件夹主要用于验证日本語非辞書形辞典算法的可靠度。

## 思路

通过调用 Mecab 对语料进行分词处理,

![](https://markdoen-1304943362.cos.ap-nanjing.myqcloud.com//Pasted_image_20221107190449.png)

获取其中的`動詞``形容詞`部分,即模拟剪贴板查词的使用场景:

![](https://markdoen-1304943362.cos.ap-nanjing.myqcloud.com//Pasted_image_20221107190414.png)

然后调用本项目的 v3 版本算法进行推导,验证并统计推导结果。

![](https://markdoen-1304943362.cos.ap-nanjing.myqcloud.com//Pasted_image_20221107190623.png)

# 复现指南

## 配置 Mecab

如果没有使用过 Mecab 请不要跳过这部分。

这里只介绍 Windows 端安装方法,其他平台请参考官网首页[MeCab: Yet Another Part-of-Speech and Morphological Analyzer](https://taku910.github.io/mecab/#download)

Windows 端可以使用官网提供二进制文件下载链接:[https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7WElGUGt6ejlpVXc](https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7WElGUGt6ejlpVXc)

安装时注意勾选`utf-8`编码;另外,可以更改程序安装路径,反正安装完成后都要手动将安装路径下的`bin`文件夹手动添加到系统环境变量 Path。

确认安装好 Mecab 后,使用`pip install mecab-python3 `安装 Python 调用 Mecab 的第三方库。

然后到[Unidic 辞書](https://clrd.ninjal.ac.jp/unidic/)下载`unidic-cwj-3.1.1-full.zip`,解压到根目录,注意文件夹名要是`unidic-cwj-3.1.1`,如果不是,请修改每个脚本的`dic_path`

![](https://markdoen-1304943362.cos.ap-nanjing.myqcloud.com//Pasted_image_20221107190047.png)

然后到 Mecab 的**安装**路径,在`dic`文件夹下找到`ipadic`文件夹里面的`dicrc`,用记事本打开,把内容复制到`unidic-cwj-3.1.1`文件夹下的同名文件中。

运行[test_macab.py](test_macab.py)测试 Mecab 是否安装成功。

## 测试

确认 Mecab 安装成功后,将要测试的语料放到[testfiles](testfiles)文件夹并解压,然后修改文件夹名为 test。

[testfiles](testfiles)有测试文件(青空文库和维基百科)备份下载链接,注意测试前要把解压后的文件夹名修改为 test。
![](https://markdoen-1304943362.cos.ap-nanjing.myqcloud.com//Pasted_image_20221107190145.png)

语料准备工作完成后,运行[get_mecab.py](get_mecab.py)脚本,等待片刻即可。

![|500](https://markdoen-1304943362.cos.ap-nanjing.myqcloud.com//Pasted_image_20221106131719.png)
如果是其他语料,请确认文件名以是`_temp.txt`结尾(txt 是后缀名)

![](https://markdoen-1304943362.cos.ap-nanjing.myqcloud.com//Pasted_image_20221107095616.png)

或者修改[get_mecab.py]()中的`FileNames = list(Path(path).glob("**/*_temp.txt")) `
59 changes: 59 additions & 0 deletions endorse/convert_mecab.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@

import os
import re
import time
from pathlib import Path
import MeCab

'''
调用 Mecab 推导辞書形
'''

StartTime = time.perf_counter()

path = os.getcwd()+r"\testfiles\test"+'\\' # 加载测试文件
FileNames = list(Path(path).glob("**/*_get_mecab.txt"))
dic_path = os.getcwd()+r'\unidic-cwj-3.1.1'+'\\'
tagger = MeCab.Tagger(
'-r nul -d {} -Ochasen'.format(dic_path).replace('\\', '/'))


def ConvertProcess(File):
InputFileName = os.path.abspath(File)
OutputFileName = os.path.abspath(
File).replace("_get_mecab.txt", "_convert_mecab.txt")
with open(InputFileName, 'r', encoding='utf-8') as InputFile, open(OutputFileName, 'w', encoding='utf-8')as OutputFile:
for line in InputFile.readlines():
if line != "\n":
reg = r'(.*?)\t(.*?)\t(.*?)' # よっ 因る
lineReg = re.search(reg, line)
MecabResult = tagger.parse(
lineReg.group(1)).split("\t")[0] # 使用Mecab测试剪贴板环境下的效果
AnswerResult = lineReg.group(2)
OutputFile.write(MecabResult+"\t"+AnswerResult+"\n")


def ProcessFiles():
file = (i for i in FileNames) # 迭代器数据类型
for i in range(len(FileNames)):
global FileNumber
FileNumber = i
ProcessFile = next(file)
ConvertProcess(ProcessFile)
Now = round((i / len(FileNames)) * 100)
Done = '█' * int(Now)
Undo = '_' * (100 - int(Now))
print("\r{:^3.0f}%[{}->{}]".format(Now, Done, Undo), end='')
Now = 100
Done = '█' * int(Now)
Undo = '_' * (100 - int(Now))
print("\r{:^3.0f}%[{}->{}]".format(Now, Done, Undo), end='\n')


print("开始使用Mecab推导")
ProcessFiles()

EndTime = time.perf_counter()
print('Mecab推导耗时:%s毫秒' % (round((EndTime - StartTime)*1000, 3)))

os.system('python review_mecab.py')
Loading

0 comments on commit 287cb50

Please sign in to comment.