分词工具(六):分词工具补充说明

接上一篇,我们来看抽词工具的补充说明。

分词工具(五):分词工具源码说明(二)

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 Automation using Python win32com package
使用 Python win32com 包的 OLE 自动化

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代码请参考以下文章。

5.2.文本文件编码相关(只支持UTF-8)

  • 输入文本文件的编码旨在仅支持 UTF-8。
  • 如果输入文件中的文本文件是ANSI编码,会出现如下错误,因为是cp949,非Unicode编码。
    • UnicodeDecodeError:“utf-8”编解码器无法解码位置 5 中的字节 0xb4:起始字节无效
  • 如果执行时出现类似错误,将文本文件另存为UTF-8再执行。

5.3.使用多处理的原因

上一篇文章“分词工具(四):分词工具源码说明(一)在“中,解释了使用多处理的代码。

4.2.3.使用多处理执行 get_file_text

4.2.4.使用多处理执行 get_word_list

最初创建此工具时,文本提取和单词提取都是单一处理。当它在 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 提供的词性标签组织在以下文档中。

https://docs.google.com/spreadsheets/d/1-9blXKjtjeKZqsf4NzHeYJCrr49-nXeRF6D80udfcwY/edit#gid=589544265

上述文件的摘录总结如下。

实质意义主要类别(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外语
上海汉字上海汉字
序列号数字序列号数字

关于单词提取工具的文章到此结束。如果我添加或改进某个功能,我会单独写一篇文章。


<< 相关文章列表 >>

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

zh_CN简体中文