山东大学2018级项目实训2021-7-17:
时间:2021年7月17日-7月18日
项目题目:基于关键词的语义泛化系统:
1.具体工作
文本矩阵化
我理解的文本矩阵化,即将文本进行“词向量化”。这里简述常见的语言表示模型(词嵌入、句表示、篇章表示)。
词向量类型:1)一个词一列向量的表示方法有Hash算法和word2vec。hash算法将词打散成(01010101)的数值,word2vec则同时打散定义成了向量。word2vec考虑了上下语义,doc2vec还考虑了上下语句顺序,用在段落中较好。
2)一个词一个值,bow算法+词权重,LDA主题-词语矩阵,两者有递进关系,bow进化到LDA。
根据词向量组成句向量的方式:1)一次一列向量,一般用简单相加来求得;2)一个词一个值是用权重组合成向量的方式。(谷歌的句向量sen2vec可以直接将句子变成一列向量)
词向量的额外效果:1)消除歧义:LDA的主题-词语向量;2)结合上下文语境:word2vec;3)文档与文档之间的关系:bow+TFIDF(TF-IDF能够较好区分文档差别的指标,而互信息较为有利于文档中核心词的提取)
2.1 Bow算法衍生——one-hot representation
1)词频做向量值
Bag-of-words model:该模型忽略掉文本的语法和语序等要素,将其仅仅看作是若干个词汇的集合,文档中每个单词的出现都是独立的。BOW使用一组无序的单词(words)来表达一段文字或一个文档。
举例:文档1:John likes to watch movies. <ary likes too.
文档2: John also likes to watch football games.
基于上述两个文档中出现的单词,构建如下的一个字典:
{“John”: 1, “likes”: 2,“to”: 3, “watch”: 4, “movies”: 5,“also”: 6, “football”: 7, “games”: 8,“Mary”: 9, “too”: 10}
上面的词典中包含10个单词, 每个单词有唯一的索引, 那么每个文本我们可以使用一个10维的向量来表示。如下:
[1, 2, 1, 1, 1, 0, 0, 0, 1, 1]
[1, 1,1, 1, 0, 1, 1, 1, 0, 0]
该向量与原来文本中单词出现的顺序没有关系,而是词典中每个单词在文本中出现的频率。
Distributed Representation是一个稠密、低维的实数限量,它的每一维表示词语的一个潜在特征,该特征捕获了有用的句法和语义特征。其特点是将词语的不同句法和语义特征分布到它的每一个维度上去表示。
2)词权重做向量值(TFIDF/CHI/MI)
TFIDF等term weighting来当做词向量。会搭配着BOW模型使用,比如先定位了每句话出现的词,然后填上的不是频数,而是每个词的向量。
2.2 Hash算法衍生——simhash算法——onehot representation(见参考链接1)
2.3 Word2Vec词向量延伸
1)word2vec
word2vec基于上下文语境来获取词向量。如图:
2)句向量
最直观的思路,对于phrase和sentence,我们将组成它们的所有word对应的词向量加起来,作为短语向量,句向量
2.4 主题模型中的topic-word向量(可参考:关键词抽取模型)
主题模型建立之后,会得到两个矩阵,一个是主题-词语向量矩阵;一个是文档-主题向量矩阵。其中的主题-词语矩阵,可以用来代表每个词。实际上,其是代表每个词在每个主题下的频率,但是作为潜在语义的判别也十分有效,业界会开发使用,来作为了解文档词语相关性的判别。
这个概率公式可以用矩阵表示:
其中”文档-词语”矩阵表示每个文档中每个单词的词频,即出现的概率;”主题-词语”矩阵表示每个主题中每个单词的出现概率;”文档-主题”矩阵表示每个文档中每个主题出现的概率。
2.5 Bog-of-word model:TF-IDF特征值为权重实现
原文链接:https://blog.csdn.net/weixin_39441762/article/details/88256152
demo代码:
from sklearn.feature_extraction.text import TfidfVectorizer
# 导入文本
corpus = ['this is the first document',
'this is the second second document',
'and the third one',
'is this the first document']
tfidf_vec = TfidfVectorizer()
tfidf_matrix = tfidf_vec.fit_transform(corpus)
# 得到语料库所有不重复的词
print(tfidf_vec.get_feature_names())
# 得到每个单词对应的id值
print(tfidf_vec.vocabulary_)
# 得到每个句子所对应的向量
# 向量里数字的顺序是按照词语的id顺序来的
print(tfidf_matrix.toarray())