spaCy文档-03:词向量和相似度

spaCy能够比较两个对象,并预测它们的相似程度。 预测相似性对于构建推荐系统或标记重复项很有用。 例如,您可以建议与当前正在查看的用户内容相似的用户内容,或者将支持凭单标记为与现有内容非常相似的副本。

每个Doc、Span和Token都有一个.similarity()方法,它允许您将其与另一个对象进行比较,并确定相似度。当然,相似性总是主观的——“狗”和“猫”是否相似取决于你如何看待它。spaCy的相似模型通常假定一个相当通用的相似性定义。

tokens = nlp(u'dog cat banana')

for token1 in tokens:
    for token2 in tokens:
        print(token1.similarity(token2))
1.png

在这种情况下,模型的预测是很准确的。狗和猫非常相似,而香蕉却不是很相似。相同的标记显然是100%相似的(并不总是精确的1.0,因为向量数学和浮点数的不精确)。

相似性是通过比较词向量或“词嵌入”来确定的,即一个词的多维意思表示。单词向量可以通过像word2vec这样的算法生成,通常是这样的:

BANANA.VECTOR
array([2.02280000e-01,  -7.66180009e-02,   3.70319992e-01,
       3.28450017e-02,  -4.19569999e-01,   7.20689967e-02,
      -3.74760002e-01,   5.74599989e-02,  -1.24009997e-02,
       5.29489994e-01,  -5.23800015e-01,  -1.97710007e-01,
      -3.41470003e-01,   5.33169985e-01,  -2.53309999e-02,
       1.73800007e-01,   1.67720005e-01,   8.39839995e-01,
       5.51070012e-02,   1.05470002e-01,   3.78719985e-01,
       2.42750004e-01,   1.47449998e-02,   5.59509993e-01,
       1.25210002e-01,  -6.75960004e-01,   3.58420014e-01,
      -4.00279984e-02,   9.59490016e-02,  -5.06900012e-01,
      -8.53179991e-02,   1.79800004e-01,   3.38669986e-01,
       1.32300004e-01,   3.10209990e-01,   2.18779996e-01,
       1.68530002e-01,   1.98740005e-01,  -5.73849976e-01,
      -1.06490001e-01,   2.66689986e-01,   1.28380001e-01,
      -1.28030002e-01,  -1.32839993e-01,   1.26570001e-01,
       8.67229998e-01,   9.67210010e-02,   4.83060002e-01,
       2.12709993e-01,  -5.49900010e-02,  -8.24249983e-02,
       2.24079996e-01,   2.39749998e-01,  -6.22599982e-02,
       6.21940017e-01,  -5.98999977e-01,   4.32009995e-01,
       2.81430006e-01,   3.38420011e-02,  -4.88150001e-01,
      -2.13589996e-01,   2.74010003e-01,   2.40950003e-01,
       4.59500015e-01,  -1.86049998e-01,  -1.04970002e+00,
      -9.73049998e-02,  -1.89080000e-01,  -7.09290028e-01,
       4.01950002e-01,  -1.87680006e-01,   5.16870022e-01,
       1.25200003e-01,   8.41499984e-01,   1.20970003e-01,
       8.82389992e-02,  -2.91959997e-02,   1.21510006e-03,
       5.68250008e-02,  -2.74210006e-01,   2.55640000e-01,
       6.97930008e-02,  -2.22580001e-01,  -3.60060006e-01,
      -2.24020004e-01,  -5.36990017e-02,   1.20220006e+00,
       5.45350015e-01,  -5.79980016e-01,   1.09049998e-01,
       4.21669990e-01,   2.06619993e-01,   1.29360005e-01,
      -4.14570011e-02,  -6.67770028e-01,   4.04670000e-01,
      -1.52179999e-02,  -2.76400000e-01,  -1.56110004e-01,
      -7.91980028e-02,   4.00369987e-02,  -1.29439995e-01,
      -2.40900001e-04,  -2.67850012e-01,  -3.81150007e-01,
      -9.72450018e-01,   3.17259997e-01,  -4.39509988e-01,
       4.19340014e-01,   1.83530003e-01,  -1.52600005e-01,
      -1.08080000e-01,  -1.03579998e+00,   7.62170032e-02,
       1.65189996e-01,   2.65259994e-04,   1.66160002e-01,
      -1.52810007e-01,   1.81229994e-01,   7.02740014e-01,
       5.79559989e-03,   5.16639985e-02,  -5.97449988e-02,
      -2.75510013e-01,  -3.90489995e-01,   6.11319989e-02,
       5.54300010e-01,  -8.79969969e-02,  -4.16810006e-01,
       3.28260005e-01,  -5.25489986e-01,  -4.42880005e-01,
       8.21829960e-03,   2.44859993e-01,  -2.29819998e-01,
      -3.49810004e-01,   2.68940002e-01,   3.91660005e-01,
      -4.19039994e-01,   1.61909997e-01,  -2.62630010e+00,
       6.41340017e-01,   3.97430003e-01,  -1.28680006e-01,
      -3.19460005e-01,  -2.56330013e-01,  -1.22199997e-01,
       3.22750002e-01,  -7.99330026e-02,  -1.53479993e-01,
       3.15050006e-01,   3.05909991e-01,   2.60120004e-01,
       1.85530007e-01,  -2.40429997e-01,   4.28860001e-02,
       4.06219989e-01,  -2.42559999e-01,   6.38700008e-01,
       6.99829996e-01,  -1.40430003e-01,   2.52090007e-01,
       4.89840001e-01,  -6.10670000e-02,  -3.67659986e-01,
      -5.50890028e-01,  -3.82649988e-01,  -2.08430007e-01,
       2.28320003e-01,   5.12179971e-01,   2.78679997e-01,
       4.76520002e-01,   4.79510017e-02,  -3.40079993e-01,
      -3.28729987e-01,  -4.19669986e-01,  -7.54989982e-02,
      -3.89539987e-01,  -2.96219997e-02,  -3.40700001e-01,
       2.21699998e-01,  -6.28560036e-02,  -5.19029975e-01,
      -3.77739996e-01,  -4.34770016e-03,  -5.83010018e-01,
      -8.75459984e-02,  -2.39289999e-01,  -2.47109994e-01,
      -2.58870006e-01,  -2.98940003e-01,   1.37150005e-01,
       2.98919994e-02,   3.65439989e-02,  -4.96650010e-01,
      -1.81600004e-01,   5.29389977e-01,   2.19919994e-01,
      -4.45140004e-01,   3.77979994e-01,  -5.70620000e-01,
      -4.69460003e-02,   8.18059966e-02,   1.92789994e-02,
       3.32459986e-01,  -1.46200001e-01,   1.71560004e-01,
       3.99809986e-01,   3.62170011e-01,   1.28160000e-01,
       3.16439986e-01,   3.75690013e-01,  -7.46899992e-02,
      -4.84800003e-02,  -3.14009994e-01,  -1.92860007e-01,
      -3.12940001e-01,  -1.75529998e-02,  -1.75139993e-01,
      -2.75870003e-02,  -1.00000000e+00,   1.83870003e-01,
       8.14339995e-01,  -1.89129993e-01,   5.09989977e-01,
      -9.19600017e-03,  -1.92950002e-03,   2.81890005e-01,
       2.72470005e-02,   4.34089988e-01,  -5.49669981e-01,
      -9.74259973e-02,  -2.45399997e-01,  -1.72030002e-01,
      -8.86500031e-02,  -3.02980006e-01,  -1.35910004e-01,
      -2.77649999e-01,   3.12860007e-03,   2.05559999e-01,
      -1.57720000e-01,  -5.23079991e-01,  -6.47010028e-01,
      -3.70139986e-01,   6.93930015e-02,   1.14009999e-01,
       2.75940001e-01,  -1.38750002e-01,  -2.72680014e-01,
       6.68910027e-01,  -5.64539991e-02,   2.40170002e-01,
      -2.67300010e-01,   2.98599988e-01,   1.00830004e-01,
       5.55920005e-01,   3.28489989e-01,   7.68579990e-02,
       1.55279994e-01,   2.56359994e-01,  -1.07720003e-01,
      -1.23590000e-01,   1.18270002e-01,  -9.90289971e-02,
      -3.43279988e-01,   1.15019999e-01,  -3.78080010e-01,
      -3.90120000e-02,  -3.45930010e-01,  -1.94040000e-01,
      -3.35799992e-01,  -6.23340011e-02,   2.89189994e-01,
       2.80319989e-01,  -5.37410021e-01,   6.27939999e-01,
       5.69549985e-02,   6.21469975e-01,  -2.52819985e-01,
       4.16700006e-01,  -1.01079997e-02,  -2.54339993e-01,
       4.00029987e-01,   4.24320012e-01,   2.26720005e-01,
       1.75530002e-01,   2.30489999e-01,   2.83230007e-01,
       1.38820007e-01,   3.12180002e-03,   1.70570001e-01,
       3.66849989e-01,   2.52470002e-03,  -6.40089989e-01,
      -2.97650009e-01,   7.89430022e-01,   3.31680000e-01,
      -1.19659996e+00,  -4.71559986e-02,   5.31750023e-01], dtype=float32)

