在分词之后,对于文本类型的特征属性,需要进行文本数据转换,也就是需要将文本数据转 换为数值型数据。因为神经网络的本质还是数学运算。所以我们第一步是将分词转化为数字符号进行表示。
(想知道中文如何进行分词?
点击这里:NLP基础_分词_jieba学习笔记_nlp分词-CSDN博客)
基础方式如下:
序号化、
哑编码(One-Hot)、
词袋法(BOW/TF) TF-IDF(Term frequency-inverse document frequency)
主题模型
LSA
LDA等
word embedding部分:
Word2Vec、Char2Vec
Doc2Vec
FastText
cw2vec
注:本篇笔记只是将相关的知识框架简单的罗列出来,仅供学习参考
1.序号化
将单词按照词典排序,给定从0或者1或者2开始的序号即可,一般情况有几 个特征的单词: 、;PAD表示填充字符,UNK表示未知字符
在这个例子中,我们可以看到我们分别将3个文本分为了4个token,每个token用左侧的词典表示(词典可自定义)
这就是简单的序号化
2.one-hot编码
使用一个非常稀疏的向量来表示单词的特征向量信息,假设现在有n个单词 (词表大小为n),那么转换的特征向量就是n维,仅在对应位置为1,其它位 置全部为0。
注意:当一个文本有多个词同时出现时文本向量就会累加。根据这个特性我们可以知道每个词在文本中出现的次数
在这个例子中我们使用one-hot编码表示了文本数据。
3.词袋法,TF-IDF
词袋法
词袋法(Bag of words, BOW)是最早应用于NLP和IR领域的一种文本处理模型,该模型忽略文本的语法和语序,用一组无序的单词(words)来表达一段文字或者一个文档,词袋法中使用单词在文档中出现的频数/频率来表示文档,使用所有文档中出现的单词作为特征属性
需要详细资料的调转博主:词向量之词袋模型(BOW)详解_bow词袋模型-CSDN博客
拓展:序号化和词袋法的区别
词袋法(Bag of Words)和序号化(Tokenization)是文本处理中常用的两种技术,它们有以下区别:
-
词袋法(Bag of Words):
- 定义: 词袋法是一种简单的文本表示方法,将文本看作是无序的单词集合,忽略单词在文本中的顺序,只关注单词的出现频率或计数。
- 过程: 将文本分割成单词(tokenization),然后统计每个单词在文本中的出现次数,构建一个基于单词频率的向量表示每个文档。
- 特点: 词袋法忽略了单词顺序和语法结构,只关注单词出现的频率,适用于很多文本分类和聚类任务。
-
序号化(Tokenization):
- 定义: 序号化是将文本数据转换为一系列单词、短语或符号的过程,每个单词或符号被称为一个 token。
- 过程: 序号化包括词汇划分、标点符号处理、大小写处理等步骤,将文本分割成有意义的 token,并可能对 token 进行进一步处理(如词干提取、停用词过滤等)。
- 特点: 序号化保留了文本的结构信息,能够更好地捕捉单词之间的关系,例如,词序对于语言模型和序列生成任务至关重要。
区别总结:
- 词袋法关注单词出现的频率,忽略了单词顺序和语法结构;而序号化保留了文本的结构信息,考虑单词之间的顺序关系。
- 词袋法主要用于文本分类、情感分析等任务;序号化通常是文本预处理的一部分,为后续的文本分析任务提供处理后的文本数据。
TF-IDF
TF-IDF就是在词袋法的基础上加入单词重要性的影响系数:
单词的重要性随着它在文本中出现的次数成正比增加,也就是单词的出现次数 越多,该单词对于文本的重要性就越高。 --> TF
同时单词的重要性会随着在语料库/训练数据中出现的频率成反比下降,也就 是单词在语料库中出现的频率越高,表示该单词越常见,也就是该单词对于文 本的重要性越低。 --> ID
得到TF和IDF后,我们 :
计算出文档的每个词的TF-IDF值,然后按降序排列,取排在最前面的几个词。这就是TF-IDF
代码实现:
# corpus:语料库 # words:对所有句子分词后的结果,[[], ...] # word_count:对每个句子进行词频统计, [{}, ...] # word_dict:每一个句子的词频统计结果, {} # word:每一个词,word_id # import math from collections import defaultdict corpus = [ "what is the weather like today", "what is for dinner tonight", "this is a question worth pondering", "it is a beautiful day today" ] words = [] # 对corpus分词 for sentence in corpus: words.append(sentence.strip().split()) # 如果有自定义的停用词典,我们可以用下列方法来分词并去掉停用词 # f = ["is", "the"] # for i in corpus: # all_words = i.split() # new_words = [] # for j in all_words: # if j not in f: # new_words.append(j) # words.append(new_words) # print(words) # 进行词频统计 def Counter(words): word_count = [] for sentence in words: word_dict = defaultdict(int) for word in sentence: word_dict[word] += 1 word_count.append(word_dict) return word_count word_count = Counter(words) # 计算TF(word代表被计算的单词,word_dict是被计算单词所在句子分词统计词频后的字典) def tf(word, word_dict): return word_dict[word] / sum(word_dict.values()) # 统计含有该单词的句子数 def count_sentence(word, word_count): return sum([1 for i in word_count if i.get(word)]) # i[word] >= 1 # 计算IDF def idf(word, word_count): return math.log(len(word_count) / (count_sentence(word, word_count) + 1)) # 计算TF-IDF def tfidf(word, word_dict, word_count): return tf(word, word_dict) * idf(word, word_count) p = 1 for word_dict in word_count: print("part:{}".format(p)) p += 1 for word, cnt in word_dict.items(): print("word: {} ---- TF-IDF:{}".format(word, tfidf(word, word_dict, word_count)))
代码部分来自博主aift
4.主题模型
主题模型是一种用于发现文本集合中潜在话题结构的统计模型。其中,Latent Semantic Analysis(LSA)和Latent Dirichlet Allocation(LDA)是两种常见的主题模型。
Latent Semantic Analysis(LSA):
- LSA是一种基于奇异值分解(SVD)的方法,通过将文本数据表示为词项-文档矩阵,然后对这个矩阵进行降维处理,从而找到隐藏的语义结构。
- LSA可以帮助识别相关的词汇和文档,捕捉词汇之间的语义关系,但无法直接给出话题的具体内容。
Latent Dirichlet Allocation(LDA):
- LDA是一种生成式的概率模型,假设每个文档是由多个主题混合而成,每个主题又由多个词汇组成。
- 在LDA中,通过推断文档的主题分布和词汇的主题分布,可以揭示文本集合中潜在的主题信息。
- LDA不需要预先指定主题数量,而是通过训练数据推断出最有可能的主题结构。
主题模型的应用包括文本主题分析、信息检索、文本分类等领域。通过主题模型,我们可以更好地理解大规模文本数据中的主题结构,挖掘隐藏在文本背后的语义信息。虽然主题模型并不直接考虑词汇之间的语义关系,但它们可以帮助我们理解文本数据的话题结构,为文本处理任务提供有益的信息。
但现在不是主流所以这里简单介绍一下。想要详细了解还请自行学习。
word embedding部分
后半部分详情请见:https://blog.csdn.net/m0_62965652/article/details/135370268?spm=1001.2014.3001.5501
本人水平有限,如有错误请多多指正,谢谢!