Exemple #1
0
    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)
Exemple #2
0
    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
Exemple #3
0
    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...')
Exemple #4
0
    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)]
普通,最底层,方法,找出,他人,百姓生活,下层,小看人,平民,一切