important note

为了使比较算法简洁和快速,spaCy的小模型(所有以sm结尾的包)都不使用单词向量,而且这些sm包只包含上下文相关的向量。这意味着您仍然可以使用similarity()方法来比较文档、span和token,但是结果不会很好,单个token不会有任何指定的向量。所以为了使用真正的词向量,你需要下载一个更大的模型:

python -m spacy download en_core_web_lg

内置单词向量的模型使它们成为可用的标记。Token.vector, Doc.vector, Span.vector。文本向量将默认为它们的token向量的平均值。您还可以检查一个token是否有分配的向量,并得到L2规范,它可以用来使向量标准化。

nlp = spacy.load('en_core_web_lg')
tokens = nlp(u'dog cat banana sasquatch')

for token in tokens:
    print(token.text, token.has_vector, token.vector_norm, token.is_oov)
2.png

“dog”、“cat”和“banana”在英语中都很常见,所以它们是模型词汇的一部分,并且带有一个向量。另一方面,“sasquatch”这个词不太常见,也不太常见——所以它的向量表示包含了300个0的维度,这意味着它实际上是不存在的。如果您的应用程序需要包含更多向量的大型词汇表,那么您应该考虑使用一个较大的模型或装入一个完整的向量包,例如,en_vectors_web_lg,其中包含超过100万个唯一的向量。

