Project Icon

pecab

纯Python实现的高效韩语形态素分析工具

Pecab是一个基于Mecab的纯Python韩语形态素分析工具,保留了Mecab的高速和准确性,同时简化了安装流程。该工具提供形态素分割、词性标注和名词提取等功能,并采用零拷贝内存映射和双数组字典树技术,显著提升了加载速度并降低了内存占用。Pecab为韩语自然语言处理提供了一个高效且易于使用的解决方案。

Pecab

GitHub 发布 问题 Windows 操作状态 Ubuntu 操作状态 macOS 操作状态

Pecab 是一个基于 Mecab 的纯 Python 韩语形态素分析器。 Mecab 是 Taku Kudo 在 2011 年开发的基于 CRF 的形态素分析器。它既快速又准确,这就是为什么尽管它相当老旧,但仍然非常受欢迎的原因。 然而,它被认为是安装最棘手的库之一,事实上许多人在安装 Mecab 时都遇到了困难。

因此,从几年前开始,我就想制作一个纯 Python 版本的 Mecab,既易于安装又能继承 Mecab 的优点。 现在,Pecab 问世了。它确保了与 Mecab 非常相似的结果,同时易于安装。 更多详情,请参考以下内容。

安装

pip install pecab

使用方法

Pecab 的用户 API 受到 KoNLPy 的启发, KoNLPy 是韩国最著名的自然语言处理包之一。

1) PeCab(): 创建 Pecab 对象。

from pecab import PeCab

pecab = PeCab()

2) morphs(text): 将文本分割为形态素。

pecab.morphs("아버지가방에들어가시다")
['아버지', '가', '방', '에', '들어가', '시', '다']

3) pos(text): 返回形态素及其词性标签。

pecab.pos("이것은 문장입니다.")
[('이것', 'NP'), ('은', 'JX'), ('문장', 'NNG'), ('입니다', 'VCP+EF'), ('.', 'SF')]

4) nouns(text): 返回输入文本中的所有名词。

pecab.nouns("자장면을 먹을까? 짬뽕을 먹을까? 그것이 고민이로다.")
["자장면", "짬뽕", "그것", "고민"]

5) Pecab(user_dict=List[str]): 应用用户词典。

注意,用户词典中包含的词不能包含空格

  • 不使用 user_dict
from pecab import PeCab

pecab = PeCab()
pecab.pos("저는 삼성디지털프라자에서 지펠냉장고를 샀어요.")
[('저', 'NP'), ('는', 'JX'), ('삼성', 'NNP'), ('디지털', 'NNP'), ('프라자', 'NNP'), ('에서', 'JKB'), ('지', 'NNP'), ('펠', 'NNP'), ('냉장고', 'NNG'), ('를', 'JKO'), ('샀', 'VV+EP'), ('어요', 'EF'), ('.', 'SF')]
  • 使用 user_dict
from pecab import PeCab

user_dict = ["삼성디지털프라자", "지펠냉장고"]
pecab = PeCab(user_dict=user_dict)
pecab.pos("저는 삼성디지털프라자에서 지펠냉장고를 샀어요.")
[('저', 'NP'), ('는', 'JX'), ('삼성디지털프라자', 'NNG'), ('에서', 'JKB'), ('지펠냉장고', 'NNG'), ('를', 'JKO'), ('샀', 'VV+EP'), ('어요', 'EF'), ('.', 'SF')]

6) PeCab(split_compound=bool): 将复合词分解为更小的单位。

from pecab import PeCab

pecab = PeCab(split_compound=True)
pecab.morphs("가벼운 냉장고를 샀어요.")
['가볍', 'ᆫ', '냉장', '고', '를', '사', 'ㅏㅆ', '어요', '.']

7) ANY_PECAB_FUNCTION(text, drop_space=bool):决定是否返回空格。

这可用于所有的morphsposnouns函数。此参数的默认值为True

from pecab import PeCab

pecab = PeCab()
pecab.pos("토끼정에서 크림 우동을 시켰어요.")
[('토끼', 'NNG'), ('정', 'NNG'), ('에서', 'JKB'), ('크림', 'NNG'), ('우동', 'NNG'), ('을', 'JKO'), ('시켰', 'VV+EP'), ('어요', 'EF'), ('.', 'SF')]

