def transform_word2vec_model_name(self, flag): """ 根据 flag 转换成完整的 word2vec 模型文件名 :param flag: :return: """ from data_processing_util.word2vec_util.word2vec_util import Word2vecUtil return Word2vecUtil().transform_word2vec_model_name(flag)
def to_embedding_weight(self, path): """ 使用训练好的 word2vec 模型 将字典中每个词转为 word2vec向量,接着生成一个 Embedding层的初始权重形式,可用于初始化 Embedding 层的权重。 1. 加载word2vec模型 2. :param path: word2vec 模型文件路径 :type path: str :return: """ if self.word2vec_model is None: w2v_util = Word2vecUtil() self.word2vec_model = w2v_util.load(path) size = self.vocabulary_size embedding_weights = np.zeros((size, self.word2vec_model.vector_size)) words_count_no_in_w2v = 0 words_count_no_in_vacab = 0 words_count_in = 0 words_count_paddding = 0 for key, value in self.train_data_dict.token2id.items(): vector, flag = self.get_w2vEmbedding(key) embedding_weights[value, :] = vector if flag == 'NO_IN_W2V': words_count_no_in_w2v += 1 if flag == 'NO_IN_MODEL_VOCAB': words_count_no_in_vacab += 1 if flag == 'OK': words_count_in += 1 # print(key) if flag == 'PADDING': words_count_paddding += 1 if self.verbose > 0: print('没有出现在w2v模型中的词有:%d个' % (words_count_no_in_w2v)) print('没有出现在模型vocab中的词有:%d个' % (words_count_no_in_vacab)) print('出现在w2v模型中的词有:%d个' % (words_count_in)) # self.embedding_weights = embedding_weights return embedding_weights
def __init__(self, need_segmented=True, verbose=0, full_mode=True, feature_type='seg', remove_stopword=True, replace_number=True, lowercase=True, zhs2zht=True, remove_url=True, sentence_padding_length=7, padding_mode='center', add_unkown_word=True, to_onehot_array=False, word2vec_to_solve_oov=False, **kwargs): """ Onehot特征编码器,将句子转成 onehot 编码(以字典索引形式表示,补齐) 1. 初始化参数 2. build feature encoder :param need_segmented: 数据处理选项,是否需要经过分词处理;如果为False,那么输入的数据不需要分词,提供的数据的每个句子的每个词要以空格分割.比如: ['我 要 买 手机','你好','早上 好'];如果为True,提供原始输入句子即可,比如:['我要买手机','你好','早上好']. :type need_segmented: bool :param verbose: 数值越大,输出越详细 :type verbose: int :param full_mode: jieba分词选项,是否使用 full mode,默认为True :type full_mode: bool :param feature_type: 模型设置选项,选择不同粒度的特征单位, 目前只支持 word,seg和 word_seg。 - word:直接以字为单位,比如 我要买手机--->我 要 买 手 机 - seg:分词后的词单元为单位,比如 我要买手机--->我 要 买 手机 - word_seg:分词后的字和词为单位,去重,比如 我要买手机--->我 要 买 手机 手 机 - word_seg_concat:分词后的字和词为单位,不去重,比如 我要买手机--->我 要 买 手 机 我 要 买 手机 :type feature_type: str :param remove_stopword: jieba分词选项,是否去除 stop word,默认为True :type remove_stopword: bool :param replace_number: jieba分词选项,是否将数据统一替换成NUM,默认为True :type replace_number: bool :param lowercase: jieba分词选项,是否将数据统一替换成NUM,默认为True :type lowercase: bool :param zhs2zht: jieba分词选项,出現繁体的時候,是否转简体,默认为True :type zhs2zht: bool :param remove_url: jieba分词选项,是否移除 微博url,http://t.cn/开头的地址,默认为True :type remove_url: bool :param add_unkown_word: 训练库字典的设置选项,是否在字典中增加一个未知词字符(UNKOWN) :type add_unkown_word: bool :param sentence_padding_length: 句子的补齐(截断)长度,默认为7 :type sentence_padding_length: int :param padding_mode: 句子的补齐(截断)模式,有四种模式: 1. center:如果小于sentence_padding_length的话往两边补0;如果超出sentence_padding_length的话,直接在后面截断。 2. left:如果小于sentence_padding_length的话往左边补0;如果超出sentence_padding_length的话,直接在后面截断。 3. right:如果小于sentence_padding_length的话往右边补0;如果超出sentence_padding_length的话,直接在后面截断。 4. none:不补齐。 :type padding_mode: str :param to_onehot_array: 输出 onehot array,还是字典索引 array,默认为False,输出字典索引, :type to_onehot_array: bool :param word2vec_to_solve_oov: 使用word2vec扩展oov词 :type word2vec_to_solve_oov: bool :param kwargs: - word2vec_model_file_path: - vocabulary_including_test_set: (default,True) - update_dictionary: (default,True) - 等 """ self.full_mode = full_mode self.feature_type = feature_type self.remove_stopword = remove_stopword self.verbose = verbose self.need_segmented = need_segmented self.replace_number = replace_number self.lowercase = lowercase self.zhs2zht = zhs2zht self.remove_url = remove_url self.add_unkown_word = add_unkown_word self.sentence_padding_length = sentence_padding_length self.padding_mode = padding_mode self.to_onehot_array = to_onehot_array self.word2vec_to_solve_oov = word2vec_to_solve_oov self.kwargs = kwargs # 检验参数合法性 assert self.padding_mode in [ 'center', 'left', 'right', 'none' ], 'padding mode 只能取: center,left,right,none' assert self.feature_type in [ 'word', 'seg', 'word_seg', 'word_seg_concat' ], 'feature type 只能取: word,seg和word_seg' # 初始化jieba分词器 if need_segmented: self.jieba_seg = Jieba_Util(verbose=self.verbose) # 训练库提取出来的字典对象 self.train_data_dict = None # 训练库提取出来的字典词汇列表 self.vocabulary = None # 训练库提取出来的字典词汇个数 self.vocabulary_size = None # UNKOWN字符的索引 self.unknow_token_index = None # PADDING字符的索引 self.padding_token_index = None # region NOTE: 这些变量不再维护,因为消耗内存 # 原始训练数据 # self.train_data = None # 切完词的句子 # self.segmented_sentences = None # 训练库句子的字典索引形式 # self.train_index = None # 训练库句子的补齐的字典索引形式 # self.train_padding_index = None # 训练库句子装成onehot array # endregion self.train_onehot_array = None # word2vec 模型 self.word2vec_model = None if word2vec_to_solve_oov: assert kwargs.has_key( 'word2vec_model_file_path'), '请提供 属性 word2vec_model_file_path' # 加载word2vec模型 w2v_util = Word2vecUtil() self.word2vec_model = w2v_util.load( kwargs.get('word2vec_model_file_path')) if verbose > 1: logging.debug('build feature encoder...') print('build feature encoder...')
def __init__( self, # rand_seed=1337, verbose=0, need_segmented=True, full_mode=True, remove_stopword=True, replace_number=True, lowercase=True, zhs2zht=True, remove_url=True, feature_method='bow', feature_type='seg', max_features=None, word2vec_to_solve_oov=False, save_middle_result=False, **kwargs): ''' 1. 初始化参数,并验证参数合法性 2. build feature encoder :param verbose: 数值越大,输出越详细 :type verbose: int :param need_segmented: 数据处理选项,是否需要经过分词处理;如果为False,那么输入的数据不需要分词,提供的数据的每个句子的每个词要以空格分割.比如: ['我 要 买 手机','你好','早上 好'];如果为True,提供原始输入句子即可,比如:['我要买手机','你好','早上好']. :type need_segmented: bool :param full_mode: jieba分词选项,是否使用 full mode,默认为True :type full_mode: bool :param remove_stopword: jieba分词选项,是否去除 stop word,默认为True :type remove_stopword: bool :param replace_number: jieba分词选项,是否将数据统一替换成NUM,默认为True :type replace_number: bool :param lowercase: jieba分词选项,是否将数据统一替换成NUM,默认为True :type lowercase: bool :param zhs2zht: jieba分词选项,出現繁体的時候,是否转简体,默认为True :type zhs2zht: bool :param remove_url: jieba分词选项,是否移除 微博url,http://t.cn/开头的地址,默认为True :type remove_url: bool :param feature_method: 模型设置选项,选择 bow或者tfidf 特征计算方法 :type feature_method: str :param feature_type: 模型设置选项,选择不同粒度的特征单位, 目前只支持 word,seg和 word_seg。 - word:直接以字为单位,比如 我要买手机--->我 要 买 手 机 - seg:分词后的词单元为单位,比如 我要买手机--->我 要 买 手机 - word_seg:分词后的字和词为单位,比如 我要买手机--->我 要 买 手机 手 机 :type feature_type: str :param max_features: 模型设置选项,特征选择的最大特征词数 :type max_features: int :param word2vec_to_solve_oov: 使用word2vec扩展oov词 :type word2vec_to_solve_oov: bool :param save_middle_result: 是否保存中间结果,为了节约空间默认关闭! :type save_middle_result: bool :param kwargs: 支持 word2vec_model_file_path等 :type kwargs: dict ''' # self.rand_seed = rand_seed self.save_middle_result = save_middle_result self.verbose = verbose self.full_mode = full_mode self.remove_stopword = remove_stopword self.need_segmented = need_segmented self.replace_number = replace_number self.lowercase = lowercase self.zhs2zht = zhs2zht self.remove_url = remove_url self.feature_method = feature_method self.feature_type = feature_type self.max_features = max_features self.word2vec_to_solve_oov = word2vec_to_solve_oov self.kwargs = kwargs # 检验参数合法性 assert self.feature_method in ['bow', 'tfidf' ], 'feature method 只能取: bow,tfidf' assert self.feature_type in ['word', 'seg', 'word_seg' ], 'feature type 只能取: word,seg和word_seg' if word2vec_to_solve_oov: # 加载word2vec模型 if word2vec_to_solve_oov: assert kwargs.has_key('word2vec_model_file_path' ), '请提供 属性 word2vec_model_file_path' # 加载word2vec模型 w2v_util = Word2vecUtil() self.word2vec_model = w2v_util.load( kwargs.get('word2vec_model_file_path')) # 初始化jieba分词器 if need_segmented: self.jieba_seg = Jieba_Util(verbose=self.verbose) # 特征编码器: bow or tf-idf transformer self.feature_encoder = None # 训练库提取出来的字典对象 self.train_data_dict = None # 训练库提取出来的字典词汇列表 self.vocabulary = None # 训练库提取出来的字典词汇个数 self.vocabulary_size = None # 训练样例的个数 self.train_data_count = 0 # region 为了节约内存空间,实际运行中时,建议设置 save_middle_result = False(关闭中间结果的保存) if self.save_middle_result: # 原始训练数据 self.train_data = None # 切完词的句子 self.segmented_sentences = None # 训练句子特征 self.train_features = None
type, size, iter, train_method = 20963, 50, 50, 'skip' type, size, iter, train_method = 5997, 50, 50, 'cbow' type, size, iter, train_method = 20963, 50, 50, 'cbow' type, size, iter, train_method = 20963, 300, 50, 'cbow' # type,size,iter,train_method= 5997,50,5,'skip' # type,size,iter,train_method= 20963,50,5,'skip' # # type,size,iter,train_method= 5997,50,5,'cbow' # type,size,iter,train_method= 20963,50,5,'cbow' util = Word2vecUtil( size=size, train_method=train_method, iter=iter, ) train() test() ''' [(u'\u914d\u7f6e', 0.922458291053772), (u'\u8fd9\u6b3e', 0.9009464979171753), (u'\u62ff\u5230', 0.8862029910087585), (u'\u82f1\u5bf8', 0.8822333812713623), (u'\u4ef7\u683c\u6bd4', 0.8798030018806458), (u'ipad', 0.877876341342926), (u'\u57fa\u672c\u4e00\u81f4', 0.8750308752059937), (u'\u82f9\u679c', 0.8719356656074524), (u'pro', 0.8665716052055359), (u'\u7ffb\u65b0', 0.8638173937797546)] 配置,这款,拿到,英寸,价格比,ipad,基本一致,苹果,pro,翻新 [(u'\u5f90\u6d77', 0.8884794116020203), (u'\u75bc\u7231', 0.8816609382629395), (u'\u770b\u5f97\u51fa', 0.8788071274757385), (u'\u4e0d\u8fc7', 0.8751739263534546), (u'\u60ca\u8bb6', 0.8714367151260376), (u'\u6000\u604b', 0.866191565990448), (u'\u89c9\u5f97', 0.8654507398605347), (u'\u53e4\u602a', 0.8633217811584473), (u'\u6709\u70b9', 0.857458233833313), (u'\u5f88', 0.8566928505897522)] 徐海,疼爱,看得出,不过,惊讶,怀恋,觉得,古怪,有点,很 [(u'\u4eba\u7406', 0.9271324872970581), (u'\u8212\u5766', 0.9260797500610352), (u'\u653e\u8fc7', 0.9249367713928223), (u'\u8bdd', 0.9237825274467468), (u'\u5fc3\u91cc', 0.9217459559440613), (u'\u5ac1', 0.920974612236023), (u'\u6bcf\u6b21', 0.9208803772926331), (u'\u5bb3\u6015', 0.9200080633163452), (u'\u5b9e\u8bdd', 0.9199990034103394), (u'\u53cd\u6b63', 0.9188157916069031)] 人理,舒坦,放过,话,心里,嫁,每次,害怕,实话,反正 [(u'\u666e\u901a', 0.9671438932418823), (u'\u6700\u5e95\u5c42', 0.9643466472625732), (u'\u65b9\u6cd5', 0.9580934643745422), (u'\u627e\u51fa', 0.9523003101348877), (u'\u4ed6\u4eba', 0.9500033855438232), (u'\u767e\u59d3\u751f\u6d3b', 0.9421230554580688), (u'\u4e0b\u5c42', 0.9415550827980042), (u'\u5c0f\u770b\u4eba', 0.9411033391952515), (u'\u5e73\u6c11', 0.9399583339691162), (u'\u4e00\u5207', 0.9395464658737183)] 普通,最底层,方法,找出,他人,百姓生活,下层,小看人,平民,一切