如果能够度量两个向量词袋之间的重合度,就可以很好地估计他们所用词的相似程度,而这也是它们语义上重合度的一个很好的估计。因此,下面用点积来估计一些新句子和原始的Jefferson句子之间的词袋向量重合度:
import pandas as pd
sentence="""
Thomas Jefferson Began buliding Monticelli as the age of 26.\n
"""
sentence=sentence+"""Construction was done mostly by local masons and carpenters.\n"""
sentence=sentence+"""He moved into the South Pavilion in 1770.\n"""
sentence=sentence+"""Turning Monticello into a neoclassical masterpiece was Thomas Jefferson's obsession."""
corpus={}
#一般来说,只需要使用.splitlines()即可,但是这里显式地在每个行尾增加了 \n 字符,因此这里要显式地对此字符串进行分割
for i,sent in enumerate(sentence.split('\n')):
corpus['sent{}'.format(i)]=dict((tok,1) for tok in sent.split())
df=pd.DataFrame.from_records(corpus).fillna(0).astype(int).T
df=df.T
print(df.sent0.dot(df.sent1))
print(df.sent0.dot(df.sent2))
print(df.sent0.dot(df.sent3))
运行结果表明,没有词同时出现在sent0和其他句子中。
词之间的重合度可以作为句子相似度的一种度量方法。
下面是一种找出sent0和sent3之间共享词(如果有)的方法:
print([(k,v) for (k,v) in (df.sent0 & df.sent3).items() if v])
这是自然语言文档(句子)的第一个向量空间模型(VSM)。对于词袋向量,不仅可以使用点积,也可以定义其他的向量运算,如向量加、减、OR与AND等,甚至还可以采用类似欧几里得距离或者向量夹角这样的运算。将文档表示成二值向量具有巨大的作用、所有现代CPI都有硬连线内存寻址指令,这些指令可以有效地哈希、索引和搜索大量这样的二值向量。虽然这些指令是为另一个目的(索引内存位置以从内存中检索数据)而构建的,但是它们在搜索和检索文本的二值向量运算中同样有效。