Loknar/loka-ord
GitHub: Loknar/loka-ord
一个自由的冰岛语词汇数据库,用于存储、管理和查询冰岛语单词及其词形变化。
Stars: 19 | Forks: 8

# 结语
一个自由的冰岛语词汇、词形变化及其构成等数据库,采用自由公共领域许可证。
该数据库包含以下词汇数量:
| | ó.l | 阳性 | 阴性 | 中性 | 核心词汇 | 阳性 | 阴性 | 中性 | 复合词汇 | 总计 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| **名词** | | 1982 | 1804 | 1834 | 5620 | 17162 | 22863 | 23258 | 63283 | **68903** |
| **形容词** | 555 | | | | 790 | | | | 6432 | **7222** |
| **动词** | | | | | 1406 | | | | 2200 | **3606** |
| **数词** | | | | | 25 | | | | 102 | **127** |
| **代词** | | | | | 38 | | | | 22 | **60** |
| **小品词** | | | | | 352 | | | | 656 | **1008** |
| **总计** | | | | | **8232** | | | | **72695** | **80927** |
| 专有名词 | 阳性 | 阴性 | 中性 | 核心词汇 | 阳性 | 阴性 | 中性 | 复合词汇 | 总计 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 人名 | 1342 | 1294 | 17 | 2653 | 1028 | 1284 | 10 | 2322 | **4975** |
| 姓氏 | | | | | 4891 | 4889 | 4867 | 14647 | **14647** |
| 父名/母名 | | | | | | | | | **1749** |
| 昵称 | 670 | 296 | 8 | 974 | 178 | 169 | 9 | 356 | **1330** |
| 地名 | 37 | 178 | 790 | 1005 | 2929 | 2197 | 2277 | 7403 | **8408** |
| **总计** | | | | **6206** | | | | **24903** | **31109** |
**总计:** 112036 个词。
1063 个缩写词。
## 前置条件 (Requirements)
需要 `Python3.10` 或更高版本、`pip` 以及 `requirements.txt` 文件中列出的 [PyPI](https://pypi.org/) 软件包。
如果你想设置 Python 虚拟环境而不是使用系统 Python(例如,如果系统 Python 被设置为 `externally-managed-environment`),你可以创建一个虚拟环境:
```
python -m venv env
```
其中 `env` 是创建的虚拟环境的名称,将生成同名文件夹。你可以在当前命令行中通过以下命令激活它:
```
source env/bin/activate
```
可以使用 `deactivate` 命令停用虚拟环境。请注意,打开新的命令行时虚拟环境不会自动激活,你需要通过 `source env/bin/activate` 来选择/激活它。
你可以通过以下命令下载并安装必要的软件包:
```
pip install -Ur requirements.txt
```
## 使用方法 (Usage)
可以使用以下命令查看所有可用命令的完整说明:
```
python main.py --help
```
初始时,词汇数据以文本文件形式存在,参见 `lokaord/database/data/` 文件夹内容,可以创建 SQLite 数据库并读取所有词汇到其中,然后可以构建词汇视图。所有这些都可以通过以下命令完成:
```
python main.py init
```
上述命令等同于 `python main.py build-db write-files build-sight md-stats`,或以下命令序列:
```
# 构建基础
python main.py build-db
# 将单词从基础写入文本文件
python main.py write-files
# 构建单词搜索
python main.py build-sight
# 以markdown格式打印数值数据
python main.py md-stats
```
需要指出的是,在当前实现和词汇数量(约 94000 个词)下,`init` 过程需要一些时间。一台拥有相当好硬件配置和 Linux 操作系统的电脑可以在一小时内完成,一台配置中等的 Linux 笔记本电脑大约需要一小时四十五分钟。而在运行 Windows 操作系统的电脑上,该过程显著更长(这可能主要是由于 SQLite 在 Windows 和 Linux 下对事务的处理方式不同造成的)。
### 从数据库备份构建基础
由于使用 `build-db` 从头构建 SQLite 数据库耗时较长,因此提供了从存储在 `lokaord/database/disk/lokaord/` 中的 SQLite 数据库备份构建基础的功能。这可以通过以下命令完成:
```
python main.py use-backup
```
上述命令将 `lokaord/database/db_bak_handling.json` 中指定的 SQLite 备份复制到 `lokaord/database/disk/lokaord/db.sqlite`,根据 `db_bak_handling.json` 中的设置执行必要的词条删除(如果需要),然后从给定 commit hash 的 git 历史中读取词汇变更和补充信息,该 hash 在 `db_bak_handling.json` 中指定。撰写本文时,指定的备份只是一周多前的,`use-backup` 命令不到一分钟即可完成完整构建。
如果你想使用自己的备份,可以随意复制 `lokaord/database/disk/lokaord/db.sqlite`,或者使用 `backup-db` 命令,然后修改 `db_bak_handling.json` 以便 `use-backup` 使用另一个备份:
```
python main.py backup-db
```
### 词汇添加
可以通过命令行界面 (TUI) 向数据库中添加词汇:
```
python main.py add-word
```
***注意:*** *当前 `add-word` 界面仅支持添加未复合的名词、动词、形容词和专有名词,有关进展请参见 [issue #36](https://github.com/Loknar/loka-ord/issues/36)。*
对于有兴趣提交数据库中似乎缺失词汇的读者,上述 `add-word` 命令虽有一定用处,但遗憾的是,通过命令行添加词汇的功能目前仍非常有限。如果要添加不同类型的动词、复合词等,目前唯一的方法是研究类似词汇的 JSON 文件结构,手动复制相应文件为新文件,修改其内容,然后运行:
```
python main.py update
```
这等同于命令 `python main.py build-db -ch write-files -tr build-sight md-stats`。
可以使用以下命令重建数据库:
```
python main.py init -r
```
等同于
```
python main.py build-db -r write-files build-sight md-stats
```
带有 `-r` 标志的 `build-db` 命令会删除现有数据库,然后根据词汇文件构建新数据库。
请注意,为复合词创建 JSON 文件时,不需要手动填写词形变化,因为它们是从 `"samsett"` 列表中的信息推导出来的。
**示例:** 添加单词 "hóflegur" 时,只需确保该词的所有词素都存在,然后创建如下所示的文件并保存为 `lysingarord/hóflegur.json`:
```
{
"orð": "hóflegur",
"flokkur": "lýsingarorð",
"samsett": [
{
"mynd": "hóf",
"samsetning": "stofn",
"kennistrengur": "no-hóf-hk"
},
{
"kennistrengur": "lo-legur-ó"
}
],
"kennistrengur": "lo-hóflegur",
"hash": "tba"
}
```
然后,当运行 `update` 时,词形变化将从 `"samsett"` 列表中的信息推导出来,并添加到文件中。
`"hash"` 中的值被设置为非空字符串,当运行 `update` 和/或 `write-files` 时,该值被设置为反映词汇数据的十六进制哈希值,因此对于相同的数据,哈希值相同,而当数据改变时,哈希值也会改变(参见 `handlers.py` 中的 `Ord.get_data_hash`)。
请注意,不同词类对文件名的要求各不相同。例如,名词需要在文件名中包含词性,"非独立"词汇(用于不单独使用的词素)在文件名中包含 `-ó`,而那些通过 "含义" 特别区分的词汇,其文件名中包含该含义,格式为 `-_merking_`(例如,请参见文件 `mæla-_segja_.json`)。
### 词汇查找
如果你想检查数据库中是否存在某个词汇,可以使用自选工具在已构建的数据库中执行查找,搜索包含该词汇名称的 JSON 文件,或者通过为查看器构建一个视图:
```
python main.py build-sight
```
上述命令根据 JSON 文件中的词汇数据创建一个预构建的词汇查找表,并保存在 `lokaord/database/data/disk/lokaord/sight.pointless`(或在 Windows 上为 `lokaord/database/data/disk/lokaord/sight.pickle`)。当 JSON 文件发生变化时,需要重建此预构建查找表,然后可用于单个词汇的查找:
```
python main.py search "orð"
```
或用于完整句子:
```
python main.py scan-sentence "Hér er haugur orða í hóflega langri setningu."
```
此命令也有一个简写名称 `ss`,即 `python main.py ss "Hér er setning."`。此外,还可以从文本文件读取文本:
```
python main.py ss -i input.txt
```
### 便捷运行命令
为了方便,在 Linux/Unix 上可以定义别名,例如
```
alias lokaord="$HOME/repos/loka-ord/bin/lokaord"
```
并将其保存在 `.bashrc` 或类似文件中,这样就可以避免不断地输入 `python main.py`,只需简单地输入 `lokaord`。对于 Windows,可以类似地使用 `.bat` 文件和 `bin/lokaord` 脚本,即将其添加到 PATH 或创建类似的 Windows 别名。
### 全新构建或仅构建变更
以下命令将重建数据库、写入文件、构建视图并以 markdown 表格形式打印统计信息,如本文档上方所示。
```
lokaord build-db -r write-files build-sight md-stats
```
这里是仅将更改文件中的数据移入数据库,然后将更改的词汇重新写入文件的命令(使用 git,以及在数据库中词汇更新时对词汇进行 `Edited` 时间戳记录):
```
lokaord build-db -ch write-files -ts "2023-04-20T22:30" build-sight md-stats
```
其中时间点 `"2023-04-20T22:30"` 指定了要将数据库中的词汇写入文件的变更有多旧(为方便起见,还提供了 `-to` 标志以及 `"last2min"`、`"last10min"` 和 `"last30min"` 值,以及用于当前运行起始时间点的 `-tr` 标志)。
## 与传统冰岛语的差异 (Deviances from traditional icelandic)
数据库在包含双 L 的单词书写方面与传统冰岛语存在差异。那些带有 "双 L" 并发音为所谓点击音的单词被写作 "łl" 而不是 "ll",即第一个字母 L 是波兰语的 Ł。引入这一差异的目的是为了能够区分像 "galli"(连体衣或服装)和 "gałli"(缺陷或瑕疵)这样的单词。
语言在变化和发展。在强调正确使用我们语言的同时,我们也必须对改善或解决使用问题的变更持开放态度。
我认为,能够区分发音为点击音的 "双 L" 单词和其他单词是非常有用,甚至在词汇处理技术化方面是必要的。这种能力(基于单词本身,即无需从文本上下文推断)将大大简化语音合成器和语法分析器的构建。
## 维护者 (Maintainer)
你好,感谢你读到这里。我奠定了 **lokaorð** 词汇数据库的基础,并在此以 LGPLv3 许可证发布。我选择这个许可证是因为我希望每个人都能自由地以任何他们喜欢的方式构建和使用该数据库。同时,我也希望对词汇数据库的功能、数据或数据结构的任何修改都能以相同的 LGPLv3 许可证发布,这样一位用户的添加或修改可以惠及使用该数据库的其他用户。
语言是自由的。
[@Loknar](https://github.com/Loknar)
标签:NLP 数据集, PyPI, Python, 免费资源, 公共领域, 冰岛语, 冰岛语学习, 复合词, 开源, 技术栈, 数据库, 无后门, 虚拟环境, 词形变化, 词汇数据库, 语言学, 语言资源, 逆向工具