精华内容
下载资源
问答
  • 完整论文参考,VC文本数据分析与信息检索论文
  • 文本分类论文

    2014-04-14 23:24:06
    文本分类新论文 很值得看 尤其是数据挖掘方面的相关学习者
  • 基于文本数据的复杂网络构建及可视化系统,吴广程,,随着复杂网络研究地深入以及文本数据的急速增长,提供一种针对文本信息的通用复杂网络构建及可视系统,以充分利用文本数据中的有
  • 考虑到在金融领域,事件的发生经常影响在线舆论空间和真实交易空间,因此本文提出了一种基于股票交易时间序列数据和在线舆论文本的多源异构信息检测方法。数据以检测股市中的热点事件。 该方法采用离群检测算法,...
  • PAGE 本科生毕业论文设计 题 目学生成绩单文本数据分析测评系统开发与应用研究 姓名 专业 年级班级 系部(院) 指导教师姓名 专业技术职务 2017年6月10日 目 录 TOC \o "1-2" \h \z \t "标题 3,3" 24191 摘 要 1 32492...
  • 文本表示论文阅读

    2020-11-05 09:57:47
    第一篇 Enhancing Local Feature Extraction with Global Representation for Neural Text Classification文章地址 代码:代码地址 文本结构 模型总体框架: 数据集:

    第一篇

    Enhancing Local Feature Extraction with
    Global Representation for Neural Text Classification文章地址
    代码:代码地址

    文本结构

    模型总体框架:在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    数据集:在这里插入图片描述

    展开全文
  • 针对传统的聚类文本分类算法在文本分类中存在高维性和稀疏性,特别是同义词和近义词难以进行分类,使得分类的精确度低等问题,提出了一种聚类平均信息量文本分类算法。算法从信息论观点分析文本空间向量,将文本看做...
  • 文本数据增强

    2020-06-08 17:32:59
    文本数据增强https://www.zhihu.com/collection/540515296 英文原版:https://amitness.com/2020/05/data-augmentation-for-nlp/#8-generative-methods ICLR 2019 workshop 论文《EDA: Easy Data Augmentation ...

    目录

    1、参考文章: 

    综述:

    方法:

    2、需要文本数据增强,一个是常常遇到的数据不足,另一个就是数据不均衡。

    3、在机器学习过程中的什么位置进行数据增强?

    4、Synonyms:一个中文近义词工具包

    工具包技术说明:

    输出近义词向量:

    两个句子的相似度比较:


    1、参考文章: 

    综述:

    1. 文本数据增强综述 https://www.zhihu.com/collection/540515296  英文原版:https://amitness.com/2020/05/data-augmentation-for-nlp/#8-generative-methods
    2. 文本数据增强(概述):https://blog.csdn.net/rensihui/article/details/89166307
    3. 文本数据增强 https://www.jianshu.com/p/3996793324ca
    4. 数据增强:数据有限时如何使用深度学习 ?https://www.leiphone.com/news/201805/avOH5g1ZX3lAbmjp.html

    方法:

    1. ICLR 2019 workshop 论文《EDA: Easy Data Augmentation Techniques for Boosting Performance on Text Classification Tasks》论文地址:https://arxiv.org/pdf/1901.11196.pdf
    2. EDA github代码
    3. EDA_NLP_for_Chinese https://github.com/zhanlaoban/eda_nlp_for_Chinese
    4. Do Not Have Enough Data? Deep Learning to the Rescue!, AAAI2020, https://ojs.aaai.org//index.php/AAAI/article/view/6233
    5. LaserTagger https://github.com/tongchangD/text_data_enhancement_with_LaserTagger
    6. NLP-cda 一键中文数据增强  https://pypi.org/project/nlpcda/#description   源码:https://github.com/425776024/nlpcda

    7. Data Augmentation For Chinese Text Classification Using Back-Translationhttps://iopscience.iop.org/article/10.1088/1742-6596/1651/1/012039

    8. 文本分类 & 数据增强 & 模型微调  https://blog.csdn.net/G_B_L/article/details/104468939

    9. NLP数据增强方法总结:EDA、BT、MixMatch、UDA https://mp.weixin.qq.com/s/ySxLHnaEMBXjcYPb4xc1Rg

    10. NLP数据增强动手实践:https://blog.csdn.net/shine19930820/article/details/107649344

    11. NLP数据增强技术!超全资源汇总:https://blog.csdn.net/qq_27590277/article/details/107054367

    2、需要文本数据增强,一个是常常遇到的数据不足,另一个就是数据不均衡。

    1. EDA:(同义词替换、插入、交换和删除)【文献见上述1、2、3】
    2. Back Translation(回译):【文献见上述 7】
    3. 生成对抗网络(GAN):通过生成器和判别器的相互博弈,以达到一个纳什平衡,不断迭代增强训练数据达到以假乱真的效果,最后用生成器大量生成同分布的数据,以达到数据增强的效果。但是GAN模型比较难训练,所以需要对GAN模型训练的足够好,才能更加有效的生成高质量的数据。
    4. 语境增强

    3、在机器学习过程中的什么位置进行数据增强?

    1. 预先进行所有必要的变换,从根本上增加数据集的规模。
    2. 另外一个是小批量执行变换,仅仅在输入机器学习模型之前。

    第一项被称为离线增强。这个方法常被用于相对较小的数据集。因为你最终会通过一个与执行的转换数量相等的因子来增加数据集的大小(例如,通过翻转所有图像,数据集数量会增加2倍)。

    第二个选项称为在线增强,或称为动态增强。主要应用于规模较大的数据集,因为你无法负担数据量爆炸性增长。反而,你可以通过对即将输入模型的小批量数据的执行相应的变化。很多机器学习架构已经支持在线增强,并可以利用GPU进行加速。

    4、Synonyms:一个中文近义词工具包

    在经典的信息检索系统中,相似度的计算是基于匹配的,而且是 Query 经过分词后与文档库的严格的匹配,这种就缺少了利用词汇之间的“关系”。而 word2vec 使用大量数据,利用上下文信息进行训练,将词汇映射到低维空间,产生了这种“关系”,这种“关系”是基于距离的,有了这种“关系”,就可以进一步利用词汇之间的距离进行检索。所以,在算法层面上,检索更是基于了“距离”而非“匹配”,基于“语义”而非“形式”。

    工具包技术说明:

    1. 该中文近义词工具包采用的基本技术是 Word2vec。
    2. Synonyms 的安装十分便捷,我们可以直接使用命令 pip install -U synonyms 完成。该工具包兼容 Python 2 和 Python 3。
    3. Synonyms 采用的词向量维度为 100。

    输出近义词向量:

    synonyms.nearby(WORD) 会返回一个包含两项的列表:

    [[nearby_words], [nearby_words_score]]

    • nearby_words 是 WORD 的近义词向量,也以列表的方式存储,并且按照距离的长度由近及远排列,
    • nearby_words_score 是 nearby_words 中对应词的距离分数,分数在 (0-1) 区间内,越接近于 1,代表越相近。

    两个句子的相似度比较:

    synonyms.compare(sen1, sen2, seg=True)

    参数 seg 表示 synonyms.compare 是否对sen1和sen2进行分词,默认为 True。返回值:[0-1],并且越接近于1代表两个句子越相似。

    synonyms.display(" ")

    以友好的方式打印近义词,方便调试,display调用了 synonyms#nearby方法。

     

     

     

    展开全文
  • EDA_NLP_for_Chinese中文EDA实现。本工具是论文《EDA: Easy Data Augmentation Techniques for Boosting Performance on Text ...我经过对原论文附上的代码的修改,现在推出这个适合中文语料的数据增强...

    EDA_NLP_for_Chinese

    中文EDA实现。本工具是论文《EDA: Easy Data Augmentation Techniques for Boosting Performance on Text Classification Tasks》的中文版本实现。

    原作者虽给出了针对英文语料数据增强的代码实现,但不适合中文语料。我经过对原论文附上的代码的修改,现在推出这个适合中文语料的数据增强EDA的实现。

    Usage

    先将需要处理的语料按照下面的例子处理好成固定的格式:

    0今天天气不错哦。

    1今天天气不行啊!不能出去玩了。

    0又是阳光明媚的一天!

    即,标签+一个制表符\t+内容

    命令使用例子:

    $python code/augment.py --input=train.txt --output=train_augmented.txt --num_aug=16 --alpha=0.05

    这里:

    input参数:需要进行增强的语料文件

    output参数:输出文件

    num_aug参数:每一条语料将增强的个数

    alpha参数:每一条语料中改动的词所占的比例

    具体使用方法同英文语料情况。请参考eda_nlp。

    Chinese stopwords

    词表名

    词表文件

    中文停用词表

    cn_stopwords.txt

    哈工大停用词表

    hit_stopwords.txt

    百度停用词表

    baidu_stopwords.txt

    四川大学机器智能实验室停用词库

    scu_stopwords.txt

    Reference

    原仓库:eda_nlp。感谢原作者的付出。Thanks to the author of the paper.

    Acknowledgments

    原论文阅读笔记

    简介

    在这篇论文中,作者提出所谓的EDA,即简单数据增强(easy data augmentation),包括了四种方法:同义词替换、随机插入、随机交换、随机删除。作者使用了CNN和RNN分别在五种不同的文本分类任务中做了实验,实验表明,EDA提升了分类效果。作者也表示,平均情况下,仅使用50%的原始数据,再使用EDA进行数据增强,能取得和使用所有数据情况下训练得到的准确率。

    已有方法及其问题所在

    英法互译

    同义词替换

    数据噪声

    由于没有一般的语言转换的通用规则,因此NLP中的通用数据增强技术人们探索甚少。上述若干方法,相对于其能提升的性能,实现开销更大。

    作者还列举出了其他一些增强方法,而EDA的优点在于能以更简单的方法获得差不多的性能。

    创新思路

    在本文,作者提出通用的NLP数据增强技术,命名为EDA。同时作者表示,他们是第一个给数据增强引入文本编辑技术的人。EDA的提出,也是一定程度上受计算机视觉上增强技术的启发而得到。下面详细介绍EDA的四个方法:

    对于训练集中的每个句子,执行下列操作:

    同义词替换(Synonym Replacement, SR):从句子中随机选取n个不属于停用词集的单词,并随机选择其同义词替换它们;

    随机插入(Random Insertion, RI):随机的找出句中某个不属于停用词集的词,并求出其随机的同义词,将该同义词插入句子的一个随机位置。重复n次;

    随机交换(Random Swap, RS):随机的选择句中两个单词并交换它们的位置。重复n次;

    随机删除(Random Deletion, RD):以 $p$ 的概率,随机的移除句中的每个单词;

    这些方法里,只有SR曾经被人研究过,其他三种方法都是本文作者首次提出。

    值得一提的是,长句子相对于短句子,存在一个特性:长句比短句有更多的单词,因此长句在保持原有的类别标签的情况下,能吸收更多的噪声。为了充分利用这个特性,作者提出一个方法:基于句子长度来变化改变的单词数,换句话说,就是不同的句长,因增强而改变的单词数可能不同。具体实现:对于SR、RI、RS,遵循公式:$n$ = $\alpha$ * $l$,$l$ 表示句长,$\alpha$ 表示一个句子中需要改变的单词数的比例。在RD中,让 $p$ 和 $\alpha$ 相等。另外,每个原始句子,生成 $n_{aug}$ 个增强的句子。

    实验环节

    实验设置

    作者使用了5个不同的Benchmark数据集(这里不再介绍每个数据集是什么,如果你想了解可以去查原论文,但没太大必要),这样就有5种文本分类任务,使用了两个state-of-the-art文本分类的模型:LSTM-RNN和CNNs。并将有无EDA作为对比,同时因为欲得到EDA在小数据集上的实验效果,将训练数据集大小分为500、2000、5000、完整这4个量级。每个训练效果是在5个文本分类任务上的效果均值。

    实验结果

    实验结果是:在完整的数据集上,平均性能提升0.8%;在大小为500的训练集上,提升3.0%。具体见如下表1:

    表1 - 作者指出,EDA在小训练集上有更好的性能效果。若使用完整的训练集数据,不使用EDA的情况下,最佳的平均准确率达到88.3%。若使用50%的训练集数据并且使用EDA的情况下,最佳的平均准确率达到88.6%,超过前述情况。

    若句子中有多个单词被改变了,那么句子的原始标签类别是否还会有效?作者做了实验:首先,使用RNN在一未使用EDA过的数据集上进行训练;然后,对测试集进行EDA扩增,每个原始句子扩增出9个增强的句子,将这些句子作为测试集输入到RNN中;最后,从最后一个全连接层取出输出向量。应用t-SNE技术,将这些向量以二维的形式表示出来。实验结果就是,增强句子的隐藏空间表征紧紧环绕在这些原始句子的周围。作者的结论是,句子中有多个单词被改变了,那么句子的原始标签类别就可能无效了。

    对于EDA中的每个方法,单独提升的效果如何?作者做实验得出的结论是,对于每个方法在小数据集上取得的效果更明显。$\alpha$ 如果太大的话,甚至会降低模型表现效果,$\alpha$=0.1似乎是最佳值。

    如何选取合适的增强语句个数?在较小的数据集上,模型容易过拟合,因此生成多一点的语料能取得较好的效果。对于较大的数据集,每句话生成超过4个句子对于模型的效果提升就没有太大帮助。因此,作者推荐实际使用中的一些参数选取如表2所示:

    表2 ​ 其中,$n_{aug}$ :每个原始语句的增强语句个数;$N_{train}$:训练集大小

    其它

    1. EDA提高文本分类的效果的原理是什么?

    生成类似于原始数据的增强数据会引入一定程度的噪声,有助于防止过拟合;

    使用EDA可以通过同义词替换和随机插入操作引入新的词汇,允许模型泛化到那些在测试集中但不在训练集中的单词;

    2. 为什么使用EDA而不使用语境增强、噪声、GAN和反向翻译?

    上述的其它增强技术作者都希望你使用,它们确实在一些情况下取得比EDA较好的性能,但是,由于需要一个深度学习模型,这些技术往往在其取得的效果面前,付出的实现代价更高。而EDA的目标在于,使用简单方便的技术就能取得相接近的结果。

    3. EDA是否有可能会降低模型的性能?

    确实有可能。原因在于,EDA有可能在增强的过程中,改变了句子的意思,但其仍保留原始的类别标签,从而产生了标签错误的句子。

    展开全文
  • 文本分类中数据集的不均衡问题是一个在实际应用中普遍存在的问题。从特征选择优化和分类器性能提升两方面出发,提出了一种组合的不均衡数据文本分类方法。在特征选择方面,综合考虑特征项与类别的正负相关特性及...
  • 下一个模块会开始讲解文本文本数据到数值数据的过渡,将文本数据转化为数值数据,并且提取转化后的特征,降维,输入到文本分类器中进行训练、测试、评估。 文本分类的基本步骤: 1.数据获取 方法:网页爬虫,使用...

    文本分类大体被我分为4类,链接如下:
    文本分类流程(一)文本分类的大致步骤+数据预处理------毕业论文的纪念
    文本分类(二)文本数据数值化,向量化,降维
    文本分类(三)–对已经处理好的数据使用KNN、Naive Bayes、SVM分类方法
    文本分类(四)–分类好坏的评价

    代码部分:

    Github

    本文主要介绍文本分类的前几个步骤,数据获取+数据清洗
    下一个模块文本分类(二)文本数据数值化,向量化会开始讲解文本文本数据到数值数据的过渡,将文本数据转化为数值数据,并且提取转化后的特征,降维,输入到文本分类器中进行训练、测试、评估。

    文本分类的基本步骤:

    1.数据获取

    方法:网页爬虫,使用别人的代码或者自己写代码(GitHub上找有没有你需要的)

    2.数据清洗

    方法:

    1. 去重,去除重复的评论。如果数据抓取的好,则可以不用执行这一步,不过一般得搞一搞,免得有评论刷评的。
    2. 去除上面得到的空字符串
    3. 手工标记数据的类别,正类为1,负类为-1
    4. 去除其他的表情符号(包括表情符号,一些常见的标点符号,特殊的字符),使用正则表达式匹配\W就可以做到(亏我当初还去网上一个个的查找,删除。
    5. 如果一个评论中只有上一步所表述的符号,则将其全部去除之后会得到一些空的字符串,再像第二步一样,去除所得到的空字符串。
    6. 删除停用词(自己在CSDN上搜索停用词,复制粘贴到文本txt文档中)。同上,如果去除了只有停用词的字符串,则去除空字符串。去除停用词的字符串之间使用空格来连接,以便以后使用counterVectorizer和TfidfVectorizer将文本数据转化为数值数据
      注意:我将初始的文本数据全部都放进一个列表中,将标记文本的正负类也按照相应的索引放在一个列表中对应存储。每次去除特殊字符或者是停用词得到空字符串时,将原来存有文本的列表comments中的相关元素删除,也要与之对应的class删除。这里一定要记住是哪个index下面的数据被删除了,再将这个Index对应的class也删除。

    3.文本数据---->数值向量

    4.使用分类分方法。

    机器学习相关的:KNN, Naive Bayes, SVM, AdaBoost, 决策树,逻辑回归,神经网络,深度学习。我主要使用的是前三种,各种方法之间进行对比。
    简单贴下比较好的算法介绍的相关文章:
    机器学习(二)分类算法详解
    分类算法总结
    聚类算法与分类算法的总结

    5.进行评估

    方法:主要使用accuracy,precision,recall,f1-score来评价。

    每步的具体做法 + 代码:

    1.数据获取

    开始是自己跟着静觅-Python3网络爬虫开发实战教程这个网站来学习网页爬虫,因为刚刚接触网页原理,很多参数都看不懂。有一种强迫症的存在,就想着要将所有的东西全部学会,跟着他的教程一步步地敲击代码,记笔记,这样做让我感受不到进步,并且需要学习的东西太多,时间紧迫,没有一种抓住重点的感觉。遂将此教程暂时搁置在一边,了解了一下大致讲的什么,之后有需要再过来针对性的学习。最后学习了requests, beautifulsoup, xpath, css, pymysql,json等相关的知识,就没有再继续看了。

    前一步的中间接受网友的建议去学习scrapy框架还有xpath,css,将scrapy中文网实验网站的所有能够爬取的都爬取了,还有根据上面所学的知识利用scrapy去爬取豆瓣影评。搞了也差不多有一个星期,当时就觉得自己似乎可以去爬取京东的店铺评论了(现在想想当时咋就那么不自量力呢)。好,有想法我就去做,去使用xpath中学习到的知识去爬取京东的评论,发现在利用F12所看到的内容居然与查看源代码所看见的内容是不一样的。我们能够从前者看见网页中所呈现的所有元素,然而对于后者,我们就只能够从其中看见一些简单的javascript函数,还有一些json字符串。当时我很纳闷啊,怎么是这样的。试了很多次了,还是这样,问别人也不太明白,就简单的将其当作是京东采取的一些反爬虫机制了。

    因为时间真的太紧张了,数据获取的工作始终没有进展,于是就开始接受网友的建议直接去GIthub上搜索相关的代码,找到了美团的评论爬取代码,修改了一下,只获取店铺的评论,其他的完全不管,这样将数据以及相应的Index存储到csv文件中。数据获取的工作当时我以为的就是暂时到这个地步就结束了。

    借鉴修改所得代码如下:

    parse_restaurant_id.py

    # -*- coding: utf-8 -*-
    # __author__ = "zok"  362416272@qq.com
    # Date: 2019-04-17  Python: 3.7
    """
    这是上面一个大神的代码,我拿来自己使用的
    他的GitHub地址为:https://github.com/wkunzhi/SpiderCrackDemo/tree/master/MeiTuan
    -------
    创建一个类,获取店铺id使用
    在之后餐馆解析时,继承此类,使用getId获取店铺Id
    """
    import requests
    import json
    import re
    import csv
    # 目标:创建一个类,其中有一个属性,是一个函数,可以提取餐馆的id
    class ParseId(object):
        # 设置请求头
        def __init__(self):
            headers = {
                'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
            }
            self.urls = self.getUrl()
            self.headers = headers
        # 获取这些网页
        def getUrl(self):
            urls = []
            for i in range(1,60):
                urls.append(('https://yt.meituan.com/meishi/c17/pn'+'%s'+"/")%(i))
            return urls    
        def getId(self):
            id_list = []
            k = 1
            for v in self.urls:
                html = requests.get(v,headers = self.headers)
                # 进行正则匹配,寻求店铺id信息
                re_info = re.compile(r'\"poiId\":(\d{4,})')
                id = re_info.findall(html.text)# 获得的是列表            
                # 想利用writerows将列表添加到csv文件中
                for v in id:
                    id_list.append((k,v))
                    k+=1
            # 将店铺ID保存到CSV文件中
            with open(r'D:\lagua\study\coding\pythonPractice\meituanComment\poId.csv','w+',newline="") as f:
                writer = csv.writer(f)          
                writer.writerows(id_list)        
            temp_id = []
            for il in id_list:
                temp_id.append(il[1])
            return temp_id
    

    parse_id_comments.py

    # -*- coding: utf-8 -*-
    # __author__ = "zok"  362416272@qq.com
    # Date: 2019-04-17  Python: 3.7
    """
    这是上面一个大神的代码,我拿来自己使用的
    他的GitHub地址为:https://github.com/wkunzhi/SpiderCrackDemo/tree/master/MeiTuan
    -------
    目标:
    根据店铺获取评论
    局限性:一个店铺只能获取10条评论
    """
    import requests
    import json
    import time
    import csv
    import sys
    # 当引用模块和当前模块不再同一个目录下时,要将引入的模块添加进来
    from urllib import parse
    
    sys.path.append(r'D:\lagua\study\coding\pythonPractice\meituanComment\meituanComment\spiders\parse_restaurant_id.py')
    from parse_restaurant_id import ParseId
    # 创造解析类,用来提取用户评论
    class ParseComments(object):
        def __init__(self, shop_id):
            self.shop_id = shop_id# 从具有这个属性,实例需要有具体的shop_id
            self.get_data()# 规定类自带的属性
            self.coms_ = self.get_data()
       
        # 获取数据---从网页上下载数据
        def get_data(self):
            url_code = self.get_originUrl() # 获取原始的url
            # 我的ssl证书有问题,访问https会出现问题,美团支持http和https,所以最后改为http没有问题
            url = 'http://www.meituan.com/meishi/api/poi/getMerchantComment?'
            params = {  # 利用字典传入参数
                'platform': '1',
                'partner': '126',
                'originUrl': url_code, # 是字典中的一个必须的关键url
                'riskLevel': '1',
                'optimusCode': '1',
                'id': self.shop_id,  # 从终端传入的商品id
                'offset': '0',
                'pageSize': '10',
                'sortType': '1',
            }
            # 加入请求头,模拟浏览器
            headers = {
                'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',
            }
            response = requests.get(url=url, params=params, headers=headers) # 获得requests对象,发送网页请求,并且获得响应
            data = response.text # 我们所需要分析的数据
            self.parse(data)  # 交给下面的parse函数解析
            return self.parse(data)
    
        ## 获得不同商品对应的url
        def get_originUrl(self): # 获取某个餐馆的具体url----与某一家餐馆一一对应
            """编码解码
            """
            needParse = ('http://www.meituan.com/meishi/' + '%s'+ '/')%self.shop_id
            return parse.quote_plus(needParse)
            # quote_plus 函数用加号来代替URL中的空格-----构造某个商品的url
    
        # 对某个网页下的数据进行解析,提取出我们所想要的数据
        def parse(self, data):
            """解析数据
            """
            data_dict = json.loads(data) #是Json格式的数据 将json字符串--->json对象  
            print('parse is running....')   
            try:
                coms = [] # 某个店铺的评论,一个店铺会有 10 条
                for item in data_dict.get('data').get('comments'): # 获取数据字典中的data数据,data中也含有comments的数据             
                    coms.append(item.get('comment'))                          
            except:
                print('Error!!!!!!!!!!!!!')
                print('%s'%self.shop_id)
            return coms # 将从每个店铺中获取到的评论返回,作为类的一个元素可以传到相应实例中  
            
        @staticmethod # python返回函数的静态方法,不强制传递参数
        # 函数的执行,可以不用创造实例
        def parse_time(timeStamp): # 解析时间戳,备用---
            """13位 解码时间
            """
            time_stamp = float(int(timeStamp) / 1000)
            time_array = time.localtime(time_stamp)
            return time.strftime("%Y-%m-%d %H:%M:%S", time_array)
    
    # 数据已经在另一个文件中被解析,只需要拿出来就可以,不必自己执行函数获取
    # 要在ParseId后面加上(),因为这是调用的一个类,需要继承这个类,,之后再继承这个类的属性,执行函数
    ids = ParseId().getId()
    
    # 创建实例---将数据写进csv文件中
    special_shops = []
    comments_ = []# 存放所有店铺的coms
    for shop_id in ids:
        pc = ParseComments(shop_id)
        special_shops.append(pc)
        for v in pc.coms_:# coms是类中的一个变量,在执行parse函数时我返回了,并且将其作为这个类的一个属性,在创建实例时继承了下来
            comments_.append(v)
    
    """
    这是改变之后的:
    在写进文件夹之后直接根据相应的评论长度建立一个index,将它与相应的comments写入到csv文件中
    """
    # 底下是将数据写入到csv文件中,要指明为utf-8,否则会出现乱码
    with open(r'D:\lagua\study\coding\pythonPractice\MT_test.csv', 'w+', encoding='utf-8',newline='') as f:
        writer = csv.writer(f)
        to_be_write = []
        index_= list(range(len(comments_))) # 序列号
        for v1,v2 in zip(index_,comments_):# 将两个列表打包
            to_be_write.append([v1,v2]) # 最后得到的是[[1,'a'],[2,'b'],[3,'c']]这样的形式,可以用writerows写进csv文件中
        writer.writerows(to_be_write)##### 注意此处写入是用的元组---用元组形式写入,事实上得到的是列表
    
    

    2.数据清洗

    跟我在最开始介绍的差不多。说说我做了哪些尝试吧。我开始的时候是去网上找如何进行数据的预处理,对比自己获取的文本,看看有哪些东西需要删除的,机器不能够识别的全部都删除。这样下来文本基本上就干净了。

    在将字符串与其相应的文本评论相对应时,我尝试了一些方法。开始是想要用json来存储数据,将评论的文本作为键,1,-1当作是键值value。去学习了一堆的json字符串转化为字典的方法,如何将字典转化为json格式的数据。最后搞来,学习了一些字典以及json相关的知识,在这个过程中我突然想到其实这些不必这么复杂,直接使用列表将元素相对应也就可以,我对列表掌握的还比较好。

    开始的数据我还傻乎乎的每次处理数据先从相应的csv文件中读取,处理完之后再将数据放回csv文件中。不谈及效率,因为我也无法评判效率的高低,就是觉得代码特别臃肿,我将此做法跟一个网友交流一番之后发现这样不好,csv只是一个存储数据的一个文件,数据最开始可以从csv中获取,最后将我们处理好的最终数据存储在csv文件中,这样比较好,不然的话,每次存取很麻烦。

    嘿嘿,我就按照他说的来做,在数据处理的过程中将所有的数据都存放在列表中。在这里要注意的是,开始我以为我的数据量过大,有几百k,列表承受不住,其实完全不用担心,列表好着呢,他肚量可大了,尽情地放。

    在这里我还学习了一些文本处理的一些编程技巧:将所有数据处理的函数都包装成一个过滤器,将待处理的数据输入处理器中,输出处理完的数据,再接着将这个数据输入到下一个过滤器中。有一种石英砂过滤器的感觉。

    列表1---->过滤器1------>列表2------>过滤器2-------…-------->列表n

    列表1
    过滤器1
    列表2
    过滤器2
    ...

    以上的过滤器就可以封装成一个链({过滤器1,过滤器2,…过滤器n}),我们将初始数据输入,将最后要得到的输出返回就可以啦。这就是所谓的包装,哈哈,外面不知道我里面干了啥,特别的神秘,就这样暗悄悄地将数据处理完毕啦,看我多么的神秘,多么的厉害哈哈!

    之后查看资料发现在sklearn中就有这样一个模块,对开始的文本数据预处理,转化为数值向量,放进分类器中训练,得到评价指标。这就是sklearn下的pipeline模块。

    具体参考资料如下:
    sklearn 中的 Pipeline 机制
    sklearn学习笔记3——pipeline
    我也来简单的写一下:
    举个简单的例子,使用KNN来进行分类

    from sklearn.preprocessing import StandardScaler# 标准化处理
    from sklearn.decomposition import PCA 
    from sklearn.pipeline import Pipeline# 管道包
    from sklearn.neighbors import KNeighborsClassifier
    
    from last_process_2 import noStopWord_comments,noStopWord_class# 我处理得到的评论列表极其对应的类别
    import re
    from sklearn.feature_extraction.text import TfidfVectorizer,CountVectorizer# 向量化的类
    from sklearn.model_selection import train_test_split# 将数据分割为训练集与测试集合
    from sklearn import preprocessing# 数据处理使用
    # 将开始的字符串用空格隔开---最后得到的是一个列表,里面中的每个元素都是“你 今天 很 好看” 这样的形式,方便使用tfidfVectorizer讲文本数据转化为向量
    def get_split(x):
        temp = [v for v in re.split(' ',x) if v is not '']
        return temp
    def joinData(data_to_join):# 空字符串将文本隔开
        temp = [' '.join(x) for x in data_to_join]
        return temp    
    corpus = joinData([get_split(v) for v in noStopWord_comments]) # 得到的是一个列表
    tfidf = TfidfVectorizer()# 创建实例,继承方法
    retfidf = tfidf.fit_transform(corpus) # 拟合+转换
    input_data_matrix = retfidf.toarray()# 数值矩阵
    x_train,x_test,y_train,y_test=train_test_split(input_data_matrix,noStopWord_class,test_size=0.2,random_state=400)# 切割训练数据
    
    pipe_knn = Pipeline([('sc',StandardScaler()),('PCA',PCA(n_components=200)),('clf',KNeighborsClassifier())])
    pipe_knn.fit(x_train,y_train)# 拟合+transform数据
    
    print(pipe_knn.score(x_test,y_test))# 得到分类的准确率,即得分
    # 0.8073770491803278
    

    第一步处理代码:
    final_process_1.py

    """
    1、去重,作为初始数据处理
    2、去空tag【】【】
    3、去除空字符串''
    得到我想要的数据,进行人工标记
    ————————————————————
    """
    import csv
    import re
    # 将数据全部都存放再一个列表中
    
    class InitialProcess(object):
        path_initial = r'D:\lagua\study\coding\pythonPractice\DataProcess\MT.csv' # 从美团上获取的初始文本
        path_meituan = r'D:\lagua\study\coding\pythonPractice\DataProcess\MeiTuan.csv'# 数据处理第一道得到的index文本
        # 去重
        def noRepeat(self,x):
            uni = []
            for v in x:
                if v not in uni:
                    uni.append(v)
            return uni
        # 去除只带有标签的评论
        def noTags(self,x):
            def f_replace(x):
                temp =  x.replace('【口味】','').replace('【环境】','').replace('【服务】','').replace('【等位】','').replace('\n','').strip()
                return temp
            return [f_replace(v) for v in x]
        # 将空字符串去掉
        def noVocant(self,x):
            temp = [v for v in x if v is not '']
            return temp
        # 读取之前获取的数据
        def getData(self,path):
            seg_all = []
            with open(path,'r',encoding='utf-8') as f:
                reader = csv.reader(f)
                for line in reader:
                    seg_all.append(line[1])
            print("列表说:我将csv中的数据搞到手啦")
            return self.noRepeat(seg_all)
        
        def get_index(self,x):
            temp = [i for i,v in enumerate(x) if v=='']
            return temp
    
        # 将文件写进csv文件中
        def writeCSV(self,path2,data):
            with open(path2,'w',encoding='utf-8',newline='') as f:
                writer = csv.writer(f)
                for k,v in enumerate(data):
                    writer.writerow([k,v])
    
        def do_thisMethod(self):
            data = self.getData(self.path_initial)# 获取数据,顺便去重
            data_noTag = self.noTags(data)# 去除标签
            data_noVocant = self.noVocant(data_noTag) # 去除上一步可能得到的空字符串
            self.writeCSV(self.path_meituan,data_noVocant) # 写进文档存储,以后就在这里面提取数据,进一步处理
    IniPro = InitialProcess()# 继承类
    IniPro.do_thisMethod()# 实例化之后使用类中的方法
    

    去除停用词。 开始我们讲过,我们是直接将从网上获取的一些停用词复制粘贴到txt文档中的。我们去除停用词首先要读取文档中的停用词,将这些汉字词语符号删除。这里这里会遇到一个问题,是有关编码的,我们一般的汉字存储是ASNI格式,我们要用python读取,需要将数据转化为unicode格式。

    具体这样做:将我们开始保存的txt文本另存为一个txt文件,在这时,你可以看见相关页面中有选择编码的格式,自己选择为unicode格式即可,之后就读取这个文件中的停用词。

    在读取文本的时候还有一点需要注意:

    def stopwordslist(): # 返回列表
        with open(path_stop,'r',encoding='utf-8', errors='ignore') as f:
            stopwords = [line.strip() for line in f.readlines()]
        return stopwords
    

    加上errors='ignore’参数以便忽略错误,继续执行读取函数。
    这里遇到了一个编码的问题:Python中读取txt文本出现“ ‘gbk’ codec can’t decode byte 0xbf in position 2: illegal multibyte sequence”的解决办法

    第二步:去除无效字符 + 停用词代码:
    final_process_2.py

    """
    目的:数据第二步清洗
    1、读取文本数据+相应类别,各自分别放进comments和class_的列表中
    2、使用正则表达式去除其他符号
    3、从停用词列表中读取数据,去除停用词,每个文本得到的剩下单词用' '空格连接起来
    4、将分类所得到的正负文本放进不同的文档中,自己检查看大体上是否分类正确
    """
    import csv
    # import sys
    import jieba
    import re
    # import importlib
    path_meituan = r'D:\lagua\study\coding\pythonPractice\DataProcess\MeiTuan.csv'
    path_class = r'D:\lagua\study\coding\pythonPractice\DataProcess\class_.csv' # 类别
    path_stop = r'D:\lagua\study\coding\pythonPractice\DataProcess\stopWords_3.txt' # 停用词
    path_neg = r'D:\lagua\study\coding\pythonPractice\DataProcess\neg_newMeiTuan.txt'
    path_posi = r'D:\lagua\study\coding\pythonPractice\DataProcess\posi_newMeiTuan.txt'
    # 读取类别
    def get_class():
        class_ = []
        with open(path_class,'r',encoding='utf-8',errors='ignore',newline='') as f:
            reader = csv.reader(f)
            for line in reader:
                temp = line[0].replace('\n','').strip()
                class_.append(int(temp))
        return class_
    # 获取数据--文本评论
    def getData(path): # 获取数据
        seg_all = []
        with open(path,'r',encoding='utf-8') as f:
            reader = csv.reader(f)
            for line in reader:
                seg_all.append(line[1]) # csv第一列是index,第二列是文本评论
        return seg_all
    def get_index(x): # 获得待删除的Index
        temp = [i for i,v in enumerate(x) if v=='']
        return temp
    # 根据index删除元素---主要针对comments来讲
    def delete_comments_accord_index(x,index): # 针对comments删除元素
        to_be_delete = [v for i,v in enumerate(x) if i in index]
        for i in to_be_delete:
            x.remove(i)
        return x
    # 根据index删除元素,对class来讲
    # class中的元素只有1,-1处理方式和comments不一样
    def delete_class_accord_index(class_,index): # 针对class删除元素
        temp = []
        for i,v in enumerate(class_):
            if i not in index:
                temp.append(v)
        return temp
    
    # 去除其他符号
    def splitOther(data_split):
        """
        params:
        data_split:待切分的数据
        return:
        返回:是空元素的index + 待被去除index的文本---以元组的形式返回
        """
        def re_split(desstr):
            temp = ''.join(re.split(r'\W',desstr))
            return temp
        temp = [re_split(desstr) for desstr in data_split]
        # 获得待删除的index
        index = get_index(temp)
        return (index,temp)
    
    # 由index删除列表元素
    def indexProcess(func,last_comments,last_class): 
        """
        params:
        func:清洗数据的某个函数
        last_comments:待处理的文本评论列表
        last_class:待处理的文本类别
        return:
        返回已经去除了相应元素的文本列表 + 对应的class
        """
        noFunc_index = func(last_comments)[0]
        noFunc_comments = func(last_comments)[1]
        final_noFunc = delete_comments_accord_index(noFunc_comments,noFunc_index)
        class_noFunc = delete_class_accord_index(last_class,noFunc_index)
        return (final_noFunc,class_noFunc)
    
    def splitStop(data_split): # 创建停用词列表
        # 从txt文档中读取停用词,放进列表中
        def stopwordslist(): # 返回列表
            with open(path_stop,'r',encoding='utf-8', errors='ignore') as f:
                stopwords = [line.strip() for line in f.readlines()]
            return stopwords
    
        stop_words_list = stopwordslist()
        stopwords = {}.fromkeys(stop_words_list)
        # 建立一个函数去掉字符串中的停用词
        def cutStopWords(word):
            segs = jieba.cut(word, cut_all=False)
            final = ''
            for seg in segs:
                if seg not in stopwords:
                    final += seg
                    final +=' '
            return final
        splitStopData = [cutStopWords(v) for v in data_split]
        index = [i for i,v in enumerate(splitStopData) if v=='']
        return (index,splitStopData)
    
    # 自己检查使用,看是否将文本与标签相对应
    def wirteClass(path_neg,path_posi,comments,class_): # 根据类别写文档
        file_neg = open(path_neg,'w',encoding = 'utf-8',errors='ignore')
        file_posi = open(path_posi,'w',encoding = 'utf-8',errors = 'ignore')
        for i,v in enumerate(noStopWord_comments):
            # 使用try...except 来检测读写过程中的错误
            try:
                if noStopWord_class[i]==-1:
                    file_neg.write(v+'\n')
                else:
                    file_posi.write(v+'\n')
            except:
                print('Error')
        file_neg.close()
        file_posi.close()
    class_ = get_class() # 获取类别 
    comments = getData(path_meituan) # 获取评论
    
    # 充当过滤链
    #-----------------------------------------------------------
    noOtherWord_comments,noOtherWord_class= indexProcess(splitOther,comments,class_) # 根据index处理comments和class
    noStopWord_comments,noStopWord_class=indexProcess(splitStop,noOtherWord_comments,noOtherWord_class)
    #-----------------------------------------------------------
    wirteClass(path_neg,path_posi,noStopWord_comments,noStopWord_class)
    

    好啦,前两步的所有东西就记录在这里,因为还有很多步骤的细节可以展现,在这里写出来就太多啦,放在下一章文本分类(二)文本数据数值化,向量化写。

    展开全文
  • 作者丨孙子荀单位丨腾讯科技高级研究员研究方向丨多模态内容质量本人过去几年一直从事内容质量方面的算法工作,近期出于兴趣对假新闻这个问题...本文主要简单介绍了我们的做法和几篇具有典型代表的假新闻论文,从不...
  • 来源:AAAI2020论文链接:https://www.msra.cn/wp-content/uploads/2020/01/A-Dataset-for-Low-Resou...
  • (该论文的模型创新点在于词向量那里,所以全文的重心偏向于词向量部分) 传统的机器学习方法主要用词袋以及ngram去生成特征向量作为文本表示,从而完成很多任务。但是对于短文本来说,比如tweet,由于短文本字数的...
  • 简体中文论文查重系统 写在前面 本项目于在2017年完成了第一版并购使用,后经一年多的稳定运行和维护升级,于2018年开源。由于项目架构较老,目前本项目以维护为主进行常规更新和BUG修复,不再进行大的功能性更新。 ...
  • 文本分类(二)文本数据数值化,向量化,降维

    千次阅读 多人点赞 2019-05-25 17:14:55
    上面一篇博客文本分类流程(一)文本分类的大致步骤+数据预处理------毕业论文的纪念已经讲述了文本处理中的两个步骤,网页获取+数据清洗,得到了干净的文本数据。 下面开始介绍如何将我们能够识别的文本数据转化为...
  • 面向机构知识库结构化数据文本相似度评价算法,吴旭,郭芳毓,机构知识库中文本数据集多呈现结构化,且具有离散性,对此本文提出一种文本相似度评价算法。通过分析DC(Dublin Core)元数据格式,��
  • 随着深度学习的发展,当前最先进的文本检测和识别方法在处理多分辨率和多领域文本时在各个基准数据集展示了卓越的准确性。 该论文集共收录50篇论文,最高引用数是1040,来自华中科技大学的白翔在该领域发表了6篇论文...
  • 在本文中,我们分析了使用固定长度代码(HFLC)后,数据压缩算法LZW,Huffman,固定长度代码(FLC)和Huffman的不同方法的复杂性和熵。 我们在不同大小的不同文件上测试了这些算法,然后得出以下结论:LZW是所有压缩...
  • 文本摘要相关论文汇总

    千次阅读 2019-03-19 13:42:41
    awesome-text-summarization ...这个仓库有对文本摘要的简单介绍,包括任务定义,类型...同时整理收集了当前文本摘要方面常用的数据集以及相关最新论文, 适合想要快速上手了解文本摘要领域的人。 Table of Contents ...
  • 针对不平衡数据集上进行文本分类,传统的特征选择方法容易导致分类器倾向于大类而忽视小类,提出一种新的特征选择方法IPR(integrated probability ratio)。该方法综合考虑特征在正类和负类中的分布性质,结合四种...
  • 基于文本内容的自动文本聚类,崔再续,郭训力,随着国际互联网和企业内部互联网的飞速发展,各种电子文本数据的数量急剧增加,如何快速有效地获取、管理和使用这些文本数据,已
  • 文本数据处理 今天做论文作业要交,先占个坑,过会补齐
  • 作者:哈工大SCIR 冯夏冲摘要(Summarization)是传统的自然语言处理任务之一[1],多年以来,一直被广大研究者持续挖掘推进,该任务旨在将输入数据转换为包含关键信息的简短概述...
  • 前不久小夕在知乎上写了一个回答《NLP有哪些独立研究方向》,于是有不少小伙伴来问分类和匹配的参考资料了,鉴于文本分类的资料已经超级多了,就不写啦(不过分类相关的tricks可以看之前写的这篇文章《文本分类重要...
  • 由于人类注释的大型数据集存在标签错误,因此能够在标签噪声存在的情况下训练深层神经网络至关重要。标签噪声下的图像分类模型训练受到了广泛的关注,而文本分类模型训练则没有。在本文中,我们提出了一种训练深网络...
  • 文本分割作为监督学习任务 该存储库包含代码和补充材料,这些信息和补充材料是训练和评估模型所必需的,如论文“将 Downalod所需资源 wiki-727K,wiki-50数据集: word2vec: 在configgenerator.py中填充相关路径...
  • 非对话文本的多样化对话生成 英文论文的实现 改编自 @inproceedings{su-etal-2020-diversifying, title = "Diversifying Dialogue Generation with Non-Conversational Text", author = "Su, Hui and Shen, ...
  • 本文详细介绍了在名为“公共图书馆和知识产权法中的网络归档”的受资助研究项目框架内实施的研究,该项目的重点是美国全国的网络采集和归档以及文本数据挖掘(TDM)操作欧盟成员国的图书馆。 网络归档作为欧盟...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,667
精华内容 666
关键字:

文本数据论文