基于上下文的相似度

除了spaCy内置的单词向量,还有一些根据上下文词汇训练的一些向量,解析、标记和NER模型也依赖于这种上下文中的单词含义的向量表示。当处理管道被应用时,spaCy将文档的内部含义表示为浮点数组,也称为张量。这使得spaCy可以根据周围的单词对单词的意思做出合理的猜测。即使spaCy以前没有见过这个单词,它也会有所了解。因为spaCy使用一个4层的卷积网络,所以张量对一个单词的任意一边的四个单词都很敏感。
例如,这里有三个句子,在不同的语境中包含了“labrador”的单词。

doc1 = nlp(u"The labrador barked.")
doc2 = nlp(u"The labrador swam.")
doc3 = nlp(u"the labrador people live in canada.")
#这边需要注意的是,导入模型不能是md,lg模型,这两个模型计算出来的三个结果是一样

for doc in [doc1, doc2, doc3]:
    labrador = doc[1]
    dog = nlp(u"dog")
    print(labrador.similarity(dog))

尽管模型从来没有见过“labrador”这个词,但它可以很准确地预测它在不同情况下与“dog”的相似性。


3.png

整个文档也一样。 在这里,相似性的差异较小,因为所有单词及其顺序都被考虑在内。 但是,特定于上下文的相似性通常仍然非常准确地反映出来。

doc1 = nlp(u"Paris is the largest city in France.")
doc2 = nlp(u"Vilnius is the capital of Lithuania.")
doc3 = nlp(u"An emu is a large bird.")

for doc in [doc1, doc2, doc3]:
    for other_doc in [doc1, doc2, doc3]:
        print(doc.similarity(other_doc))

即使关于巴黎和维尔纽斯的句子由不同的词汇和实体组成,它们都描述了相同的概念,并被认为比关于ems的句子更相似。 在这种情况下,即使拼写错误的“维尔纽斯”版本仍然会产生非常相似的结果。


4.png

由相同单词组成的句子可能会被认为是非常相似的,但永远不会完全相同。

docs = [nlp(u"dog bites man"), nlp(u"man bites dog"),
        nlp(u"man dog bites"), nlp(u"dog man bites")]

for doc in docs:
    for other_doc in docs:
        print(doc.similarity(other_doc))

有趣的是,“人咬狗”和“狗咬人”被认为比“人咬狗”和“狗咬人”更相似。这可能是一个巧合——或者是“人”被解释为两个句子的主语的结果。


5.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,099评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,828评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,540评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,848评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,971评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,132评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,193评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,934评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,376评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,687评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,846评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,537评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,175评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,887评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,134评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,674评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,741评论 2 351