⚽开发平台:jupyter lab
🎈运行环境:python3、TensorFlow2.x
第7章 有趣的词嵌入–word embedding(一)| 文本数据处理
- 1. 数据集介绍和数据清洗
* - 1.1 数据集显示
- 1.2 清洗数据
- 2. 停用词的使用(后续完善)
- 3. 词向量训练模型word2vec使用介绍
* - 3.1 word2vec模型的介绍
- 3.2 word2vec的优缺点
- 3.3 word2vec的模型训练结构
- 1.4 以gensim包对数据进行训练(程序7-5)
- 4. 文本主体的提取
* - 4.1 文本主体的提取:基于TF-IDF
– - 4.2 文本主体的提取:基于TextRank
–
word embedding(词嵌入),常用来进行情感分析、同义词聚类、文章分类和打标签。
(1)该部分内容介绍:通过多种计算word embedding的方法循序渐进的了解如何获取对应的word embedding,之后通过实战使用word embedding进行文本分类。
(2)该章节将分为两个部分,组建能够代表文本内容的矩阵向量的主要步骤:文本分词 –> 词向量训练 –> 特征词抽取。
- 数据集介绍和数据清洗
· 新闻分类数据集”AG”,是从2000多个不同的新闻来源搜索的超过一百万的新闻文章。用于研究分类、聚类、信息获取(排序、搜索)等非商业活动。
· AG News下载地址: https://s3.amazonaws.com/fast-ai-nlp/ag_news_csv.tgz
1.1 数据集显示
rankings_colname=['label','title','text']
agnews_train = pd.read_csv('./ag_news_csv/train.csv',encoding='utf-8',engine='python',header=None,names=rankings_colname)
agnews_train
1.2 清洗数据
import re
def text_clear(text):
text = text.lower()
text = re.sub(r'[^a-z0-9]',' ',text)
text = re.sub(r' +',' ',text)
text = text.strip()
text = text.split(' ')
return text
import csv
import numpy as np
agnews_label = []
agnews_title = []
agnews_text = []
agnews_train = csv.reader(open('./ag_news_csv/train.csv','r'))
for line in agnews_train:
agnews_label.append(np.float32(line[0]))
agnews_title.append(line[1])
agnews_text.append(text_clear(line[2]))
merge = pd.DataFrame({
'label':agnews_label,
'title':agnews_title,
'text':agnews_text
})
merge
- 停用词的使用(后续完善)
import re
import nltk
def text_clear(text):
syoplist = stopwords.words('english')
text = text.lower()
text = re.sub(r'[^a-z0-9]',' ',text)
text = re.sub(r' +',' ',text)
text = text.strip()
text = text.split(' ')
text = [word for word in text if word not in stoplist]
text = [PorterStemmer().stem(word) for word in text]
text.append('eos')
text = ['bos'] + text
return text
- 词向量训练模型word2vec使用介绍
3.1 word2vec模型的介绍
one-hot 存在的问题:one-hot用来表达词向量非常简单,但是存在着很多问题。最大的问题是词汇表一般非常大,表达的效率不高。使用在卷积神经网络中会使得网络难以收敛。
百度百科版本:Word2vec,是一群用来产生词向量的相关模型。这些模型为浅而双层的神经网络,用来训练以重新建构语言学之词文本。网络以词表现,并且需猜测相邻位置的输入词,在word2vec中词袋模型假设下,词的顺序是不重要的。训练完成之后,word2vec模型可用来映射每个词到一个向量,可用来表示词对词之间的关系,该向量为神经网络之隐藏层。
; 3.2 word2vec的优缺点
其优点:
(1)由于 Word2vec 会考虑上下文,跟之前的 Embedding 方法相比,效果要更好(但不如 18 年之后的方法)
(2)比之前的 Embedding方法维度更少,所以速度更快。
其缺点:
(1)由于词和向量是一对一的关系,所以多义词的问题无法解决。
(2)Word2vec 是一种静态的方式,虽然通用性强,但是无法针对特定任务做动态优化。
3.3 word2vec的模型训练结构
如上图, word2vec具体的训练方法主要由2个方法:CBOW(Continuous Bag-of-Word Model,连续词袋模型)和Skip-gram模型。
- CBOW模型(左):CBOW是一个三层网络神经,该模型的 特点是输入已知上下文,输出对当前单词的预测。
- Skip-gram模型(右):与CBOW模型相反,由当前词预测上下文词。
; 1.4 以gensim包对数据进行训练(程序7-5)
import re
def text_clear(text):
text = text.lower()
text = re.sub(r'[^a-z0-9]',' ',text)
text = re.sub(r' +',' ',text)
text = text.strip()
text = text.split(' ')
return text
import csv
import numpy as np
agnews_label = []
agnews_title = []
agnews_text = []
agnews_train = csv.reader(open('./ag_news_csv/train.csv','r'))
for line in agnews_train:
agnews_label.append(np.float32(line[0]))
agnews_title.append(text_clear(line[1]))
agnews_text.append(text_clear(line[2]))
from gensim.models import word2vec
model = word2vec.Word2Vec(agnews_text,vector_size = 64,min_count = 0,window = 5, epochs = 128)
model_name = './corpusWord2Vec.bin'
model.save(model_name)
print("开始训练模型...")
from gensim.models import word2vec
model = word2vec.Word2Vec.load('./corpusWord2Vec.bin')
model.train(agnews_title,epochs = model.epochs,total_examples = model.corpus_count)
- 文本主体的提取
(1)文本的提取关键字主要涉及两种算法:基于TF-IDF 和 基于TextRank。
(2)目标文本经过文本清洗和停用词的去除后,一般可以认为剩下的均有着目标含义的词。如果需要对其特征进行进一步的提取,提取能够代表文章的元素,包括词、短语、句子、标点以及其他信息的词。从词的角度来看,需要提取对文章表达贡献度大的词。
4.1 文本主体的提取:基于TF-IDF
4.1.1 TF-IDF的原理
TF-IDF的介绍:
(1)是一种用于信息检索与信息勘测的常用加权技术。
(2)是一种统计方法,用来衡量一个词对一个文件及的重要程度。字词的重要性与其在文件中出现的次数成正比,而与其在文件集中出现的次数成反比。
(2)TextRank提取文本关键词的步骤:
- 把给定的文本T按照完整句子进行分割;
- 对于每个句子,进行分词和词性标注处理,并过滤掉停用词,只保留指定词性的单词,如名词、动词、形容词。
- 构建候选关键词图G=(V,E),其中V为节点集,由每个词之间的相似度作为连接的边值。
- 根据下面的公式迭代传播公式,直至收敛:
- 对接点权重进行倒序排序,作为按重要程度排列的关键词。
; 4.2.2 TextRank算法的实现(程序7-8)
class TextRank_score:
def __init__(self,agnews_text):
self.agnews_text = agnews_text
self.filter_list = self.__get_agnews_text()
self.win = self.__get_win()
self.agnews_text_dict = self.__get_TextRank_score_dict()
def __get_agnews_text(self):
sentence = []
for text in self.agnews_text:
for word in text:
sentence.append(word)
return sentence
def __get_win(self):
win = {}
for i in range(len(self.filter_list)):
if self.filter_list[i] not in win.keys():
win[self.filter_list[i]] = set()
if i-5 < 0:
lindex = 0
else:
lindex = i-5
for j in self.filter_list[lindex:i+5]:
win[self.filter_list[i]].add(j)
return win
def __get_TextRank_score_dict(self):
time = 0
score = {w:1.0 for w in self.filter_list}
while (time<50):
for k,v in self.win.items():
s = score[k]/len(v)
score[k] = 0
for i in v:
score[i] += s
time += 1
agnews_text_dict = {}
for key in score:
agnews_text_dict[key] = score[key]
return agnews_text_dict
def __get_TextRank_score(self,text):
temp_dict = {}
for word in text:
if word in self.agnews_text_dict.keys():
temp_dict[word] = (self.agnews_text_dict[word])
values_list = sorted(temp_dict.items(),key = lambda word_tfidf:word_tfidf[1],reverse=False)
return values_list
def get_TextRank_result(self,text):
temp_dict = {}
for word in text:
if word in self.agnews_text_dict.keys():
temp_dict[word] = (self.agnews_text_dict[word])
values_list = sorted(temp_dict.items(),key = lambda word_tfidf:word_tfidf[1],reverse=False)
value_list = []
for value in values_list:
value_list.append(value[0])
return (value_list)
import re
def text_clear(text):
text = text.lower()
text = re.sub(r'[^a-z0-9]',' ',text)
text = re.sub(r' +',' ',text)
text = text.strip()
text = text.split(' ')
return text
import csv
import numpy as np
agnews_label = []
agnews_title = []
agnews_text = []
agnews_train = csv.reader(open('./ag_news_csv/train.csv','r'))
for line in agnews_train:
agnews_label.append(np.float32(line[0]))
agnews_title.append(text_clear(line[1]))
agnews_text.append(text_clear(line[2]))
import math
from gensim.models import word2vec
model = word2vec.Word2Vec.load('./corpusWord2Vec.bin')
model.train(agnews_title,epochs = model.epochs,total_examples = model.corpus_count)
textRank = TextRank_score(agnews_text)
for line in agnews_text:
value_list = textRank.get_TextRank_result(line)
print(value_list)
print(model.wv[value_list])
['cynics', 'dwindling', 'sellers', 'ultra', 'seeing', 'band', 'green', 'short', 'wall', 'street', 'again', 'are', 'reuters', 's', 'of']
[[ 1.17348909e+00 1.02108687e-01 -2.14409783e-01 5.70180178e-01
5.92369318e-01 -2.27488980e-01 8.21133733e-01 -1.15657197e-02
-1.33338773e+00 8.64599049e-01 6.07247353e-02 1.21579468e-01
-2.61938065e-01 -2.27355242e+00 9.15813267e-01 -1.07883906e+00
-1.14634979e+00 1.12520278e+00 -4.91948947e-02 -1.16895348e-01
7.24857509e-01 1.39616776e+00 1.17800856e+00 -1.72829461e+00
-5.66338658e-01 2.23885298e-01 1.25472039e-01 6.62063241e-01
-7.65496254e-01 1.92389220e-01 1.52555954e+00 5.19824445e-01
2.86635458e-01 -9.66206968e-01 -1.14739060e+00 -9.22317505e-01
-4.35026914e-01 -1.09736383e+00 6.40903533e-01 1.33023655e+00
-5.85277438e-01 -1.80912471e+00 1.23930439e-01 -1.80330956e+00
1.17725062e+00 1.23168588e+00 2.40483686e-01 -6.05988549e-03
1.87227798e+00 1.09425902e+00 1.05933940e+00 8.33601654e-01
4.79003996e-01 1.70514488e+00 -4.15998369e-01 1.31858647e+00
-5.62793136e-01 -1.34071529e+00 -2.29905796e+00 2.67159432e-01
1.65977216e+00 -1.72118330e+00 7.79630840e-01 8.27822387e-01]
[ 4.25027561e+00 -2.85347676e+00 -1.37562180e+00 -5.55923402e-01
-1.86602366e+00 -2.47801828e+00 -7.06179380e-01 1.77989691e-01
-3.90829116e-01 -1.60654616e-02 -4.09186506e+00 5.16973114e+00
-2.94205189e-01 1.05223686e-01 4.93972570e-01 1.74947226e+00
-7.62385488e-01 4.78628069e-01 -2.49241114e+00 -1.89942157e+00
5.75124562e-01 -6.23579323e-01 1.25777984e+00 -2.65328214e-02
-2.61453342e+00 1.17088020e+00 1.76670197e-02 2.22019523e-01
...
Original: https://blog.csdn.net/d_eng_/article/details/125371433
Author: deng_den
Title: 《基于Tensorflow的知识图谱实战》| 有趣的词嵌入–word embedding(一)| 文本数据处理
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/595366/
转载文章受原作者版权保护。转载请注明原作者出处!