NLP

NLP

[TOC]

1.Introduction

Wordnet:Alt text
日语Wordnet使用

import sys
import sqlite3
from collections import namedtuple
if __name__ == '__main__':
    conn = sqlite3.connect("wnjpn.db")

    cur = conn.execute("select name from sqlite_master where type='table'")  # 获取数据库存在的表格
    for row in cur:
       print(row)

    cur = conn.execute("select * from word where lang='jpn' limit 10")  # 获取日文单词
    # print(cur.description)
    for row in cur:
        print(row)
    cur = conn.execute("PRAGMA TABLE_INFO(word)")  # 查看word表的列名
    for row in cur:
        print(row)



# 类似语检索
def SearchSimilarWords(word):

    # 問い合わせしたい単語がWordnetに存在するか確認する
    cur = conn.execute("select wordid from word where lemma='%s'" % word) #sql搜索指定词

    word_id = 99999999  #temp 如果检索到相应单词的话会改变为一个正常的较小的值
    for row in cur:  #遍历搜索结果
        word_id = row[0]


    # Wordnetに存在する語であるかの判定
    if word_id==99999999:
        print("「%s」は、Wordnetに存在しない単語です。" % word)
        return
    else:
        print("【「%s」の類似語を出力します】\n" % word)

    # 入力された単語を含む概念を検索する
    cur = conn.execute("select synset from sense where wordid='%s'" % word_id)        #sense表包含着单词id和synset id
    synsets = []
    #遍历对sense的搜索结果,加入同义词集数组
    for row in cur:
        synsets.append(row[0])


    # 概念に含まれる単語を検索して画面出力する
    no = 1
    #对每个同义词集进行遍历,输出
    for synset in synsets:
        cur1 = conn.execute("select name from synset where synset='%s'" % synset)
        for row1 in cur1:
            print("%sつめの概念 : %s" %(no, row1[0]))
        cur2 = conn.execute("select def from synset_def where (synset='%s' and lang='jpn')" % synset)
        sub_no = 1
        for row2 in cur2:
            print("意味%s : %s" %(sub_no, row2[0]))
            sub_no += 1
        cur3 = conn.execute("select wordid from sense where (synset='%s' and wordid!=%s)" % (synset,word_id))
        sub_no = 1
        for row3 in cur3:
            target_word_id = row3[0]
            cur3_1 = conn.execute("select lemma from word where wordid=%s" % target_word_id)
            for row3_1 in cur3_1:
                print("類義語%s : %s" % (sub_no, row3_1[0]))
                sub_no += 1
        print("\n")
        no += 1

Alt text

2.Word2Vec

WordNet的一些不足(如无法判断相似性等),引入了词向量
One-hot:热独码。仅有一个1的向量
在One-hot编码下。词汇独立。点乘为0

Distribution similarity(分布相似性)
靠上下文来表示一个词的含义

于是使用一个密集向量来表示一个词。可以预测文本其他词汇

2.1 Word2Vec

$w_{-t}$表示围绕在t中心词周围的其他单词(除t之外所以其他词汇),J为损失函数

Word2Vec是一个软件
2个算法

Skip-grams(SG):
Alt text
定义一个窗口:radius m of every word
目标函数:
Alt text
遍历每个词汇,大小为2m的窗口,左m右m个词,然后条件概率相乘
$\theta$是词的向量表示,也是唯一参数
为了方便运算,取对数,转换求积为求和,再取个平均1/T(相当归一化处理)
上面其实就是似然函数
Alt text
要做的就是,通过当前的词向量来最小化似然函数
Alt text
上面为softmax模型。也就是指数某值除于所有指数和.所以某词和当前中心词的点乘结果越大,softmax结果越大
o是输出单词,c是中心单词
$u_o$是索引为o的单词对应的向量 $v_c$是中心词汇对应的向量
Softmax是一种把数值转换成概率的方法
关注的是单词ID在窗口的位置,当关注的是句法之类的而不是单词本身意思时,考虑距离很有用
Alt text
过程描述:
1.首先是一个中心词汇的one-hot向量$w_t$,然后和一个由所有中心词汇向量构成的矩阵W相乘,能够选出一列$v_c$,也就是中心词汇对应的词向量(完成了通过ont-hot->词向量的步骤)
2.然后和上下文的词汇表示矩阵相乘
3.softmax后可以预测某个位置出现哪个词,然后和实际情况比较
Alt text
对于每个单词有一个d维的小向量
这个矩阵就是要优化的
Alt text
第一部分求导为u_0
Alt text
转换后
Alt text
u_x是期望向量是所有上下文向量的平均,前面的是一个概率
优化方式
Alt text

