大致上弄清楚了Glove的算法。此程序可以生成Vector矩阵。我的笔记本支持4860个词汇,维度是100的(用GPU,内存比较小)。注释里面写了算法。主要是数据的预处理:
- 去除空行
- 去除特殊字符(包括标点)
- 去除停用词
- 切分
- 再次去除停用词(因为切分后可能也有停用词产生)
- 生成字典
- 使用滑动窗口,生成共现矩阵
- 使用Mittens生成Glove Vector
- 保存
"""本文件包含中文NLP预处理常用的一些代码"""
import re
from mittens import GloVe
import numpy as np
import jieba
from gensim import corpora
class Preprocess(object):
"""中文NLP预处理类"""
# 用来处理数据的正则表达式
SPECIAL_SYMBOL_RE = re.compile(r'[^\u4e00-\u9fa5]+') # 用以删除一些特殊符号
def __init__(self, stopwords=None):
self.stopwords = stopwords
@staticmethod
def del_blank_lines(sentences):
"""删除句子列表中的空行,返回没有空行的句子列表
Args:
sentences: 字符串列表
"""
data = []
for s in sentences:
s = s.strip()
if s:
data.append(s)
return data
@staticmethod
def del_stopwords(classsstr, stopwords):
"""删除句子中的停用词
Args:
seg_sents: 嵌套列表,分好词的句子(列表)的列表
stopwords: 停用词列表
Returns: 去除了停用词的句子的列表
"""
stopwords = [line.strip() for line in open(stopwords, encoding='UTF-8').readlines()] # 注意停用词文本名称和所在位置
data = []
for s in classsstr:
s = s.split(" ")
outstr = ""
for word in s:
if