(三)语言模型和共现矩阵

####1、语言模型
目的:克服one-hot、tf-idf方法中向量丢失句子中单词的位置关系信息
#####1)2-gram
假设语料库如下:

John likes to watch movies. Mary likes too.John also likes to watch football games.

2-gram建立索引如下:(把每个句子中相邻的2个单词用一个编码表示,不再是以前的一个单词一个编码)

"John likes” : 1,
"likes to” : 2,
"to watch” : 3,
"watch movies” : 4,
"Mary likes” : 5,
"likes too” : 6,
"John also” : 7,
"also likes” : 8,
“watch football”: 9,
“football games”: 10,

得到10个编码,所以构建的词向量长度为10;对于句子"John likes to watch movies. Mary likes too."的编码如下:(依次判断1-10个编码,第一个编码"John likes” : 1在句子中出现则为1,否则为0)
[1, 1, 1, 1, 1, 1, 0, 0, 0, 0]

#####2)N-gram
同2-gram,每个句子中相邻的N个单词用一个编码表示,不再是以前的一个单词一个编码

#####3)优缺点
优点: 考虑了词的顺序
缺点: 词表的膨胀

语言模型
一句话 (词组合) 出现的概率
p(w1,...,wm)=∏i=1mP(wi∣w1,...,wi−1) p(w_1,...,w_m)=\prod_{i=1}^{m}P(w_i|w_1,...,w_{i-1}) p(w1,...,wm)=i=1mP(wiw1,...,wi1)
Unigram/1-gram
P(Mary likes too)=P(too∣Mary,likes)∗P(likes∣Mary)∗P(Mary)=P(too)∗P(likes)∗P(Mary)P(Mary\:likes\:too) = P(too | Mary, likes) * P(likes | Mary) *P(Mary)= P(too) * P(likes) * P(Mary)P(Marylikestoo)=P(tooMary,likes)P(likesMary)P(Mary)=P(too)P(likes)P(Mary)

Bi-gram/2-gram
P(Mary likes too)=P(too∣Mary,likes)∗P(likes∣Mary)∗P(Mary)=P(too∣likes)∗P(likes∣Marry)∗P(Mary) P(Mary\:likes\:too) = P(too | Mary, likes) * P(likes | Mary) *P(Mary)= P(too | likes) * P(likes | Marry) * P(Mary) P(Marylikestoo)=P(tooMary,likes)P(likesMary)P(Mary)=P(toolikes)P(likesMarry)P(Mary)

不足:无法衡量词向量之间的关系,同时向量太稀疏
####2、共现矩阵
主要用于发现主题,解决词向量相近关系的表示;
将共现矩阵行(列)作为词向量

例如:语料库如下:
• I like deep learning.
• I like NLP.
• I enjoy flying.

则共现矩阵表示如下:(使用对称的窗函数(左右window length都为1) )

例如:“I like”出现在第1,2句话中,一共出现2次,所以=2。
对称的窗口指的是,“like I”也是2次

将共现矩阵行(列)作为词向量表示后,可以知道like,enjoy都是在I附近且统计数目大约相等,他们意思相近

这里写图片描述

共现矩阵不足:
面临稀疏性问题、向量维数随着词典大小线性增长

解决:SVD、PCA降维,但是计算量大

####3、word2vec
前面方法需要存储的数据过大,这里主要是保存参数来节省,需要时候再通过计算参数得出结果。原理是通过浅层的神经网络训练(input是onehot词向量,output是预测的词向量,比如“我喜欢自学习”,input=“我”和“学习”,out=“喜欢”,input=(0001000)的话,输出时候1的位置是概率,P“喜欢”=1,语料库中的其他词则是P=0)

### 构建词矩阵的方法 为了构建词矩阵,可以采用多种方式来统计词语在同一上下文中同出的情况。下面提供了一种基于Python的简单实方法。 #### 使用PandasScikit-Learn库创建词矩阵 首先需要准备一段文本数据作为输入源,并对其进行预处理,比如分词、去除停用词等操作。这里假设已经得到了一个经过清理后的文档列表`docs`,其中每个元素都是由单词组成的列表形式表示的一篇文档[^1]。 ```python import pandas as pd from sklearn.feature_extraction.text import CountVectorizer def build_cooccurrence_matrix(docs, window_size=2): vectorizer = CountVectorizer(token_pattern=r'\b\w+\b', min_df=1) # 将每篇文章转换成字符串并组合起来形成新的语料库 corpus = [' '.join(doc) for doc in docs] X = vectorizer.fit_transform(corpus) vocab = vectorizer.get_feature_names_out() cooccur_matrix = {word: {} for word in vocab} for i, sentence in enumerate(corpus): words = sentence.split() for j, target_word in enumerate(words): context_words = [] start_index = max(0, j - window_size) end_index = min(len(words), j + window_size + 1) for k in range(start_index, end_index): if k != j and k < len(words): context_words.append(words[k]) for cw in set(context_words): if cw not in cooccur_matrix[target_word]: cooccur_matrix[target_word][cw] = 1 else: cooccur_matrix[target_word][cw] += 1 df = pd.DataFrame.from_dict({i : cooccur_matrix[i] for i in cooccur_matrix.keys()}, orient='index') return df.fillna(0).astype(int) # 假设有一个简单的文档集合如下所示: documents = [ ["I", "love", "to", "play", "football"], ["He", "likes", "playing", "basketball"] ] co_occurrence_matrix = build_cooccurrence_matrix(documents, window_size=2) print(co_occurrence_matrix) ``` 上述代码定义了一个函数`build_cooccurrence_matrix()`,该函数接收两个参数:一个是包含多个已分割好单词序列的文档列表;另一个是指定窗口大小的整数,默认值为2。此函数会返回一个DataFrame对象,其行列索引均为词汇表中的词条名称,单元格内的数值则代表对应两词之间在指定范围内相遇次数之累积总[^2]。 通过这种方式,不仅可以直观地观察到哪些词汇经常一起出,而且还可以进一步应用于后续的任务当中,例如计算相似度得分或是训练更复杂的语言模型
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值