穿插的highlight paper:
1.计算句子向量
Alt text
对每个句子执行上面那个。a是一个常数
Alt text
Alt text

CBOW:Continuous Bag of Words:

2个高效训练方式

Hierachical softmax

Negative sampling

Assignment 1:

Q1:Softmax:
1.Alt text

Prove:$softmax(x)=softmax(x+c)$,x is a vector and c is a constant
begin:
Let $x=(x_1,x_2,…,x_n)$
and then we know that $softmax(x)=(\frac{e^{x_1}}{\sum_j e^{x_j}},\frac{e^{x_2}}{\sum_j e^{x_j}},…,\frac{e^{x_n}}{\sum_j e^{x_j}})$
and $softmax(x+c)=(\frac{e^{x_1+c}}{\sum_j e^{x_j+c}},\frac{e^{x_2+c}}{\sum_j e^{x_j}},…,\frac{e^{x_n+c}}{\sum_j e^{x_j+c}})=\\=(\frac{e^{x_1}e^c}{e^c\sum_j e^{x_j}},\frac{e^{x_2}e^c}{e^c\sum_j e^{x_j}},…,\frac{e^{x_n}e^c}{e^c\sum_j e^{x_j}})=(\frac{e^{x_1}}{\sum_j e^{x_j}},\frac{e^{x_2}}{\sum_j e^{x_j}},…,\frac{e^{x_n}}{\sum_j e^{x_j}})=softmax(x)$
Then this question is solved

2.softmax

import numpy as np

def softmax_inrow(m):
   # print(m)
    rm=np.max(m,axis=1)
    rm_r=rm.reshape(rm.shape[0],1)
    #print(rm_r)
    m1=m-rm_r
    e1=np.exp(m1)
    sum=np.sum(e1,axis=1)
    sum=sum.reshape(sum.shape[0],1)
    e1=e1/sum
    #print(e1)
    return e1

def softmax_incoloum(m):
    # print(m)
    rm = np.max(m, axis=0)
    #rm_r = rm.reshape(rm.shape[0], 1)
    #print(rm)
    m1 = m - rm
    #print(m1)
    e1 = np.exp(m1)
    sum = np.sum(e1, axis=0)
    #sum = sum.reshape(sum.shape[0], 1)
    e1 = e1 / sum
    # print(e1)
    return e1

N=input()
D=input()
matrix=np.random.rand(int(N),int(D))
print(softmax_incoloum(matrix))
#print(softmax2(matrix))

Q2:
2.1

As $\sigma(x)=\frac{1}{1+e^{-x}}$
$\sigma’(x)=\frac{e^{-x}}{(1+e^{-x})^2}\\e^{-x}=\frac{1}{\sigma(x)}-1$
So,$\sigma’(x)=\sigma(x)(\frac{1}{\sigma(x)}-1)=1-\sigma(x)$

3

Alt text
Alt text

Alt text
Alt text

词向量类似这样
Alt text
进行奇异值分解降维
Alt text
Alt text
Alt text
解决某些词过于频繁出现(如the)

Alt text
Alt text
Alt text
Alt text
Alt text
Alt text
Alt text

Keyword

Wordnet
One-hot
Word Embeddings(词嵌入)
Distribution representation
Distribution similarity(分布相似性)
Skip-grams(SG)
normalization
cross-entropy(交叉熵)
softmax
bag-of-word(词袋)
backpropagation
SGD:Stochastic Gradient Descent
co-occurrence
Glove
L1 regularization
L2 regularization

-------------End of this passage-------------