精华内容
下载资源
问答
  • 导出Word几种方法

    千次阅读 2018-01-18 14:27:40
    最近项目里要求从后台获取试题然后生成...以下是我用到几种导出Word方法。 1.利用Freemark模版生成 如果不是从数据库取出的数据本身带Html格式的话,这种方法是比较推荐的,适用生成格式比较复杂的情况。先在Word

    最近项目里要求从后台获取试题然后生成一张试卷导出Word。开始是利用xml 由Freemark模版生成,但是由于数据库里存了来自富文本框带Html格式的数据,此部分样式无法生成。只好先生成html,再导出Word。以下是我用到几种导出Word的方法。

    1.利用Freemark模版生成
    如果不是从数据库取出的数据本身带Html格式的话,这种方法是比较推荐的,适用生成格式比较复杂的情况。先在Word里画好你的模版,然后另存为xml格式,再将里面的内容用Freemark标签代替。
    PaperToWordVo vo=new PaperToWordVo();  
    vo=paperResservice.getPaperInfo((String)session.getAttribute("dataowner"),paperId,vo);  
    response.setHeader("Content-Disposition","attachment;filename="+new String((vo.getPaperTitle()+".doc").getBytes("UTF-8"),"ISO8859-1"));  
    response.setContentType("text/html;charset=UTF-8");  
    response.setCharacterEncoding("UTF-8");   
    WordUtil handler = new WordUtil();          
    Writer out;  
    out = response.getWriter();  
    handler.write("/com/stsoft/learning/model", "test.xml", vo, out);
    //其中test.xml 就是word生成预先修改好的模版  
    WordUtil.java
    import java.io.IOException;  
    import java.io.Writer;  
    import java.util.Map;  
    
    import freemarker.template.Configuration;  
    import freemarker.template.Template;  
    
    public class WordUtil {  
        private Configuration configuration = null;  
    
        public WordUtil() {  
            try {  
                configuration = new Configuration();  
                configuration.setDefaultEncoding("UTF-8");  
            } catch (Exception e) {  
                System.out.println(e.getMessage());  
                e.printStackTrace();  
            }  
        }  
    
        private Template getTemplate(String templatePath, String templateName)  
                throws IOException {  
            configuration.setClassForTemplateLoading(this.getClass(), templatePath);  
            Template t = configuration.getTemplate(templateName);  
            t.setEncoding("UTF-8");  
            return t;  
        }  
    
        public void write(String templatePath, String templateName,  
                PaperToWordVo dataMap, Writer out) {  
            try {  
                Template t = getTemplate(templatePath, templateName);  
                t.process(dataMap, out);  
                out.close();  
            } catch (Exception e) {  
                System.out.println(e.getMessage());  
                e.printStackTrace();  
            }  
        }  
    }  
    2.利用Apache POI
    POI在生成excel时优势更突出,POI生成word 由你自己在后台写出格式,当然也可以利用模版。
    下面是一个很简单的例子,具体可以看官网
    //新建一个文档
    XWPFDocument doc = new XWPFDocument();
    //创建一个段落
      XWPFParagraph para = doc.createParagraph();
    
      //一个XWPFRun代表具有相同属性的一个区域。    
      XWPFRun run = para.createRun();    
      run.setBold(true); //加粗    
      run.setText(vo.getPaperTitle());    
    
      run.addBreak();  
      run = para.createRun();    
      //run.setColor("FF0000");    
      List<QusetionTypeVo> tl=vo.getTypeList();  
      for(QusetionTypeVo ty:tl){  
            run.setText("第"+ty.getQtypeNO()+"部分 "+ty.getQtypeTitle());   
            List<QuestionVo>ql=ty.getQuestionList();  
             for(QuestionVo que:ql){  
                 run.setText("第"+que.getQuestionNo()+"题、 "+que.getQuestionTitle());       
                 run.addBreak();  
             }  
            run.addBreak();  
      }  
    
    3.先生成html再导出word (适合取出的数据含html格式)
    //将你要展示的内容转换成 html 再将其转 Word 其中也利用到POI
    String content = "<html> <head> </head><div style=\"text-align: center\">" +  
            "<span style=\"font-size: 28px\">"     
            +vo.getPaperTitle()+"</span> <br> <span style=\"font-size: 13px\">考试时间:"+vo.getTimeLimit()+"   总分:"+  
            vo.getScoreTotal()+"   通过分:"+vo.getScorePass()+"</span> </div><br><br>"+typeDiv.toString()+"</html>";  
    byte b[] = content.getBytes();    
    ByteArrayInputStream bais = new ByteArrayInputStream(b);    
    POIFSFileSystem poifs = new POIFSFileSystem();    
    DirectoryEntry directory = poifs.getRoot();    
    DocumentEntry documentEntry = directory.createDocument("WordDocument", bais);    
    OutputStream ostream = response.getOutputStream();  
    poifs.writeFilesystem(ostream);    
    bais.close();    
    ostream.close()  
    展开全文
  • 文本文件结尾符替换的几种方法

    千次阅读 2013-11-26 18:18:41
    文本文件结尾符替换的几种方法

    使用Word



    2、使用文本编辑器 EditPlus



    展开全文
  • 文本特征处理及聚类的几种方法 本项目完整源码地址:https://github.com/angeliababy/textcluster 项目博客地址: https://blog.csdn.net/qq_29153321/article/details/104015257 数据准备 测试数据说明 data_offline...

    文本特征处理及文本聚类的几种方法

    本项目完整源码地址:
    https://github.com/angeliababy/textcluster

    项目博客地址:
    https://blog.csdn.net/qq_29153321/article/details/104015257

    数据准备

    测试数据说明

    data_offline文件夹包含200 economy 类,200个sports类,200个environment类,50个other类,为线下做试验的数据集,id2class.txt为data_offline文件夹中每个文件对应的类别,以此可以比较聚类效果。

    src/get_data下为数据准备的过程,获取去除标点符号的文本及编号:

    1.get_res.py为处理普通的txt文件

    filelist = os.listdir(base_path)
        f2 = open(out_path, 'w', encoding='UTF-8')
        for files in filelist:
            # print (files)
            filename = files.split('.')[0]
            f = open(base_path + files, 'r', encoding='UTF-8')
            text = f.read().replace('\n', '')
    
            data = ''.join(re.findall(u'[\u4e00-\u9fff]+', text))  # 必须为unicode类型,取出所有中文字符
            f2.write(filename + ',')
            f2.write(data + '\n')
        f2.close()
    

    2.get_res_csv.py为处理csv文件,并将繁体文转化为简体文

        data = pd.read_csv(base_path, usecols=[0, 1, 2], encoding='UTF-8')
        data.columns = ["news_id", "title", "content"]
        # data = open(base_path, 'r', encoding='UTF-8')
        f2 = open(out_path, 'w', encoding='UTF-8')
        for i in range(len(data)):
            try:
                title = data["title"][i].replace('\n', '')
                #
                title = Converter('zh-hans').convert(title)
                title = ''.join(re.findall(u'[\u4e00-\u9fff]+', title))
                content =data["content"][i].replace('\n', '')
                content = ''.join(re.findall(u'[\u4e00-\u9fff]+', content))
                f2.write(str(np.squeeze(data.iloc[i, [0]].values)) + ',')
                f2.write(title+content + '\n')
            except:
                print(data.iloc[i,[0]].values)
    

    文本特征处理

    1.tf-idf:
    tf-idf = tf(词频)*idf(逆词频)
    其中idf(x) = log(N/N(x))
    tfidf_Res.py:

    # 一、获取标题和分词
    sen_seg_list = []
    title_list = []
    flag, lines = self.load_processfile(process_file)
    if flag == False:
        logging.error("load error")
        return False, "load error"
    for line in lines:
        title_list.append(line.split(',')[0])
        sen_seg_list.append(self.seg_words(line.split(',')[1]))
    
    # 二、tf-idf提取特征
    if not os.path.exists(tfidf_ResFileName):
        # 该类会将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频
        tf_vectorizer = CountVectorizer()
    
        # fit_transform是将文本转为词频矩阵
        tf_matrix = tf_vectorizer.fit_transform(sen_seg_list)
        # tf_weight = tf_matrix.toarray()
        # print(tf_weight)
    
        # 该类会统计每个词语的tf-idf权值
        tfidf_transformer = TfidfTransformer()
    
        # fit_transform是计算tf-idf
        tfidf_matrix = tfidf_transformer.fit_transform(tf_matrix)
    
        # 获取词袋模型中的所有词语
        word_list = tf_vectorizer.get_feature_names()
    
        # 将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重
        tfidf_weight = tfidf_matrix.toarray()
    

    2.doc2vec
    word2vec有2种算法:连续词袋模型(CBOW)和Skip-Gram模型。
    CBOW:
    在这里插入图片描述
    Skip-Gram:
    在这里插入图片描述
    句向量,是 word2vec 的拓展,考虑了句子的序号id

    # 一、获取标题和分词
    sen_seg_list = []
    title_list = []
    flag, lines = self.load_processfile(process_file)
    if flag == False:
        logging.error("load error")
        return False, "load error"
    for line in lines:
        title_list.append(line.split(',')[0])
        sen_seg_list.append(self.seg_words(line.split(',')[1]))
    
    if not os.path.exists(modelpath):
        # 存储分词文本
        if not os.path.exists(data1):
            self.output_file(data1, sen_seg_list)
            print("success output")
    
    # doc2vec提取特征
    sentences = gensim.models.doc2vec.TaggedLineDocument(data1)
    
    if not os.path.exists(modelpath):
        # doc2vec提取特征
        # 训练并保存模型
        model = gensim.models.Doc2Vec(sentences, size=100, window=2, min_count=3)
        model.train(sentences, total_examples=model.corpus_count, epochs=1000)
        model.save(modelpath)
    
    infered_vectors_list = []
    print("load doc2vec model...")
    model_dm = gensim.models.Doc2Vec.load(modelpath)
    print("load train vectors...")
    i = 0
    for text, label in sentences:
        vector = model_dm.infer_vector(text)
        infered_vectors_list.append(vector)
        i += 1
    

    3.lda
    文档主题生成模型,词袋模型,完全考虑词语的分布来判断其主题分布,并依据每个文本的主题概率分布来进行聚类。LDA的目的就是要识别主题,即把文档—词汇矩阵变成文档—主题矩阵(分布)和主题—词汇矩阵(分布)

    # 一、获取标题和分词
    flag, lines = self.load_processfile(process_file)
    if flag == False:
        logging.error("load error")
        return False, "load error"
    # 分词结果与其他方法形式不同
    title_list, sen_seg_list = self.seg_words(lines)
    
    # 二、lda模型提取特征
    # 构造词典
    dictionary = corpora.Dictionary(sen_seg_list)
    # 基于词典,使【词】→【稀疏向量】,并将向量放入列表,形成【稀疏向量集】
    corpus = [dictionary.doc2bow(words) for words in sen_seg_list]
    
    lda = models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=15)
    
    lda.save('zhwiki_lda.model')
    lda = models.ldamodel.LdaModel.load('zhwiki_lda.model')
    # 打印所有主题,每个主题显示10个词
    for topic in lda.print_topics(num_words=500):
        print(topic)
    
    # 主题矩阵
    ldainfer = lda.inference(corpus)[0]
    

    聚类分析

    kmeans:
    k簇中心,离簇中心最近进行聚类

    k = evaluation(tfidf_matrix)
    # 三、Kmeans,大数据量下用Mini-Batch-KMeans算法
    km = KMeans(n_clusters=k)
    km.fit(tfidf_matrix)
    print(Counter(km.labels_))  # 打印每个类多少个
    # print(km.cluster_centers_)   # 中心点
    
    # 存储每个样本所属的簇
    clusterRes = codecs.open(cluster_ResFileName, 'w', encoding='UTF-8')
    count = 1
    while count <= len(km.labels_):
        clusterRes.write(str(title_list[count - 1]) + '\t' + str(km.labels_[count - 1]))
        clusterRes.write('\r\n')
        count = count + 1
    clusterRes.close()
    

    聚类个数选择:

    # ### 三者选其一,SSE较好、但需要看拐点,轮廓系数法比较方便
    # # 方法一:'利用SSE选择k(手肘法)'
    # SSE = []  # 存放每次结果的误差平方和
    # for k in range(2, 5):
    #     km = KMeans(n_clusters=k)  # 构造聚类器
    #     km.fit(tfidf_matrix)
    #     SSE.append(km.inertia_)
    #
    # X = range(2, 5)
    # plt.xlabel('k')
    # plt.ylabel('SSE')
    # plt.plot(X, SSE, 'o-')
    # plt.show()
    
    # 方法二:利用轮廓系数法选择k
    Scores = []  # 存放轮廓系数
    for k in range(7, 12):
        km = KMeans(n_clusters=k)  # 构造聚类器
        km.fit(tfidf_weight)
        Scores.append(metrics.silhouette_score(tfidf_weight, km.labels_, metric='euclidean'))
    
    # X = range(17, 20)
    # plt.xlabel('k')
    # plt.ylabel('轮廓系数')
    # plt.plot(X, Scores, 'o-')
    # plt.show()
    
    # # 方法三:值越大越好,重点是速度快
    # Ss = []  # 存放Ss
    # for k in range(12, 30, 2):
    #     km = KMeans(n_clusters=k)  # 构造聚类器
    #     km.fit(tfidf_weight)
    #     Ss.append(metrics.calinski_harabaz_score(tfidf_weight, km.labels_))
    #
    # X = range(2, 5)
    # plt.xlabel('k')
    # plt.ylabel('Ss')
    # plt.plot(X, Ss, 'o-')
    # plt.show()
    
    # 求最优k值
    print(Scores)
    k = 7 + (Scores.index(max(Scores)))
    

    dbscan:
    基于密度的聚类,核心点、边界点、离群点。聚类的时候不需要预先指定簇的个数

    # DBSCAN参数不好调节
    db = DBSCAN(eps=1.25, min_samples=10).fit(tfidf_weight)
    print(db.core_sample_indices_)
    print(db.labels_)
    # 聚类个数为1-n之间会报错
    Score = metrics.silhouette_score(tfidf_weight, db.labels_)
    print(Score)
    
    # 存储每个样本所属的簇
    clusterRes = codecs.open(cluster_ResFileName, 'w', encoding='UTF-8')
    count = 1
    while count <= len(db.labels_):
        clusterRes.write(str(title_list[count - 1]) + '\t' + str(db.labels_[count - 1]))
        clusterRes.write('\r\n')
        count = count + 1
    clusterRes.close()
    

    gsdmm:
    一种基于狄利克雷多项式混合模型的收缩型吉布斯采样算法,可以很好的处理稀疏、高纬度的短文本

    # GSDMM文本聚类
    mgp = MovieGroupProcess(K=35, alpha=0.1, beta=0.1, n_iters=20)
    y = mgp.fit(tfidf_matrix, len(tfidf_matrix))
    print(y)
    
    # 存储每个样本所属的簇
    clusterRes = codecs.open(cluster_ResFileName, 'w', encoding='UTF-8')
    count = 1
    while count <= len(y):
        clusterRes.write(str(title_list[count - 1]) + '\t' + str(y[count - 1]))
        clusterRes.write('\r\n')
        count = count + 1
    clusterRes.close()
    

    模型评估
    聚类模型性能评价指标
    有监督的分类算法的评价指标通常是accuracy, precision, recall, etc;由于聚类算法是无监督的学习算法,评价指标则没有那么简单了。因为聚类算法得到的类别实际上不能说明任何问题,除非这些类别的分布和样本的真实类别分布相似,或者聚类的结果满足某种假设,即同一类别中样本间的相似性高于不同类别间样本的相似性。聚类模型的评价指标如下:
    详细请看http://scikit-learn.org/stable/modules/clustering.html#clustering-performance-evaluation
    如果C是真实类别,K是聚类结果,我们定义a和b分别是:
    a: 在C和K中都是同一类别的样本对数
    b: 在C和K中都是不同类别的样本对数
    raw Rand Index 的公式如下:
    在这里插入图片描述
    C2nsamples 是样本所有的可能组合对.

    FMI
    在这里插入图片描述

    dict_lable = {'eco': 2, 'env': 0, 'sports': 1, 'other': 3}
    data = pd.read_table(r'id2class.txt', header=None, delim_whitespace=True)
    data2 = pd.read_table(r'cluster_dockmResult.txt', header=None, delim_whitespace=True)
    list_true = []
    list_pred = []
    for i in range(len(data)):
        data.iloc[i, 1] = dict_lable[data.iloc[i, 1]]
        list_true.append(data.iloc[i, 1])
        list_pred.append(data2.iloc[i, 1])
    
    # 文档链接 http://scikit-learn.org/stable/modules/clustering.html#clustering-performance-evaluation
    #  2.3.10.1 Adjusted Rand index (RI)
    #  2.3.10.2. Mutual Information based scores(NMI)
    #  2.3.10.4. Fowlkes-Mallows scores(FMI)
    #  章节号为文档里面的章节号
    print(metrics.adjusted_rand_score(list_true, list_pred))  # RI指数,越接近1越好
    print(metrics.adjusted_mutual_info_score(list_true, list_pred))  # NMI指数,越接近1越好
    print(metrics.fowlkes_mallows_score(list_true, list_pred))  # FMI指数,越接近1越好
    

    参考数据集:

    data_offline:

    Total:650(other+3分类)

    Idfkm:4 (分类2-4)
    在这里插入图片描述

    Doc2veckm:3 (分类2-4)较慢

    在这里插入图片描述

    Idfdb:-1和3

    很差,-1为离群点,254个离群点,仅21个为other

    Idfdsgmm:9(10)

    很慢,只有1类,很差

    Ldakm

    在这里插入图片描述
    测试集中doc2vec+kmeans效果最好,tf-idf+kmeans其次

    展开全文
  • 1、基于TF-IDF的文本关键词抽取方法 词频(Term Frequency,TF) 指某一给定词语当前文件出现的频率。由于同一个词语长文件可能比短文件有更高的词频,因此根据文件的长度,需要对给定词语进行归一化,即...

    链接地址:https://github.com/AimeeLee77/keyword_extraction

    1、基于TF-IDF的文本关键词抽取方法 

    词频(Term Frequency,TF)

    指某一给定词语在当前文件中出现的频率。由于同一个词语在长文件中可能比短文件有更高的词频,因此根据文件的长度,需要对给定词语进行归一化,即用给定词语的次数除以当前文件的总词数。

    逆向文件频率(Inverse Document Frequency,IDF)

    是一个词语普遍重要性的度量。即如果一个词语只在很少的文件中出现,表示更能代表文件的主旨,它的权重也就越大;如果一个词在大量文件中都出现,表示不清楚代表什么内容,它的权重就应该小。

    TF-IDF的主要思想是,

    如果某个词语在一篇文章中出现的频率高,并且在其他文章中较少出现,则认为该词语能较好的代表当前文章的含义。即一个词语的重要性与它在文档中出现的次数成正比,与它在语料库中文档出现的频率成反比。

     

    1.1TF-IDF文本关键词抽取方法流程

    由以上可知,TF-IDF是对文本所有候选关键词进行加权处理,根据权值对关键词进行排序。假设Dn为测试语料的大小,该算法的关键词抽取步骤如下所示:

    (1) 对于给定的文本D进行分词、词性标注和去除停用词等数据预处理操作。本分采用结巴分词,保留'n','nz','v','vd','vn','l','a','d'这几个词性的词语,最终得到n个候选关键词,即D=[t1,t2,…,tn] ;

    (2) 计算词语ti 在文本D中的词频;

    (3) 计算词语ti 在整个语料的IDF=log (Dn /(Dt +1)),Dt 为语料库中词语ti 出现的文档个数;

    (4) 计算得到词语ti 的TF-IDF=TF*IDF,并重复(2)—(4)得到所有候选关键词的TF-IDF数值;

    (5) 对候选关键词计算结果进行倒序排列,得到排名前TopN个词汇作为文本关键词。

    1.2代码实现: 

    Python第三方工具包Scikit-learn提供了TFIDF算法的相关函数,本文主要用到了sklearn.feature_extraction.text下的TfidfTransformer和CountVectorizer函数。其中,CountVectorizer函数用来构建语料库的中的词频矩阵,TfidfTransformer函数用来计算词语的tfidf权值。

    注:TfidfTransformer()函数有一个参数smooth_idf,默认值是True,若设置为False,则IDF的计算公式为idf=log(Dn /Dt ) + 1。

    基于TF-IDF方法实现文本关键词抽取的代码执行步骤如下:

    (1)读取样本源文件sample_data.csv;

    (2)获取每行记录的标题和摘要字段,并拼接这两个字段;

    (3)加载自定义停用词表stopWord.txt,并对拼接的文本进行数据预处理操作,包括分词、筛选出符合词性的词语、去停用词,用空格分隔拼接成文本;

    (4)遍历文本记录,将预处理完成的文本放入文档集corpus中;

    (5)使用CountVectorizer()函数得到词频矩阵,a[j][i]表示第j个词在第i篇文档中的词频;

    (6)使用TfidfTransformer()函数计算每个词的tf-idf权值;

    (7)得到词袋模型中的关键词以及对应的tf-idf矩阵;

    (8)遍历tf-idf矩阵,打印每篇文档的词汇以及对应的权重;

    (9)对每篇文档,按照词语权重值降序排列,选取排名前topN个词最为文本关键词,并写入数据框中;

    (10)将最终结果写入文件keys_TFIDF.csv中。

     

    2 基于TextRank的文本关键词抽取方法

    2.1 PageRank算法思想

    TextRank算法是基于PageRank算法的,因此,在介绍TextRank前不得不了解一下PageRank算法。

    PageRank算法是Google的创始人拉里·佩奇和谢尔盖·布林于1998年在斯坦福大学读研究生期间发明的,是用于根据网页间相互的超链接来计算网页重要性的技术。该算法借鉴了学术界评判学术论文重要性的方法,即查看论文的被引用次数。基于以上想法,PageRank算法的核心思想是,认为网页重要性由两部分组成:

    ① 如果一个网页被大量其他网页链接到说明这个网页比较重要,即被链接网页的数量;

    ② 如果一个网页被排名很高的网页链接说明这个网页比较重要,即被链接网页的权重。

    2.2 TextRank算法

    把文本拆分成词汇作为网络节点,组成词汇网络图模型,将词语间的相似关系看成是一种推荐或投票关系,使其可以计算每一个词语的重要性。

    基于TextRank的文本关键词抽取是利用局部词汇关系,即共现窗口,对候选关键词进行排序,该方法的步骤如下:

    (1) 对文本D进行分词、词性标注和去除停用词等数据预处理操作。本分采用结巴分词,保留'n','nz','v','vd','vn','l','a','d'这几个词性的词语,最终得到n个候选关键词,即D=[t1,t2,…,tn] ;

    (2) 构建候选关键词图G=(V,E),其中V为节点集(由候选关键词组成),并采用共现关系构造任两点之间的边,两个节点之间仅当它们对应的词汇在长度为K的窗口中共现则存在边,K表示窗口大小即最多共现K个词汇;

    (3) 根据公式迭代计算各节点的权重,直至收敛;

    (4) 对节点权重进行倒序排列,得到排名前TopN个词汇作为文本关键词。

    说明:Jieba库中包含jieba.analyse.textrank函数可直接实现TextRank算法,本文采用该函数进行实验。

    2.3 代码实现:

    基于TextRank方法实现文本关键词抽取的代码执行步骤如下:

    (1)读取样本源文件sample_data.csv;

    (2)获取每行记录的标题和摘要字段,并拼接这两个字段;

    (3)加载自定义停用词表stopWord.txt;

    (4)遍历文本记录,采用jieba.analyse.textrank函数筛选出指定词性,以及topN个文本关键词,并将结果存入数据框中;

    (5)将最终结果写入文件keys_TextRank.csv中。

     

     

    3 基于Word2Vec词聚类的文本关键词抽取方法

    3.1 Word2Vec词向量表示

    利用浅层神经网络模型自动学习词语在语料库中的出现情况,把词语嵌入到一个高维的空间中,通常在100-500维,在新的高维空间中词语被表示为词向量的形式。

    特征词向量的抽取是基于已经训练好的词向量模型,词向量模型的训练需要海量的语料才能达到较好的效果,而wiki中文语料是公认的大型中文语料。

    3.2 K-means聚类算法

    聚类算法旨在数据中发现数据对象之间的关系,将数据进行分组,使得组内的相似性尽可能的大,组间的相似性尽可能的小。

    算法思想是:首先随机选择K个点作为初始质心,K为用户指定的所期望的簇的个数,通过计算每个点到各个质心的距离,将每个点指派到最近的质心形成K个簇,然后根据指派到簇的点重新计算每个簇的质心,重复指派和更新质心的操作,直到簇不发生变化或达到最大的迭代次数则停止。 

    3.3 Word2Vec词聚类文本关键词抽取方法

    主要思路是对于用词向量表示的文本词语,通过K-Means算法对文章中的词进行聚类,选择聚类中心作为文章的一个主要关键词,计算其他词与聚类中心的距离即相似度,选择topN个距离聚类中心最近的词作为文本关键词,而这个词间相似度可用Word2Vec生成的向量计算得到。

    假设Dn为测试语料的大小,使用该方法进行文本关键词抽取的步骤如下所示:

    (1) 对Wiki中文语料进行Word2vec模型训练,参考我的文章“利用Python实现wiki中文语料的word2vec模型构建”( http://www.jianshu.com/p/ec27062bd453 ),得到词向量文件“wiki.zh.text.vector”;

    (2) 对于给定的文本D进行分词、词性标注、去重和去除停用词等数据预处理操作。本分采用结巴分词,保留'n','nz','v','vd','vn','l','a','d'这几个词性的词语,最终得到n个候选关键词,即D=[t1,t2,…,tn] ;

    (3) 遍历候选关键词,从词向量文件中抽取候选关键词的词向量表示,即WV=[v1,v2,…,vm];

    (4) 对候选关键词进行K-Means聚类,得到各个类别的聚类中心;

    (5) 计算各类别下,组内词语与聚类中心的距离(欧几里得距离),按聚类大小进行升序排序;

    (6) 对候选关键词计算结果得到排名前TopN个词汇作为文本关键词。

    步骤(4)中需要人为给定聚类的个数,本文测试语料是新闻文本,因此只需聚为1类,各位可根据自己的数据情况进行调整;步骤(5)中计算各词语与聚类中心的距离,常见的方法有欧式距离和曼哈顿距离,本文采用的是欧式距离,计算公式如下:

    3.4 代码实现

    第三方工具包Scikit-learn提供了K-Means聚类算法的相关函数,本文用到了sklearn.cluster.KMeans()函数执行K-Means算法,sklearn.decomposition.PCA()函数用于数据降维以便绘制图形。

    基于Word2Vec词聚类方法实现文本关键词抽取的代码执行步骤如下:

    (1)读取样本源文件sample_data.csv;

    (2)获取每行记录的标题和摘要字段,并拼接这两个字段;

    (3)加载自定义停用词表stopWord.txt,并对拼接的文本进行数据预处理操作,包括分词、筛选出符合词性的词语、去重、去停用词,形成列表存储;

    (4)读取词向量模型文件'wiki.zh.text.vector',从中抽取出所有候选关键词的词向量表示,存入文件中;

    (5)读取文本的词向量表示文件,使用KMeans()函数得到聚类结果以及聚类中心的向量表示;

    (6)采用欧式距离计算方法,计算得到每个词语与聚类中心的距离;

    (7)按照得到的距离升序排列,选取排名前topN个词作为文本关键词,并写入数据框中;

    (8)将最终结果写入文件keys_word2vec.csv中。

    三种算法对比图:

     4 结语

    本文总结了三种常用的抽取文本关键词的方法:TF-IDF、TextRank和Word2Vec词向量聚类,并做了原理、流程以及代码的详细描述。因本文使用的测试语料较为特殊且数量较少,未做相应的结果分析,根据观察可以发现,得到的十个文本关键词都包含有文本的主旨信息,其中TF-IDF和TextRank方法的结果较好,Word2Vec词向量聚类方法的效果不佳,这与文献[8]中的结论是一致的。文献[8]中提到,对单文档直接应用Word2Vec词向量聚类方法时,选择聚类中心作为文本的关键词本身就是不准确的,因此与其距离最近的N个词语也不一定是关键词,因此用这种方法得到的结果效果不佳;而TextRank方法是基于图模型的排序算法,在单文档关键词抽取方面有较为稳定的效果,因此较多的论文是在TextRank的方法上进行改进而提升关键词抽取的准确率。

    另外,本文的实验目的主要在于讲解三种方法的思路和流程,实验过程中的某些细节仍然可以改进。例如Word2Vec模型训练的原始语料可加入相应的专业性文本语料;标题文本往往包含文档的重要信息,可对标题文本包含的词语给予一定的初始权重;测试数据集可采集多个分类的长文本,与之对应的聚类算法KMeans()函数中的n_clusters参数就应当设置成分类的个数;根据文档的分词结果,去除掉所有文档中都包含某一出现频次超过指定阈值的词语。

    展开全文
  • JAVA生成word优缺点对比 所用技术 优点 缺点 Jacob 功能强大 代码量大,设置样式繁琐;需要windows平台支持,无法跨平台 Apache POI 读写...
  • 网页导出Word几种方法简介

    千次阅读 2019-04-18 09:25:54
    方法简单,页面格式不会乱,但是不够简单。 参考文章 jquery.wordexport.js 实现导出word 引入jquery 、FileSaver.js和jquery.wordexport.js <script src="http://jquery.min.js"></script> ...
  • 文本相似度几种计算方法及代码python实现

    千次阅读 多人点赞 2020-05-28 10:31:35
    因此各种不同的情况与任务,有不同的文本相似度计算。 方法1 编辑距离 编辑距离又称Levenshtein距离,是指将一个字符串转为另一个字符串所需的字符编辑次数,包括以下三操作: 插入 - 任意位置插入一个字符 ...
  • 损坏Word文档的几种修复方法

    千次阅读 2007-01-25 17:37:00
    http://www.pcdog.com/edu/word/2006/11/v173886.html 损坏Word文档的几种修复方法 来源: 作者:微电脑世界 2006-11-22 出
  • 几种简单的文本数据预处理方法

    千次阅读 2018-09-12 16:31:01
     和上一种方法的区别是,'armour-like' 被识别成两个词 'armour', 'like','What's' 变成了 'What', 's'  importre  words=re.split(r'\W+',text)  print(words[:100])  3. 用空格分隔并去掉标点:...
  • 纯CSS实现“文本溢出截断省略”的几种方法

    千次阅读 多人点赞 2020-03-28 11:36:34
    我们的日常开发工作文本溢出截断省略是很常见的一需考虑的业务场景细节。看上去 “稀松平常” ,但实现上却有不同的区分,是单行截断还是多行截断?多行的截断判断是基于行数还是基于高度?这些问题之下,...
  • 利用Python实现中文文本关键词抽取的三种方法 ...笔者使用前三算法进行关键词抽取的学习过程,发现采用TF-IDF和TextRank方法进行关键词抽取网上有很多的例子,代码和步骤也比较简单,但是采用Word2
  • 基于Word2Vec的文本关键词抽取方法

    千次阅读 热门讨论 2019-02-21 19:59:49
    大多数人都是将Word2Vec作为词向量的等价名词,也就是说,纯粹作为一个用来获取词向量的工具,关心模型本身的读者并不多。 可能是因为模型过于简化了,所以大家觉得这样简化的模型肯定很不准确,所以没法用,但它的...
  • 把公式复制到Word文档的一种方法

    千次阅读 2019-10-04 12:11:37
    调研整理篇工作的损失函数时想到我很早以前照着公式打上去的痛苦,遂决定分享一下这种极大提高生产力的方法…… (忘记了是哪儿看到的一篇文章的方法还是多篇文章综合的方法,若有侵权麻烦联系我。) 首先需要两...
  • word中给公式加编号的几种操作

    千次阅读 2021-01-21 22:04:45
    目录 方法1:最简单粗暴的方式 方法2:稍微麻烦点 方法3:表格法,可以自动编号(一劳永逸!) 方法1:最简单粗暴的方式 ...然后进入以下界面修改有关的属性信息,首先选择格式->制表位: 图
  • 实现文档在线预览的方式大概有以下几种 1、转换为PDF 2、转换为HTML 3、服务器上部署office document online服务 4、开源项目提供的功能 5、使用第三方提供的付费接口 一、后台将office文档转换为pdf...
  • 验证win10下解决某些word文档提示”内存或磁盘空间不足”的几种方法 编者:李国帅 qq:9611153 微信lgs9611153 时间:2020-03-11 背景原因: 前段时间把系统升级到了win10,结果许多word文档出现了问题。 ...
  • excel表格输出到word中的一种方法

    千次阅读 2012-05-07 12:49:32
    目前的应用场景,经常需要把excel里头的张财务报表,作为附表拷贝到word报告,每次复制粘贴后,格式都变了,用“仅保留文本”的粘贴方式也不奏效,文字大小、数字对齐都不合要求,需要手动调一遍,费时且易出错...
  • 第二解决方法:如果你以后不想用wps2009 ,直接新建一word文档,把内容复制进去即可。就可以解决这个问题了。 第三解决方案就是如果该文档的格式破坏导致WORD不能识别,只能通过文本恢复转换器来打开,你可能...
  • 遇到此问题,首先想到的就是各种百度。结果度娘了一会并没有发现有用的有效的解决方法,... 再整理下思路:在Word中插入Html,首先有一点是肯定的,Word跟Html都是Document结构,这点应该是没啥怀疑的。如此的话就感觉
  • 解决draw.io生成SVG矢量图导入Word显示有误的问题以及推荐几种SVG绘图方法起因解决办法操作步骤修改后效果关于Word加载项draw.io工具流程图等推荐用Xmind图表数据等也可以用Python的matplotlib函数库来画 ...
  • 自然语言处理几种文本预处理的写法总结

    万次阅读 多人点赞 2018-08-30 15:51:48
    前面的话 biaji,&amp;lt;( ̄3 ̄)&amp;gt; bia叽,嘎嘎,最近来教大家写点简单又迷人的自然语言处理的代码。 不好意思,原谅我用词不当,毕竟我是菜鸟,也没得资格教别人,the main reason is that 我...
  • java动态生成word和PDF的几种方案

    千次阅读 2012-11-08 13:48:51
    java生成word几种方案   1、Jacob是Java-COM Bridge的缩写,它Java与微软的COM组件之间构建一座桥梁。使用Jacob自带的DLL动态链接库,并通过JNI的方式实现了Java平台上对COM程序的调用。DLL动态链接库的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 100,757
精华内容 40,302
关键字:

在word中选择文本的几种方法