pecab.pos("토끼정에서 크림 우동을 시켰어요.", drop_space=False)
[('토끼', 'NNG'), ('정', 'NNG'), ('에서', 'JKB'), (' ', 'SP'), ('크림', 'NNG'), (' ', 'SP'), ('우동', 'NNG'), ('을', 'JKO'), (' ', 'SP'), ('시켰', 'VV+EP'), ('어요', 'EF'), ('.', 'SF')]

实现细节

事实上,之前已经有一个纯Python实现的韩语形态素分析器。它的名字是Pynori。 我一直在使用Pynori,非常感谢Pynori的开发者。 然而,Pynori存在一些需要改进的问题。 所以我开始以其代码库为基础制作Pecab,并专注于解决这些问题。

1) 加载速度提高50~100倍,内存使用量更少

当我们创建Pynori对象时,它会从磁盘读取矩阵和词汇文件,并在运行时构建一个Trie树。 然而,这是一个相当重的任务。事实上,当我第一次运行Pynori时,我的电脑几乎冻结了10秒钟。 所以我通过两个关键思想解决了这个问题:1) 零拷贝内存映射2) 双数组Trie系统

第一个关键思想是零拷贝内存映射。 这允许虚拟内存(磁盘)中的数据几乎不需要复制到内存就能直接使用。 事实上,Pynori需要接近5秒的时间将mecab_csv.pkl文件加载到内存中,这带来了很大的负担。 我设计了使用numpy.memmap保存矩阵文件,使用可内存映射的pyarrow.Table保存词汇。

然而,在设计这个过程中遇到了一个问题。 Pynori中使用的Trie数据结构很难以内存映射的形式存储。 实际上,numpy只能很好地支持数组和矩阵,而pyarrow在大多数情况下只支持表格。 因此,我最初想用表格形式代替Trie。 但是,表格索引特定键的时间复杂度是线性的O(n), 所以实际的搜索时间可能会比以前长得多。 因此,第二个关键思想是双数组Trie(DATrie)。 与一般的Trie不同,DATrie只有两个简单的整数数组(base和check),而不是复杂的基于节点的结构, 所有的键都可以通过它们轻松检索。而这两个数组非常容易用内存映射创建! 双数组Trie可以很容易地保存在内存映射文件中,所以这是我最好的选择之一。 我本想用Python实现所有内容以便于安装包,但遗憾的是我找不到纯Python实现的DATrie源代码。 所以我自己制作了纯Python版本,你可以在这里找到实现。

总之,读取这两个文件所需的时间比以前减少了50~100倍, 由于它们实际上不驻留在内存中,内存消耗也显著减少。

2) 用户友好和Pythonic的API

使用Pynori时我遇到的另一个困难是用户API。 它有一个相当类Java的API和表达方式,为了使用它,我必须在创建主对象时传递许多参数。 然而,我希望使它像Mecab一样非常容易使用,并且不需要用户自己解析输出。 所以我思考了API,最终决定采用类似于用户已经熟悉的KoNLPy的API。 我相信这些API更加用户友好,将使库更容易使用。

许可证

Pecab项目在Apache License 2.0条款下授权。

Copyright 2022 Hyunwoong Ko.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

白日梦AI

白日梦AI提供专注于AI视频生成的多样化功能,包括文生视频、动态画面和形象生成等,帮助用户快速上手,创造专业级内容。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

讯飞绘镜

讯飞绘镜是一个支持从创意到完整视频创作的智能平台,用户可以快速生成视频素材并创作独特的音乐视频和故事。平台提供多样化的主题和精选作品,帮助用户探索创意灵感。

Project Cover

讯飞文书

讯飞文书依托讯飞星火大模型,为文书写作者提供从素材筹备到稿件撰写及审稿的全程支持。通过录音智记和以稿写稿等功能,满足事务性工作的高频需求,帮助撰稿人节省精力,提高效率,优化工作与生活。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号