转眼间,接触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):
"""将文本列表写入目标文件
Args:
text_list: 列表,每个元素是一条文本
target_file: 字符串,写入目标文件路径
"""