精华内容
下载资源
问答
  • BERT实现情感分析.

    2020-09-18 16:14:31
    BERT模型的原理,并采用keras微调BERT实现了情感分析BERT作为一个目前热门的预训练模型,其效果突出,在文本特征提取阶段均可采用该模型,再根据具体的业务场景对损失函数进行修改即可实现对应的模型搭建。当然在...
  • bert 情感分析 预训练When doing any Natural Language Processing (NLP) you will need to pre-process your data. In the following example I will be working with a Twitter dataset that is available from ...

    bert 情感分析 预训练

    When doing any Natural Language Processing (NLP) you will need to pre-process your data. In the following example I will be working with a Twitter dataset that is available from CrowdFlower and hosted on data.world.

    在进行任何自然语言处理(NLP)时,您需要预处理数据。 在以下示例中,我将使用Twitter数据集,该数据集可从CrowdFlower获得,并托管在data.world上

    查看数据 (Review the data)

    There are many things to consider when choosing how to preprocess your text data, but before you do that you will need to familiarize yourself with your data. This dataset is provided in a .csv file; I loaded it into a dataframe and proceeded to review it.

    选择如何预处理文本数据时,需要考虑很多事情,但是在进行此操作之前,您需要熟悉数据。 该数据集以.csv文件形式提供; 我将其加载到数据框中,然后进行了审查。

    dataframe = pd.read_csv(data_file)
    dataframe.head()
    Image for post
    The first five rows of the dataframe
    数据框的前五行

    Just looking at the first five rows, I can notice several things:* In these five tweets the Twitter handles have been replaced with @mention* They all have the hashtag #SXSW or #sxsw* There is an html character reference for ampersand &* There are some abbreviations: hrs, Fri* There are some people’s real names, in this case public figures

    仅查看前五行,我会注意到几件事:*在这五条推文中,Twitter句柄已替换为@mention *它们都带有#SXSW或#sxsw的井号标签*对于&符有一个html字符引用 *有些缩写:hrs,Fri *有些人的真实姓名,在这种情况下为公众人物

    This dataset contains about 8500 tweets, I won’t be able to review them all, but by reviewing segments of the dataset I was able to find other peculiarities to the data.* There are some url links, some with http or https, and some without* There are some url links that have been changed to a reference of {link}* There are some other html characters besides &* References to a video have been replaced with [video]* There were many non-english characters* There were many emoticons

    该数据集包含大约8500条tweet,我无法全部查看它们,但是通过查看数据集的各个部分,我可以找到该数据的其他特性。*有些URL链接,有些带有http或https,并且一些不带*的URL链接已更改为对{link}的引用*除&之外还有一些其他html字符 *对视频的引用已替换为[video] *有很多非英语字符*有很多表情符号

    决定时间(Decision Time)

    Now that the data has been reviewed, it’s time to make some decisions about how to process it.

    既然已经对数据进行了审查,那么现在该就如何处理数据做出一些决定了。

    • Lowercase? It’s common when doing NLP to lowercase all the words so that a “Hello” is the same as “hello” or “HELLO”. When dealing with tweets, which are not going to follow standard capitalization rules, you should pause before lowercaseing everything. For example, it’s common to use all caps for emphasis in a tweet when you would rarely do that when writing a formal sentence. For my dataset I chose to just change all the letters to lowercase because I didn’t think I had a large enough dataset that enough additional information would be gained by keeping more than one version of a word. Converting all the letters is easily done using a Python string function.

      小写? 在执行NLP时,将所有单词都小写以使“ Hello”与“ hello”或“ HELLO”相同是很常见的。 在处理不遵循标准大写规则的推文时,应暂停操作,然后再小写所有内容。 例如,通常在推文中使用所有大写字母来强调重点,而在写正式句子时很少这样做。 对于我的数据集,我选择仅将所有字母更改为小写字母,因为我认为我没有足够大的数据集,无法通过保留一个单词的多个版本来获得足够的附加信息。 使用Python字符串函数可以轻松完成所有字母的转换。

    df_clean['tweet_text'] = dataframe.tweet_text.str.lower()
    • URL links I didn’t think URLs would help with sentiment analysis so I wanted to remove them. Removing URLs is not as simple as changing letters to lowercase, it involved using regular expressions (regex). I used two expressions, one for URLs with http or https, and a second for URLs without them, but with or without www.

      URL链接我认为URL不会有助于情绪分析,因此我想删除它们。 删除URL并不像将字母更改为小写字母那样简单,而是使用正则表达式(regex)。 我使用了两个表达式,一个用于带有httphttps的URL,第二个用于不带它们但带或不带www的URL。

    df_clean.tweet_text = df_clean.tweet_text.apply(lambda x: re.sub(r'https?:\/\/\S+', '', x))df_clean.tweet_text.apply(lambda x: re.sub(r"www\.[a-z]?\.?(com)+|[a-z]+\.(com)", '', x))

    Writing regular expressions can be tricky; I use regexr.com to test mine out.

    编写正则表达式可能很棘手。 我使用regexr.com进行测试。

    • Placeholders Some text cleaning was already done on the dataset which replaced some links with {link} and all the videos with [video]. They don’t seem to be of any value when doing sentiment analysis so I will remove them with regex.

      占位符已经对数据集进行了一些文本清理,用{link}替换了某些链接,并用[video]替换了所有视频。 在进行情感分析时,它们似乎没有任何价值,因此我将使用正则表达式将其删除。

    df_clean.tweet_text = df_clean.tweet_text.apply(lambda x: re.sub(r'{link}', '', x))df_clean.tweet_text = df_clean.tweet_text.apply(lambda x: re.sub(r"\[video\]", '', x))
    • HTML reference characters I don’t think these are of any value to the analysis so they also should be removed.

      HTML参考字符我认为这些对分析没有任何意义,因此也应将其删除。

    df_clean.tweet_text = df_clean.tweet_text.apply(lambda x: re.sub(r'&[a-z]+;', '', x))
    • Non-Letter characters I decided to get rid of all the characters that weren’t letters, punctuation that is commonly used in emojis, or hash marks. There were a few non-english characters in the tweets. I didn’t think they would add to the analysis so I wanted to remove them. Numbers typically don’t add much if any information so I wanted to remove them. Punctuation that isn’t usually associated with an emoji needed to be removed too because it didn’t add anything. I did all this with one regex.

      非字母字符我决定删除所有不是字母的字符,表情符号中常用的标点符号或井号。 推文中有一些非英语字符。 我认为它们不会添加到分析中,所以我想删除它们。 如果有任何信息,数字通常不会增加太多,所以我想删除它们。 通常不与表情符号相关的标点也需要删除,因为它没有添加任何内容。 我用一个正则表达式完成了所有这一切。

    df_clean.tweet_text = df_clean.tweet_text.apply(lambda x: re.sub(r"[^a-z\s\(\-:\)\\\/\];='#]", '', x))
    • Twitter handles Prior the text pre-processing stage, I changed all the twitter handles to @mention in acknowledgement of the need for protecting people’s privacy. Because this dataset has been public for years I wasn’t adding much protection, but when creating new datasets, an attempt to anonymize the data should be made. Since I had already changed them all to @mention it was easier to remove all of them; again because they added little information.

      Twitter句柄在文本预处理阶段之前,我承认需要保护人们的隐私,因此我将所有Twitter句柄都更改为@mention 。 由于该数据集已经公开多年,因此我并没有增加太多保护,但是在创建新数据集时,应尝试使数据匿名化。 由于我已经将它们全部更改为@mention,因此将它们全部删除更容易; 再次因为他们添加了很少的信息。

    df_clean.tweet_text = df_clean.tweet_text.apply(lambda x: re.sub(r'@mention', '', x))
    • Real Names They are another privacy issue. If this was a brand new dataset, I think they should be removed prior to publishing the data. In this case where the data has been public for years, I left them in the dataset.

      实名他们是另一个隐私问题。 如果这是一个全新的数据集,我认为应在发布数据之前将其删除。 在这种情况下,数据已经公开多年,我将它们留在数据集中。

    • Abbreviations Depending on your analysis you may want to deal with abbreviations vs. full words. From above there is hrs and Fri. You may want to keep them as is or may want hrs to be considered the same as hours when doing sentiment analysis. For my analysis I used the WordNetLemmatizer within the NLTK package. It does not deal with these abbreviations and I didn’t think it would add enough value to create a function to search for and convert abbreviations to the full version of the words. This would be a very large undertaking given all the existing abbreviations.

      缩写根据您的分析,您可能需要处理缩写与完整单词。 从上面有小时星期五。 您可能希望保留他们作为是或可能想要小时,做情感分析时应该考虑的一样小时。 为了进行分析,我使用了NLTK软件包中的WordNetLemmatizer。 它不处理这些缩写,并且我认为它不会增加足够的值来创建一个函数来搜索缩写并将其转换为单词的完整版本。 考虑到所有现有的缩写,这将是一项非常大的任务。

    标记文本 (Tokenize the text)

    Now to tokenize the pre-processed tweets. There are a variety of ways to do this but I chose to use the TweetTokenizer from NLTK. It knows to keep emojis together as a token and to keep hashtags together. I already removed all the Twitter handles, but if I hadn’t it would tokenize them as @ plus the handle.

    现在将标记化预处理的推文。 有多种方法可以执行此操作,但是我选择使用NLTK中的TweetTokenizer。 它知道将表情符号放在一起作为标记,并将标签标签放在一起。 我已经删除了所有Twitter句柄,但是如果没有,它将把它们标记为@加上句柄。

    from nltk.tokenize import TweetTokenizertknzr = TweetTokenizer()df_clean['tokens'] = df_clean['tweet_text'].apply(tknzr.tokenize)

    Let’s compare the cleaned tweet_text with the tokenized version of a segment of the data.

    让我们将清除的tweet_text与数据段的标记化版本进行比较。

    Image for post
    cleaned tweet_text vs. tokens
    清理过的tweet_text与令牌

    The tokenizer returned a list of strings for each tweet. You can see that the hashtags are kept, ie. #sxsw, words with dashes or apostrophes within them are kept, ie. pop-up, other punctuation is tokenized as individual tokens, ie. the colon at the end of tweet #515, and emojis are kept intact, ie. :) in tweet #514.

    令牌生成器为每个推文返回一个字符串列表。 您可以看到标签被保留,即。 #sxsw,其中带有破折号或撇号的单词将保留,即。 弹出窗口,其他标点符号化为单独的标记,即515号推文结尾处的冒号,并且表情符号保持完整,即。 :)在Twitter#514中。

    更多清洁 (More Cleaning)

    Because I didn’t remove punctuation that is commonly used for emojis earlier, now that the emojis have been tokenized, it’s time to remove it.

    因为我没有删除较早用于表情符号的标点符号,所以既然表情符号已被标记化了,是时候将其删除了。

    I first created a punctuation list and then applied a filter to each tokenized list, keeping only the tokens that are not in the punctuation list. Using this method will leave all the punctuation that is part of a word or an emoji.

    我首先创建了一个标点符号列表,然后将过滤器应用于每个标记化列表,仅保留不在标点符号列表中的标记。 使用此方法将保留作为单词或表情符号一部分的所有标点符号。

    PUNCUATION_LIST = list(string.punctuation)def remove_punctuation(word_list):
    """Remove punctuation tokens from a list of tokens"""
    return [w for w in word_list if w not in PUNCUATION_LIST]df_clean['tokens'] = df_clean['tokens'].apply(remove_punctuation)

    更多决定 (More Decisions)

    • Do you want to keep the stop words? According to a study, removing stop words from tweets when doing sentiment analysis degrades classification performance. I decided to trust this study’s findings and didn’t remove the stop words.

      您要保留停用词吗? 根据一项研究,在进行情感分析时从推文中删除停用词会降低分类性能。 我决定相信这项研究的发现,并且没有删除停用词。

    • Do you want to stem or lemmatize the words? For some of the models I ran, I used the WordNetLemmatizer mentioned above and for some I didn’t. I got mixed results when lemmatizing the words in the tweets, but that may be due to the contents or size of my dataset.

      您是否要阻止或限制单词的使用? 对于我运行的某些模型,我使用了上面提到的WordNetLemmatizer,而对于某些我没有使用的模型。 对推文中的单词进行词素化时,结果参差不齐,但这可能是由于数据集的内容或大小所致。

    模特时间 (Model Time)

    I don’t go through the modeling steps here, but after the above text pre-processing I was ready to train some classifiers.

    我在这里不进行建模步骤,但是在对文本进行了上述预处理之后,我准备训练一些分类器。

    If you would like to check out my full project and additional code, it’s hosted on github here.

    如果您想查看我的完整项目和其他代码,它托管在github here上

    翻译自: https://medium.com/@merb92/pre-processing-tweets-for-sentiment-analysis-a74deda9993e

    bert 情感分析 预训练

    展开全文
  • 此项目是一个TensorFlow Bert情感分析(二分类)项目 ①对代码进行了中文注释 ​ ②移除一些不必要的文件 ​ ③添加中文数据集,对中文数据集进行预处理Process,并在Bert上层构建二分类全连接神经网络
  • “通过构建辅助句子利用BERT进行情感分析”的论文代码和语料库
  • bert_sentiment_analysis:使用BERT进行深度学习的情感分析
  • 使用keras-bert实现 谭松波 酒店评论 文本分类(情感分析)-附件资源
  • 基于Pytorch的Bert应用

    2021-06-22 17:43:38
    基于Pytorch的Bert应用,包括命名实体识别、情感分析、文本分类以及文本相似度等
  • NLP实战之BERT中文情感分析

    千次阅读 2020-05-22 15:59:16
    简单高效的BERT中文文本分类模型开发和部署 准备环境 操作系统:Linux TensorFlow Version:1.13.1,动态图模式 GPU:12G GPU TensorFlow Serving:...data是3分类的文本情感分析数据(可直接将.data.tsv) ...

    简单高效的BERT中文文本分类模型开发和部署

    准备环境

    • 操作系统:Linux(Mac/windows)
    • TensorFlow Version:1.13.1,动态图模式
    • GPU:12G GPU(CPU跑得很慢)
    • TensorFlow Serving:simple-tensorflow-serving
    • 依赖库:requirements.txt

    注意:在windows下运行sh文件,需要安装git工具,在…/Git/bin文件夹中,运行sh.exe后出现窗口,cd到需要运行的文件目录中,输入sh train.sh运行。

    目录结构说明

    在这里插入图片描述

    • bert是官方源码
    • data是3分类的文本情感分析数据(可直接将.data改为.tsv)
    • train.sh、classifier.py 训练文件(bert中文训练时以字做切分)
    • export.sh、export.py 导出TF serving的模型
    • client.sh、client.py、file_base_client.py 处理输入数据并向部署的TF-serving的模型发出请求,打印输出结果

    训练代码

    在bert_classifier.py中写一个自定义的Myprocessor类,继承了run_classifier.py中的DataProcessor。
    写一个自己的文本处理器,需要注意:

    1. 改写label
    2. 把create_examples改成了共有方法,因为我们后面要调用。
    3. file_base的时候注意跳过第一行,文件数据的第一行是title。
    class MyProcessor(DataProcessor):
    
        def get_test_examples(self, data_dir):
            return self.create_examples(
                self._read_tsv(os.path.join(data_dir, "test.data")), "test")
    
        def get_train_examples(self, data_dir):
            """See base class."""
            return self.create_examples(
                self._read_tsv(os.path.join(data_dir, "train.data")), "train")
    
        def get_dev_examples(self, data_dir):
            """See base class."""
            return self.create_examples(
                self._read_tsv(os.path.join(data_dir, "val.data")), "val")
    
        def get_pred_examples(self, data_dir):
            return self.create_examples(
                self._read_tsv(os.path.join(data_dir, "pred.data")), "pred")
    
        def get_labels(self):
            """See base class."""
            return ["-1", "0", "1"]
    
        def create_examples(self, lines, set_type, file_base=True):
            """Creates examples for the training and dev sets. each line is label+\t+text_a+\t+text_b """
            examples = []
            for (i, line) in tqdm(enumerate(lines)):
    
                if file_base:
                    if i == 0:
                        continue
    
                guid = "%s-%s" % (set_type, i)
                text = tokenization.convert_to_unicode(line[1])
                if set_type == "test" or set_type == "pred":
                    label = "0"
                else:
                    label = tokenization.convert_to_unicode(line[0])
                examples.append(
                    InputExample(guid=guid, text_a=text, label=label))   # 对于分类任务,单输入单输出,只需要text_a,不需要text_b
            return examples
    
    def main(_):
      tf.logging.set_verbosity(tf.logging.INFO)
    
      processors = {
          "setiment": MyProcessor
      }
      ...
    
    1. 其他的训练代码,抄官方的就行
    2. 可以直接运行train.sh,注意修改对应的路径
    3. 生成的ckpt文件在output路径下

    导出模型

    主要代码如下,生成的pb文件在api文件夹下

    def serving_input_receiver_fn():
        input_ids = tf.placeholder(dtype=tf.int64, shape=[None, FLAGS.max_seq_length], name='input_ids')
        input_mask = tf.placeholder(dtype=tf.int64, shape=[None, FLAGS.max_seq_length], name='input_mask')
        segment_ids = tf.placeholder(dtype=tf.int64, shape=[None, FLAGS.max_seq_length], name='segment_ids')
        label_ids = tf.placeholder(dtype=tf.int64, shape=[None, ], name='unique_ids')
    
        receive_tensors = {'input_ids': input_ids, 'input_mask': input_mask, 'segment_ids': segment_ids,
                           'label_ids': label_ids}
        features = {'input_ids': input_ids, 'input_mask': input_mask, 'segment_ids': segment_ids, "label_ids": label_ids}
        return tf.estimator.export.ServingInputReceiver(features, receive_tensors)
    
    estimator.export_savedmodel(FLAGS.serving_model_save_path, serving_input_receiver_fn)
    

    TensorFlow Serving部署

    一键部署:

    simple_tensorflow_serving --model_base_path="./api"
    

    本地请求代码

    分为两种,一种是读取文件的,就是要预测的文本是tsv文件的,叫做file_base_client.py,另一个直接输入文本的是client.py。首先更改input_fn_builder,返回dataset,然后从dataset中取数据,转换为list格式,传入模型,返回结果。

    展开全文
  • 使用BERT情感分析
  • 基于Pytorch的Bert应用,包括命名实体识别、情感分析、文本分类以及文本相似度等(后续更新其他方向相关模块),并有相关数据与深度训练优化方式api。各个子项目大都为开源工作,本项目仅做相应处理以及提供一个已训练...
  • 基于Bert的中文情感分析代码及分析

    万次阅读 热门讨论 2019-07-17 18:46:23
    基于Bert的中文情感分析代码及分析 众所周知,Google 前段时间开源了他们的 BERT – BidirectionalEncoderRepresentations fromTransformers 模型,使用多头注意力和位置嵌入,一举打破自然语言处理领域11个不同问题...

    基于Bert的中文情感分析代码及分析

    众所周知,Google 前段时间开源了他们的 BERT – BidirectionalEncoderRepresentations fromTransformers 模型,使用多头注意力和位置嵌入,一举打破自然语言处理领域11个不同问题的最好记录。NLP界开启一个全新的时代,利用Bert做NLP的任务也是取得很好的效果,本文利用微调Bert模型做中文情感分析,实验效果也算不错。本文参考[博文链接]。(https://blog.csdn.net/renxingkai/article/details/87605693)

    数据准备

    中文语料库获取:Github别人分享的各种语料库,这里有很多不同的中文语料库。
    在这里插入图片描述
    当然也可以从别的地方获取语料库。本文主要是通过SMP2019评测比赛获取的数据集。情感类标签是0,1,2,数据如下:
    在这里插入图片描述

    Bert预训练

    拥有了数据集之后,需要下载Bert模型,Bert模型下载
    下载完之后在data文件夹里放入训练集,验证集和测试集数据。
    在这里插入图片描述
    在开源的代码中,预训练的入口是在run_pretraining.py而fine-tune的入口针对不同的任务分别在run_classifier.py和run_squad.py。其中run_classifier.py适用的任务为分类任务。如CoLA、MRPC、MultiNLI这些数据集。而run_squad.py适用的是阅读理解(MRC)任务,如squad2.0和squad1.1。本文是做情感分类任务,因此主要修改run_classifier.py里的一些代码。下载的代码要是想运行,需要安装Tensorflow和pandas,直接pip install 就行。
    在这里插入图片描述

    本实验中增加的Processor代码为:

    如果读取文件格式为csv格式

    class SentenceProcessor(DataProcessor):
        """Processor for the Sentiment Analysis task"""
        #读取训练集
        def get_train_examples(self, data_dir):
          file_path = os.path.join(data_dir, 'train.csv')
          train_df = pd.read_csv(file_path, encoding='utf-8')
          train_data = []
          for index, train in enumerate(train_df.values):
              guid = 'train-%d' % index
              text_a = tokenization.convert_to_unicode(str(train[0]))
              # text_b = tokenization.convert_to_unicode(str(train[1]))
              label = str(train[1])
              train_data.append(InputExample(guid=guid, text_a=text_a, text_b=None, label=label))
          return train_data
        #读取验证集
        def get_dev_examples(self, data_dir):
          file_path = os.path.join(data_dir, 'dev.csv')
          dev_df = pd.read_csv(file_path, encoding='utf-8')
          dev_data = []
          for index, dev in enumerate(dev_df.values):
              guid = 'dev-%d' % index
              text_a = tokenization.convert_to_unicode(str(dev[0]))
              # text_b = tokenization.convert_to_unicode(str(dev[1]))
              label = str(dev[1])
              dev_data.append(InputExample(guid=guid, text_a=text_a, text_b=None, label=label))
          return dev_data
          #读取测试集
              def get_test_examples(self, data_dir):
            file_path = os.path.join(data_dir, 'test.csv')
            test_df = pd.read_csv(file_path, encoding='utf-8')
            test_data = []
            for index, test in enumerate(test_df.values):
                guid = 'test-%d' % index
                text_a = tokenization.convert_to_unicode(str(test[0]))
                # text_b = tokenization.convert_to_unicode(str(test[1]))
                label = str(test[1])
                test_data.append(InputExample(guid=guid, text_a=text_a, text_b=None, label=label))
            return test_data
    	#生成类标签
        def get_labels(self):
            return ['0', '1', '2']
    

    如果读取的文件是Txt格式

        def get_train_examples(self, data_dir):
            file_path = os.path.join(data_dir, 'train_sentiment.txt')
            f = open(file_path, 'r', encoding='utf-8')
            train_data = []
            index = 0
            for line in f.readlines():
                guid = 'train-%d' % index#参数guid是用来区分每个example的
                line = line.replace("\n", "").split("\t")
                text_a = tokenization.convert_to_unicode(str(line[1]))#要分类的文本
                label = str(line[2])#文本对应的情感类别
                train_data.append(InputExample(guid=guid, text_a=text_a, text_b=None, label=label))#加入到InputExample列表中
                index += 1
            return train_data      
    
        def get_dev_examples(self, data_dir):
            file_path = os.path.join(data_dir, 'test_sentiment.txt')
            f = open(file_path, 'r', encoding='utf-8')
            dev_data = []
            index = 0
            for line in f.readlines():
                guid = 'dev-%d' % index
                line = line.replace("\n", "").split("\t")
                text_a = tokenization.convert_to_unicode(str(line[1]))
                label = str(line[2])
                dev_data.append(InputExample(guid=guid, text_a=text_a, text_b=None, label=label))
                index += 1
            return dev_data
    

    修改 processor 字典

    def main(_):
        tf.logging.set_verbosity(tf.logging.INFO)
    
        processors = {
            "cola": ColaProcessor,
            "mnli": MnliProcessor,
            "mrpc": MrpcProcessor,
            "xnli": XnliProcessor,
            "sa": SentenceProcessor,
        }
    

    至此,run_classifier.py需要修改的就完成了。

    训练 BERT 微调任务

    之后就可以直接运行run_classsifier.py进行模型的训练。编写运行脚本,新建一个运行脚本文件名为“run.sh”,在运行时需要制定一些参数,一个较为完整的运行参数如下所示。当然也可以打开powershell 直接输入一下命令运行。

    python3 run_classifier.py \
      --data_dir=data \
      --task_name=sa \
      --vocab_file=chinese_L-12_H-768_A-12/vocab.txt \
      --bert_config_file=chinese_L-12_H-768_A-12/bert_config.json \
      --output_dir=sa_model \
      --do_train=true \
      --do_eval=true \
      --init_checkpoint=chinese_L-12_H-768_A-12/bert_model.ckpt \
      --max_seq_length=70 \
      --train_batch_size=32 \
      --learning_rate=5e-5 \
      --num_train_epochs=3.0
    
    

    这是cpu进行训练的,如果觉得时间长,可以更改–num_train_epochs=1.0。

    验证结果为:

    在这里插入图片描述
    Bert分类任务中只有准确率和损失,本文在运行时增加了进行分类任务精确率、召回率的计算。

    训练完之后需要预测

    python3.6 run_classifier.py \
      --task_name=sa \
      --do_predict=true \
      --data_dir=data \
      --vocab_file=chinese_L-12_H-768_A-12/vocab.txt \
      --bert_config_file=chinese_L-12_H-768_A-12/bert_config.json \
      --init_checkpoint=tmp/sim_model \
      --max_seq_length=70 \
      --output_dir=output
    
    

    运行结果

    运行完之后会生成一个test_results,类似于如下结果:
    在这里插入图片描述

    得到的结果是以概率的形式表示极性,因此写一个转化脚本。

    import os
    import pandas as pd
    
    if __name__ == '__main__':
        pd_all = pd.read_csv(os.path.join("test_results.tsv"), sep='\t', header=None)
        data = pd.DataFrame(columns=['polarity'])
        print(pd_all.shape)
    
        for index in pd_all.index:
            neutral_score = pd_all.loc[index].values[0]
            positive_score = pd_all.loc[index].values[1]
            negative_score = pd_all.loc[index].values[2]
    
            if max(neutral_score, positive_score, negative_score) == neutral_score:
                
                data.loc[index+1] = ["0"]
            elif max(neutral_score, positive_score, negative_score) == positive_score:
                
                data.loc[index+1] = ["1"]
            else:
              
                data.loc[index+1] = ["2"]
                
    data.to_csv(os.path.join("pre_sample.tsv"), sep='\t')
    
    

    结果变成

    在这里插入图片描述

    总结

    用Bert做中文情感分析取得结果比较不错,本文主要是用了隐=式情感分析的语料库,所以效果一般。用Bert预测显示情感效果会很好。

    展开全文
  •   BERT(BidirectionalEncoderRepresentationsfromTransformers)BERT(BidirectionalEncoderRepresentations fromTransformers)BERT(BidirectionalEncoderRepresentationsfromTransformers) 是 ...

       B E R T ( B i d i r e c t i o n a l E n c o d e r R e p r e s e n t a t i o n s f r o m T r a n s f o r m e r s ) BERT(BidirectionalEncoderRepresentations fromTransformers) BERTBidirectionalEncoderRepresentationsfromTransformers G o o g l e Google Google 开发的一种 n l p nlp nlp 领域的预训练语言表示模型, B E R T BERT BERT在11项 N L P NLP NLP 任务中刷新了记录, G o o g l e Google Google 在11月份开源了 b e r t bert bert 的代码,同时发布了多种语言版本的模型。 B e r t Bert Bert 的出现彻底改变了预训练产生词向量和下游具体NLP任务的关系。针对 b e r t bert bert 的概念,网上各种介绍,讲的我也有点脑壳儿痛,为了不误导各位看官,这里就麻烦各位自己去看看其他博客和论文了,我们这里主要浅显的讲解一下分类应用。
       G o o g l e Google Google 官方的 B E R T BERT BERT 源码为 T e n s o r f l o w Tensorflow Tensorflow 的,所以网上比较多的是使用 T e n s o r f l o w Tensorflow Tensorflow 的应用,由于我并不是很懂 T e n s o r f l o w Tensorflow Tensorflow,所以我这里使用 P y T o r c h PyTorch PyTorch 来处理这些。

      官方推荐的 P y T o r c h PyTorch PyTorch 版本为 p y t o r c h _ p r e t r a i n e d _ b e r t pytorch\_pretrained\_bert pytorch_pretrained_bert,安装和使用可以参考官方文档。安装完成后,就可以开始我们的情感分析应用。

    模型准备

       B E R T BERT BERT 模型是将预训练模型和下游任务模型结合在一起的,也就是说在做下游任务时仍然是用 B E R T BERT BERT 模型,而且天然支持文本分类任务,在做文本分类任务时不需要对模型做修改。 G o o g l e Google Google 提供了下面七种预训练好的模型文件。:

       B E R T BERT BERT 模型在英文数据集上提供了两种大小的模型, B a s e Base Base L a r g e Large Large u n c a s e d uncased uncased是意味着输入的词都会转变成小写, c a s e d cased cased 是意味着输入的词会保存其大写(在命名实体识别等项目上需要)。 M u l t i l i n g u a l Multilingual Multilingual 是支持多语言的,最后一个是中文预训练模型。

      我们这里处理的是中文数据集,所以使用最后一个预处理模型 b e r t − b a s e − c h i n e s e bert-base-chinese bertbasechinese,,预处理根据功能,又可分为分为几个子模型:

      我们的应用为情感分类,所以使用 B e r t F o r S e q u e n c e C l a s s i f i c a t i o n BertForSequenceClassification BertForSequenceClassification 来训练。加载该模型:

    	bert_model = BertForSequenceClassification.from_pretrained(pretrained_model_name_or_path='bert-base-chinese', num_labels=2)

       f r o m _ p r e t r a i n e d from\_pretrained from_pretrained 第一个参数为模型,可以跟本地的模型路径,也可以是模型名, n u m _ l a b e l s num\_labels num_labels 默认为 2,官方说可以不用写,但是我没加该参数编译报错,下面为两种模型加载方式,有兴趣的可以看看源码:

    	BertForSequenceClassification.from_pretrained(pretrained_model_name_or_path='bert-base-chinese', num_labels=2)
    	BertForSequenceClassification.from_pretrained(pretrained_model_name_or_path=path, num_labels=2)

       根据源码,我们可以轻松的找到模型输入的数据格式:

       其中输入的参数中:
          i n p u t _ i d s input\_ids input_ids: 在中文模式中就是每个分词的 i d id id
          a t t e n t i o n _ m a s k attention\_mask attention_mask : 句子中的字符对应1,补全的字符对应0
          t o k e n _ t y p e _ i d s token\_type\_ids token_type_ids: 句子标识符,第一句全为0,第二句全为1
          l a b e l s labels labels: 将 l a b e l _ l i s t label\_list label_list 转化为相应的 i d id id 表示

      输出:
         输入参数中没有 l a b e l s labels labels,则输出为预测 l a b e l s labels labels, 输入中存在 l a b e l s labels labels, 则输出为 l o s s loss loss
      
       知道了模型输入的参数为什么样的数据,接下来就需要将我们的数据处理为需要的格式。

    数据处理

      数据还是使用深度学习(十一)-基于LSTM的情感分类 中小米8的评论,首先还是将评论使用词嵌入来向量化。
      老规矩,词嵌入的第一步依然是分词, B E R T BERT BERT 发布的支持中文预训练模型为 b e r t − b a s e − c h i n e s e bert-base-chinese bertbasechinese ,在该模型中,中文分词是基于字而非词的分词。

    	import torch
    	from pytorch_pretrained_bert import BertTokenizer
    	
    	tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')  # 分词器
    	text = "商品不错,京东让我很失望"
    	print(tokenizer.tokenize(text))

      分词结果为:

       B e r t Bert Bert 自带的有向量化的函数: c o n v e r t _ t o k e n s _ t o _ i d s convert\_tokens\_to\_ids convert_tokens_to_ids,根据源码,修改出我自己的数据处理函数,大家也可以使用源码中的函数:

        def convert_examples_to_features(sentence, seq_length, tokenizer):
       		tokens_a = tokenizer.tokenize(sentence)
    
            # Account for [CLS] and [SEP] with "- 2"
            if len(tokens_a) > seq_length - 2:
                tokens_a = tokens_a[0: (seq_length - 2)]
                
            tokens = []
            input_type_ids = []
            tokens.append("[CLS]")
            input_type_ids.append(0)
            for token in tokens_a:
                tokens.append(token)
                input_type_ids.append(0)
            tokens.append("[SEP]")
            input_type_ids.append(0)
    
            input_ids = tokenizer.convert_tokens_to_ids(tokens)
    
            # The mask has 1 for real tokens and 0 for padding tokens. Only real
            # tokens are attended to.
            input_mask = [1] * len(input_ids)
    
            # Zero-pad up to the sequence length.
            while len(input_ids) < seq_length:
                input_ids.append(0)
                input_mask.append(0)
                input_type_ids.append(0)
    
            assert len(input_ids) == seq_length
            assert len(input_mask) == seq_length
            assert len(input_type_ids) == seq_length
    
            return input_ids, input_mask, input_type_ids

      其中输入参数为: s e n t e n c e sentence sentence 为输入中文语句, s e q l e n g t h seq_length seqlength 一句话的长度, t o k e n i z e r tokenizer tokenizer 分词方法。

    优化/损失函数

    • 优化

      在 B e r t Bert Bert中,优化函数改为 B e r t A d a m BertAdam BertAdam:

    	optimizer = BertAdam(bert_model.parameters(), lr=1e-5)
    
    • 损失

      从源码中我们可以看出,损失函数在定义的模型中已经给我们写好了,所以我们完全可以不用管损失函。

    模型训练

      这里还是跟之前一样,不多讲,不懂的可以看看前面的博客或者在下面留言,看到必回。

        for num, (input_ids, segment_ids, input_mask, label_ids) in enumerate(train_sampler):
            input_ids = Variable(torch.Tensor(input_ids).long())
            segment_ids = Variable(torch.Tensor(segment_ids).long())
            input_mask = Variable(torch.Tensor(input_mask).long())
            label_ids = Variable(torch.Tensor(label_ids).long())
    
            bert_model.train()
    
            optimizer.zero_grad()
            loss = bert_model(input_ids, segment_ids, input_mask, label_ids)
    
            loss.backward()
            optimizer.step()
    

    模型测试

      测试依然参考之前博客,但是输入同模型训练一样为 [ n p u t _ i d s , s e g m e n t _ i d s , i n p u t _ m a s k ] [nput\_ids, segment\_ids, input\_mask] [nput_ids,segment_ids,input_mask],只是不需要 l a b e l s labels labels 即可。

    总结

      我这里只是浅显的讲解了 B e r t Bert Bert 的其中一个应用,并没有讲解原理等,感兴趣的朋友可以多浏览一下其他大神的解释,也可以尝试做做其他应用。应为才学习没多久,理解不深,如果哪位觉得有不对的地方,或者内容浅显,请嘴下留情。

    展开全文
  • 使用BERT进行情感分析

    千次阅读 2019-12-28 21:35:19
    年前最后一篇,就写个自己使用BERT的流程步骤,提前祝大家新年快乐~ ## STEP1:构建模型 class Config(object): """配置参数""" def __init__(self, dataset): self.model_name = 'bert' self.train_path = ...
  • 基于BERT的中文情感分析实战
  • 基于BERT做中文文本分类(情感分析)

    万次阅读 多人点赞 2019-10-07 16:39:41
    BertBERT是一种预训练语言表示的方法,这意味着我们在大型文本语料库(例如Wikipedia)上训练通用的“语言理解”模型,然后将该模型用于我们关心的下游NLP任务,BERT优于之前的方法,因为它是第一个用于预训练...
  • 基于Pytorch的Bert应用,包括命名实体识别、情感分析、文本分类以及文本相似度等(后续更新其他方向相关模块),并有相关数据与深度训练优化方式api。各个子项目大都为开源工作,本项目仅做相应处理以及提供一个已训练...
  • 项目主要是利用BERT实现中文的情感分类 主要实现包括: bert 模型的实现 利用起进行情感分类 需要版本 python3 和tensorflow 大于1.10
  • Bidirectional Encoder Representations from Transformers (BERT) is a major advancement in the field of Natural Language Processing (NLP) in recent years. BERT achieves good performances in many aspects...
  • 情感分析旨在分类出文本在不同方面的情感倾向。在长文本的方面级情感分析中,由于长文本存在一定冗余性和噪声大的问题,导致现有的方面级情感分析方法对于长文本中方面相关信息的特征提取不够充分,分类不精准;在...
  • bert中文情感分析多分类任务详解

    千次阅读 热门讨论 2020-06-11 02:55:19
    We will use the GPU: GeForce GTX 1070 导入评论信息 import pandas as pd path = './中文文本情感分类/' comments = pd.read_csv(path + '社交网站评论信息情感分类.csv') moods = {0: '喜悦', 1: '愤怒', 2: '...
  • 本实验,是用BERT进行中文情感分类,记录了详细操作及完整程序
  • 使用BERT轻松快速地实现针对Yelp评论的多类别文本情感分析。在本文中,我们将使用BERT在Yelp评论上开发多类文本分类。BERT概述BERT是用于通用“语言理解” 的深度双向表示模型,可从左至右和从右至左学习信息。BERT...
  • bert中文情感分析二分类任务详解

    千次阅读 2020-06-11 02:36:52
    from transformers import BertTokenizer print('下载 BERT tokenizer...') #tokenizer = BertTokenizer.from_pretrained('chinese_L-12_H-768_A-12', do_lower_case=True) tokenizer = BertTokenizer.from_...
  • 基于bert的评论文本情感分析

    千次阅读 2020-09-30 11:14:05
    本博客记录一下用bert模型进行中文文本分类的实战经历 一、文件目录构成 二、数据集构成 训练集9000条,验证集1500条,测试集1500条,在run_classifier.py中修改自己的数据集读入方式 标签及正负样本构成如下: ...
  • 基于方面的情感分析(ABSA)是一种文本分析方法,它定义了与特定目标相关的某些方面的观点的极性。关于ABSA的大部分研究是用英语进行的,少量工作是用阿拉伯语进行的。大多数先前的阿拉伯语研究依赖于深度学习模型,该...
  • 基于Bert实现的情感分类任务,包含对于Bert原文的讲解和介绍,其实任务2分类99+精度一直到5分类仍有97+精度
  • 使用BERT的细粒度情感分类 此存储库包含用于获取的结果的代码。 用法 可以使用run.py运行各种配置的实验。 首先,安装python软件包(最好在一个干净的virtualenv中): pip install -r requirements.txt Usage: ...
  • Keras-Bert 实现文本分类 以下文档可下载:https://pan.baidu.com/s/1UfnIWmFMhqAIXl8LouJNWQ 提取码:9m5u 复制这段内容后打开百度网盘手机App,操作更方便哦 项目的地址在Github:...
  • 本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前一篇介绍了Keras-bert库安装...这篇文章将通过keras-bert库构建Bert模型,并实现微博情感分析。这是迁移学习的基础性文章,希望对您有所帮助!

空空如也

空空如也

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

bert情感分析