Word2vec+textrank---抽取式摘要生成

原项目地址:
https://github.com/ztz818/Automatic-generation-of-text-summaries

相关知识介绍:
Word2Vec理论知识:https://blog.csdn.net/Pit3369/article/details/96482304
中文文本关键词抽取的三种方法(TF-IDF、TextRank、word2vec):
https://blog.csdn.net/Pit3369/article/details/95594728

调用summarize(text, n)返回Top N个摘要

  1. tokens = cut_sentences(text)

    按照。!?切分句子,返回给tokens[[句子1],[句子2]]

  2. 对句子tokens分词、通用词,返回列表sents:[[句子1分词结果],[句子2分词结果]],分词结果空格隔开

  3. sents = filter_model(sents)

    遍历列表,去除word2vec词向量里未出现的词。

  4. graph = create_graph(sents)

    传入句子列表,返回句子间相似度的图board[n*n],句子个数为n,图元素为i、j句子的相似值
    在这里插入图片描述

    • 循环i、j:board[i][j] = compute_similarity_by_avg(word_sent[i], word_sent[j])

      compute_similarity_by_avg(sents_1, sents_2)中,把句子中各个词词向量相加,除以句子长度作为句子平均得分,用来计算两个句子的相似度,返回给create_graph

    • 用句子i、j的平均词向量进行相似度计算,相似值存储在board[i][j],返回给相似度图矩阵graph[][]

  5. scores = weight_sentences_rank(graph)
    输入相似度图矩阵graph[n*n],返回句子分数数组:scores[i],句子i的分值,初始值为0.5

    while循环迭代直至句子i分数变化稳定在0.0001:

    • scores[i] = calculate_score(weight_graph, scores, i)

      计算句子在图中分数,返回句子i的分数。参数j遍历所有句子:

      • 计算分子:fraction = weight_graph[j][i] * scores[j]
      • 计算分母:denominator += weight_graph[j][k],参数k遍历句子j、k是否关联
      • 分数累加:added_score += fraction / denominator
      • 根据PageRank算法中PR值的计算方法,算出最终的分数,并返回:
        weighted_score = (1 - d) + d * added_score
        在这里插入图片描述
  6. sent_selected = nlargest(n, zip(scores, count()))

    选取句子分数scores[],Top n的句子,作为摘要。

相似值计算:
使用的计算句子相似度的方式如下:

如计算句子A=[‘word’,‘you’,‘me’],与句子B=[‘sentence’,‘google’,‘python’]计算相似性,从word2vec模型中分别得到A中三个单词的词向量v1,v2,v3取其平均值Va(avg)=(v1+v2+v3)/3。对句子B做同样的处理得到Vb(avg),然后计算Va(avg)与Vb(avg)连个向量的夹角余弦值,Cosine Similarity视为句子A与B的相似度
在这里插入图片描述

def cut_sentences(sentence):
    puns = frozenset(u'。!?')#分隔句子
    tmp = []
    for ch in sentence:
        tmp.append(ch)
        if puns.__contains__(ch):
            yield ''.join(tmp)
            tmp = []
    yield ''.join(tmp)
 
 
# 句子中的stopwords
def create_stopwords():
    stop_list = [line.strip() for line in open("G:\1graduate\news_stopwords.txt", 'r', encoding='utf-8').readlines()]
    return stop_list

def two_sentences_similarity(sents_1, sents_2):
    '''
    计算两个句子的相似性
    :param sents_1:
    :param sents_2:
    :return:
    '''
    counter = 0
    for sent in sents_1:
        if sent in sents_2:
            counter += 1
    return counter / (math.log(len(sents_1) 
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Word2vec-BiLSTM-CRF是一种用于命名实体识别(NER)的神经网络模型。它结合了三个不同的层:Word2vec嵌入层、双向长短时记忆网络(BiLSTM)层和条件随机场(CRF)层。Word2vec嵌入层将每个单词转换为向量表示,BiLSTM层将这些向量作为输入并学习上下文信息,最后CRF层将BiLSTM层的输出作为输入并进行标记预测。 以下是Word2vec-BiLSTM-CRF模型的基本步骤: 1. 将每个单词转换为向量表示,这可以使用预训练的Word2vec模型来完成。 2. 将这些向量作为输入传递给BiLSTM层,该层将学习上下文信息并生成相应的输出。 3. 将BiLSTM层的输出作为输入传递给CRF层,该层将对每个标记进行预测,并使用Viterbi算法来找到最佳标记序列。 以下是一个使用Python和Keras实现Word2vec-BiLSTM-CRF模型的示例: ```python from keras.models import Model, Input from keras.layers import LSTM, Embedding, Dense, TimeDistributed, Dropout, Bidirectional from keras_contrib.layers import CRF import numpy as np # 定义模型输入 input = Input(shape=(MAX_LEN,)) # 添加Word2vec嵌入层 model = Embedding(input_dim=len(word2idx), output_dim=EMBEDDING_DIM, input_length=MAX_LEN, weights=[embedding_matrix], trainable=False)(input) # 添加双向LSTM层 model = Bidirectional(LSTM(units=HIDDEN_UNITS, return_sequences=True, recurrent_dropout=0.1))(model) # 添加Dropout层 model = Dropout(0.1)(model) # 添加全连接层 model = TimeDistributed(Dense(units=NUM_TAGS, activation="relu"))(model) # 添加CRF层 crf = CRF(NUM_TAGS) out = crf(model) # 定义模型 model = Model(input, out) # 编译模型 model.compile(optimizer="rmsprop", loss=crf.loss_function, metrics=[crf.accuracy]) # 训练模型 model.fit(X_train, np.array(y_train), batch_size=BATCH_SIZE, epochs=EPOCHS, validation_split=0.1, verbose=1) # 预测标记 y_pred = model.predict(X_test) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值