分词工具(六):分词工具补充说明
接上一篇,我们来看抽词工具的补充说明。
5. 分词工具补充说明
5.1.为什么使用 OLE 自动化?
OLE Aumation 在维基百科中的定义如下。
在 Microsoft Windows 应用程序编程中,OLE Automation(后来简称为 Automation[1][2])是 Microsoft 开发的一种进程间通信(IPC)机制。它基于组件对象模型 (COM) 的子集,旨在通过脚本语言(最初是 Visual Basic)使用,但现在可通过多种语言在 Windows 上使用。
资源: https://en.wikipedia.org/wiki/OLE_Automation
在 Python 中,可以使用 win32com 包实现 OLE 自动化。您可以通过控制 MS-Office 应用程序来执行所需的功能。
OLE Aumation 用于单词提取工具的原因如下。
- 有以下专用包可以读写MS-Word和PowerPoint,但我不是故意用的。
- MS-Word:python-docx、python-docx2txt
- 简报:python-pptx
- Excel:openpyxl、xlsxwriter、pyxlsb
- 大多数公司环境强制安装 DRM 软件,因此文档文件被加密。
- 如果使用专用包,则无法读取加密文件。
- 如果你使用带有pywin32包的OLE自动化方法,你可以通过Office程序读取文件。
- 使用 OLE Automation 可能会损失一些性能,但结果是有保证的。
控制MS-Word、PowerPoint、Excel的Python代码请参考以下文章。
- MS-Word 自动化: 4.3.1. get_doc_text 函数
- PowerPoint 自动化: 4.3.2._get_ppt_text_函数
- Excel自动化: 4.3.4._get_db_comment_text_函数
5.2.文本文件编码相关(只支持UTF-8)
- 输入文本文件的编码旨在仅支持 UTF-8。
- 如果输入文件中的文本文件是ANSI编码,会出现如下错误,因为是cp949,非Unicode编码。
- UnicodeDecodeError:“utf-8”编解码器无法解码位置 5 中的字节 0xb4:起始字节无效
- 如果执行时出现类似错误,将文本文件另存为UTF-8再执行。
5.3.使用多处理的原因
上一篇文章“分词工具(四):分词工具源码说明(一)在“中,解释了使用多处理的代码。
最初创建此工具时,文本提取和单词提取都是单一处理。当它在 2021 年初首次用于 K 公司项目时,在笔记本电脑(CPU i5,16GB Ram)上从大约 160,000 条列评论中提取标准候选词需要大约 20 个小时。
经过多次迭代(包括测试)后,需要缩短执行时间。当我google到使用Thread进行并行处理时,我认为多处理比多线程更合适,因为Python有GIL(Global Interpreter Lock)的概念。
通过稍微修改代码,将多处理应用于文本提取和单词提取,并创建一个参数(multi_process_count)来指定执行期间的并行度。
当multi_process_count设置为8执行时,原本耗时20小时的任务缩短到40分钟左右,效果还不错。
5.4.复合词抽取注意事项
Mecab主要功能中的名词、词性、词形的描述如下。
功能 | 解释 |
名词(文本) | 解析文本,仅提取名词,并返回一个列表 |
位置(文本) | 解析文本并返回形状列表(语素、词性、标签) |
变形(文字) | 解析文本,仅提取语素,并返回一个列表 |
每个函数的执行结果是下面输入字符串的例子。
* 输入字符串:用户定义功能和非功能需求。
功能 | 执行结果 |
名词(文本) | ['使用'、'能力'、'需求'、'资产'、'特性'、'需求'、'资产'、'定义'] |
位置(文本) | [('enable', 'NNG'), ('character', 'XSN'), ('is', 'JX'), ('feature', 'NNG'), ('red', 'XSN') , ('需求', 'NNG'), ('物质', 'NNG'), ('和', 'JC'), ('非', 'XPN'), ('特征', 'NNG') ; , ('应该', 'XSV+EF'), ('.', 'SF')] |
变形(文字) | ['使用', '用户', '是', '特征', '克星', '请求', '规范', '和', '非', '特征', '克星', '请求', '重要','为了','定义','应该','。'] |
* 输入字符串:数据标准化是数据架构建设的重要领域。
功能 | 执行结果 |
名词(文本) | ['数据'、'标准'、'数据'、'架构'、'构建'、'关键'、'区域'] |
位置(文本) | [('数据', 'NNG'), ('标准', 'NNG'), ('星期二', 'XSN'), ('is', 'JX'), ('数据', 'NNG') , ('architecture', 'NNG'), ('build', 'NNG'), ('of', 'JKG'), ('important', 'NNG'), ('one', 'XSA+ETM '), ('region', 'NNG'), ('this', 'VCP'), ('da', 'EF'), ('.', 'SF')] |
变形(文字) | ['数据'、'标准'、'字段'、'A'、'数据'、'架构'、'构造'、'属于'、'重要'、'一个'、'区域'、'这个'、'全部', '。'] |
抽词工具并没有直接使用nouns函数,而是通过对pos函数的结果应用正则表达式来抽取词。下面是对正则表达式模式的解释。
使用正则表达式的模式:'(NNP/|NNG/)+(XSN/)*|(XPN/)+(NNP/|NNG/)+(XSN/)*|(SL/)+'
- 此模式找到以下三种情况之一:
- (NNP/|NNG/)+(XSN/)*:1个或多个(专有名词或普通名词)(必填)+ 0个或多个名词派生后缀(可选)
- (XPN/)+(NNP/|NNG/)+(XSN/)*:1个或多个前缀(必填)+ 1个或多个(专有名词或普通名词)(必填)+ 0个或多个名词派生后缀(可选) )
- (SL/)+:至少一门外语(必填)
通过调用 nouns(text) 仅提取名词和通过应用正则表达式提取附加复合词的示例如下:
* 输入字符串:用户定义功能和非功能需求。
功能 | 执行结果 |
仅提取名词 名词(文本) | 使用、功能、需要、物质、功能、需要、物质、定义 |
应用正则表达式 | 使用、功能、需要、要求、功能、要求、要求、定义、用户[化合物]、功能[化合物]、要求[化合物]、非功能[化合物]、要求[化合物] |
* 输入字符串:数据标准化是数据架构建设的重要领域。
功能 | 执行结果 |
仅提取名词 名词(文本) | 数据、标准、数据、架构、构建、重要、区域 |
应用正则表达式 | Data, standard, data, architecture, construction, important, domain, 数据标准化[compound], 数据架构构建[compound] |
之所以额外提取复合词,是为了防止在构建标准词典的初期,通过审查是否将复合词注册为标准,以防以后添加复合词时出现问题。
如果后面加入复合词,则可能会改变使用构成复合词的单个词的标准术语的物理名称,甚至数据库的表名和列名也可能不得不使用标准术语进行更改。
当然,有一种方法是只改变以后要创建的标准术语的物理名称,而不改变已经创建的标准术语的物理名称。从长远的角度推荐。
更改已创建的标准术语的物理名称并非易事。如果开发已经在进行中,您必须继续更改引用名称已更改的列的源代码。需要额外时间表并涉及多个利益相关者的项目可能会受到问责制。
考虑到大量的源代码改动会对项目产生很大的影响,难度也很大,因此在建立标准词典的初期阶段对复合词进行复习是必经的过程。
没有办法在知道影响的情况下识别候选复合词,而这个词提取工具提供了一种合适的方法。
它可能不是最优的,但我认为它作为目前的替代方案已经足够了。
5.5.词法分析器词类的类型
上一篇 分词工具(五):分词工具源码说明(二) 的 4.4._get_word_list_函数 有以下内容:
- 第 64 行:使用 pos 函数执行语素分析器的词性标注。词性标注相关的内容我会分开来。
- 词性标注函数 pos 将输入字符串分解为词性单元,并返回每个单元都被标记的字符串。
- 比如文本是'Users define functional and non-functional requirements',那么pos函数的执行结果就是'[('use', 'NNG'), ('character', 'XSN'), (' is', 'JX'), ('function', 'NNG'), ('enemy', 'XSN'), ('request', 'NNG'), ('spec', 'NNG' '), ( 'and', 'JC'), ('b', 'XPN'), ('feature', 'NNG'), ('enemies', 'XSN'), ('request', 'NNG'), ( '东西', 'NNG'), ('to', 'JKO'), ('定义', 'NNG'), ('应该', 'XSV+EF'), ('.', 'SF') ]'。
- 上例标注的词性中,'NNG'是普通名词,'XSN'是名词派生后缀,'JX'是助动词,'JC'是连接词,'XPN'是前缀,'JKO'是宾语助词,'XSV + EF'是动词派生后缀+词尾,'SF'表示句号/问号/感叹号。
Mecab 提供的词性标签组织在以下文档中。
上述文件的摘录总结如下。
实质意义 | 主要类别(5个词+其他) | 世宗词性标签 | 机械百科全书 词性标签 | ||
标签 | 解释 | 标签 | 解释 | ||
实体语素 | 川 | NNG | 普通名词 | NNG | 普通名词 |
神经网络 | 专有名词 | 神经网络 | 专有名词 | ||
NNB | 从属名词 | NNB | 从属名词 | ||
国家广播公司 | 表示单位的名词 | ||||
天然橡胶 | 调查 | 天然橡胶 | 调查 | ||
NP | 代词 | NP | 代词 | ||
动词 | 维维 | 动词 | 维维 | 动词 | |
弗吉尼亚州 | 形容词 | 弗吉尼亚州 | 形容词 | ||
VX | 助动词 | VX | 助动词 | ||
VCP | 肯定说明符 | VCP | 肯定说明符 | ||
VCN | 否定说明符 | VCN | 否定说明符 | ||
修饰符 | 毫米 | 侦探 | 毫米 | 侦探 | |
美格 | 普通副词 | 美格 | 普通副词 | ||
少校 | 连词副词 | 少校 | 连词副词 | ||
独立的语言 | 我知道了 | 欹 | 我知道了 | 欹 | |
形式语素 | 关系词 | JKS | 记名调查 | JKS | 记名调查 |
JKC | 距离调查 | JKC | 距离调查 | ||
JKG | 棺材案调查 | JKG | 棺材案调查 | ||
JKO | 对象调查 | JKO | 对象调查 | ||
JKB | 二次火灾调查 | JKB | 二次火灾调查 | ||
JKV | 调查 | JKV | 调查 | ||
JKQ | 引文检查 | JKQ | 引文检查 | ||
剑侠 | 辅助的 | 剑侠 | 辅助的 | ||
杰西 | 连接调查 | 杰西 | 连接调查 | ||
鲜马产妇 | EP | 鲜马产妇 | EP | 鲜马产妇 | |
词尾 | 英孚 | 最终结局 | 英孚 | 最终结局 | |
欧共体 | 连接词尾 | 欧共体 | 连接词尾 | ||
ETN | 名词形式结尾 | ETN | 名词形式结尾 | ||
ETM | 管状可塑末端 | ETM | 管状可塑末端 | ||
字首 | XPN | 链前缀 | XPN | 链前缀 | |
后缀 | XSN | 名词派生后缀 | XSN | 名词派生后缀 | |
XSV | 动词派生后缀 | XSV | 动词派生后缀 | ||
XSA | 形容词派生后缀 | XSA | 形容词派生后缀 | ||
基数 | XR | 基数 | XR | 基数 | |
符号 | 顺丰 | 句号, 问号, 感叹号 | 顺丰 | 句号, 问号, 感叹号 | |
SE | 省略 | SE | 省略 …… | ||
党卫军 | 引用,插入语,虚线 | 单点登录 | 打开括号 (, [ | ||
科学与技术中心 | 右括号 ), ] | ||||
SP | 休息,中点,冒号,削减 | SC | 分隔器 , · / : | ||
所以 | 连字符(海浪,隐藏,丢失的) | SY | |||
软件 | 其他符号 (逻辑数学符号,货币符号) | ||||
韩语以外 | SL | 外语 | SL | 外语 | |
上海 | 汉字 | 上海 | 汉字 | ||
序列号 | 数字 | 序列号 | 数字 |
关于单词提取工具的文章到此结束。如果我添加或改进某个功能,我会单独写一篇文章。
<< 相关文章列表 >>