转眼间,接触NLP已经一年多了,虽然大部分时间是在打杂,但也多少积累了一点东西。今天在这里我就把我自己写的中文NLP数据预处理代码分享一下,代码基于python 3.6.5在win 10通过测试,涵盖了我自己常用的一些操作。
程序大致包括的功能如下表:
| 文件操作 | 去噪操作 | 其他 |
|---|---|---|
| 读写文本 | 删除空行 | 分词 |
| 合并文件 | 删除中英文标点 | 词性标注 |
| 分割数据集 | 删除停用词 | 命名实体识别 |
| - | 删除乱码和特殊符号 | 依存句法分析 |
| - | 删除英文字符 | 语义角色标注 |
一般来说,中文NLP中数据预处理的步骤是:去除无意义符号、去除非中文、分词、去除停用词、向量化。除了向量化,其他步骤我的程序中都有写到,向量化一般使用TF-IDF和Word2Vec比较多。
另外,上表中其他这一列的功能借助了工具pyltp。对于pyltp的模型,有一点需要注意,我使用的语义角色标注模型是pisrl_win.model,需要另外下载,而Linux平台下直接使用ltp_data_v3.4.0文件夹下的pisrl.model文件就可以了。这里是所有模型的下载链接。
使用代码之前需要安装一些依赖:
pip install numpy
pip install pyltp
pip install zhon
如果windows平台下安装pyltp报错,可以使用这个链接下载python 3.6的版本,还有python 3.5版本。然后使用命令pip install xxx.whl安装对应的文件即可。
下面直接看程序preprocess.py,因为注释比较详细,我就不再解释了。
"""本文件包含中文NLP预处理常用的一些代码"""
import os
import re
import string
import numpy as np
from pyltp import *
from zhon.hanzi import punctuation
class Preprocess(object):
"""中文NLP预处理类"""
# 用来处理数据的正则表达式
DIGIT_RE = re.compile(r'\d+')
LETTER_RE = re.compile(r'[a-zA-Z]+')
SPECIAL_SYMBOL_RE = re.compile(r'[^\w\s\u4e00-\u9fa5]+') # 用以删除一些特殊符号
NAMED_ENTITY = re.compile(r'[SBIE]+')
STOPS = ['。', '.', '?', '?', '!', '!'] # 中英文句末字符
# 句子所限制的最小,最大长度
SENTENCE_MIN_LEN = 5
SENTENCE_MAX_LEN = 50
def __init__(self, ltp_model_dir):
self._cws_model_path = os.path.join(ltp_model_dir, 'cws.model')
self._pos_model_path = os.path.join(ltp_model_dir, 'pos.model')
self._ner_model_path = os.path.join(ltp_model_dir, 'ner.model')
self._par_model_path = os.path.join(ltp_model_dir, 'parser.model')
self._srl_model_path = os.path.join(ltp_model_dir, 'pisrl_win.model')
@staticmethod
def read_text_file(text_file):
"""读取文本文件,并返回由每行文本作为元素组成的list."""
with open(text_file, 'r', encoding='utf-8') as file:
lines = [line.strip() for line in file]
return lines
@staticmethod
def write_text_file(text_list, target_file):
"""将文本列表写入目标文件

本文作者分享了自己编写的中文NLP数据预处理Python代码,涵盖去除无意义符号、非中文字符、分词、停用词过滤等功能。程序基于pyltp库,特别指出需要单独下载特定的语义角色标注模型。文章还提供了安装依赖和解决pyltp在不同平台安装问题的建议,并鼓励读者在评论区提出问题和改进建议。
938

被折叠的 条评论
为什么被折叠?



