【Spacy教程】統計模型任務和匹配模板Matcher

      網友投稿 898 2025-04-01

      學習總結


      (1)學習spacy的nlp對象、toke對象、span對象;在統計模型的依存標注、詞性標注、命名實體標注任務中的用法,以及基于規則的匹配matcher。

      ![在這里插入圖片描述](https://img-blog.csdnimg.cn/ebf31d957d6f4a8197fc5b5726a1f3e5.png#pic_center#pic_center =400x)

      @[toc]

      零、Introduction to Spacy

      0.1 nlp對象、toke對象、span對象

      如果是處理中文則是導入中文類:from spacy.lang.zh import Chinese,并且創建nlp對象nlp = Chinese()。

      (1)這里實例化的對象包含處理管道pipeline,可用于分詞,spacy.lang可支持多種語言。

      (2)這里我們將文本doc傳參入剛才實例化的nlp對象,然后像列表一樣進行遍歷,也可以通過下標進行索引。

      (3)可以通過.text訪問文本中每個分詞的文本,其可以是一個單詞或標點符號

      ![在這里插入圖片描述](https://img-blog.csdnimg.cn/be0eadc480ff48f7be76c11564db4bde.png#pic_center =310x)

      # -*- coding: utf-8 -*- """ Created on Wed Dec 8 10:16:04 2021 @author: 86493 """ # 導入英文類 from spacy.lang.en import English # 實例化一個nlp類對象,包含管道pipeline nlp = English() # print(nlp) doc = nlp("December is excited!") # 迭代tokens for token in doc: print(token.text) token = doc[1] print(token.text)

      December is excited ! is

      (1)也可以將多個元素組成Span對象,如下會打印出is excited,注意也是左開右閉。

      (2)Span對象只是一個視圖,并沒有包含數據本身,

      ![在這里插入圖片描述](https://img-blog.csdnimg.cn/3c57497eb3e84eec88e95942f97c2f0e.png#pic_center =300x)

      # 左開右閉 span = doc[1: 3] print(span.text)

      0.2 詞匯屬性

      依次打印出文本中的index、分詞、是否為字母、是否為標點符號、是否為數字。

      doc = nlp("It costs .") print("Index: ", [token.i for token in doc]) print("Text: ", [token.text for token in doc]) print("is_alpha:", [token.is_alpha for token in doc]) print("is_punct:", [token.is_punct for token in doc]) print("like_num:", [token.like_num for token in doc])

      結果為:

      Index: [0, 1, 2, 3, 4] Text: ['It', 'costs', '$', '5', '.'] is_alpha: [True, True, False, False, False] is_punct: [False, False, False, False, True] like_num: [False, False, False, True, False]

      一、統計模型

      1.1 依存標注、詞性標注

      可以完成詞性標注、依存關系解析、命名實體識別等任務,是從標注過的文本中訓練而來。

      $ python -m spacy download en_core_web_sm import spacy nlp = spacy.load("en_core_web_sm")

      (1)Part-of-speech Tags詞性標注,可以通過token.pos_獲得token的詞性標注。

      (2).dep_屬性返回預測的依存關系標注。

      (3).head屬性返回句法頭詞符。即詞在句子中所依附的母詞符。

      注意在spaCy中,返回字符串的屬性名一般結尾會有下劃線;沒有下劃線的屬性會返回一個整型的ID值。

      import spacy # Load the small English model nlp = spacy.load("en_core_web_sm") # Process a text doc = nlp("She ate the pizza") # Iterate over the tokens for token in doc: # Print the text and the predicted part-of-speech tag print(token.text, token.pos_, token.dep_, token.head.text)

      She PRON nsubj ate ate VERB ROOT ate the DET det pizza pizza NOUN dobj ate

      命名實體是那些被賦予了名字的真實世界的物體,比如一個人、一個組織或者一個國家。

      1.2 命名實體標注

      從doc.ents中可以讀取模型預測出的所有命名實體。

      (1)它會返回一個Span實例的遍歷器,我們可以打印出實體文本和用.label_屬性來打印出實體標注。

      (2)ents.text為對應識別出的實體。

      下面即找出句子中所有的命名實體:

      # 處理文本 doc = nlp("微軟準備用十億美金買下這家英國的創業公司。") # 遍歷識別出的實體 for ent in doc.ents: # 打印實體文本及其標注 print(ent.text, ent.label_)

      模型正確地將"微軟"識別為一個組織,將"英國"識別為一個地理政治實體, 將"十億美金"預測為錢。當然如果不知道GPE啥意思,可以spacy.explain("GPE")查看,達到'Countries, cities, states'的解釋。結果為:

      微軟 ORG 十億美金 MONEY 英國 GPE

      小練習:打印出句子中的的文字、詞符的.pos_(詞性標注) 以及詞符的.dep_(依存標注)

      import spacy nlp = spacy.load("zh_core_web_sm") text = "寫入歷史了:蘋果是美國第一家市值超過一萬億美元的上市公司。" # 處理文本 doc = nlp(text) for token in doc: # 獲取詞符文本、詞性標注及依存關系標簽 token_text = token.text token_pos = token.pos_ token_dep = token.dep_ # 規范化打印的格式 print(f"{token_text:<12}{token_pos:<10}{token_dep:<10}")

      寫入 VERB ROOT 歷史 NOUN dobj 了 PART discourse : PUNCT punct 蘋果 NOUN nsubj 是 VERB cop 美國 PROPN nmod 第一 NUM nummod 家 NUM mark:clf 市值 NOUN nsubj 超過 VERB acl 一萬億 NUM nmod:range 美元 NUM mark:clf 的 PART mark 上市 NOUN compound:nn 公司 NOUN ROOT 。 PUNCT punct

      (2)命名實體識別

      import spacy # Load the small English model nlp = spacy.load("en_core_web_sm") # Process a text doc = nlp("It’s official: Apple is the first U.S. public company to reach a trillion market value") # 命名實體識別 for ent in doc.ents: # 打印實體文本和標簽 print(ent.text, ent.label_)

      可以看到上面句子對應的實體:

      Apple ORG first ORDINAL U.S. GPE trillion MONEY

      小測:

      ![在這里插入圖片描述](https://img-blog.csdnimg.cn/5da761bc6f3a458ab283f0e7553761c0.png#pic_center =690x)

      二、基于規則的匹配

      【Spacy教程】統計模型任務和匹配模板Matcher

      2.1 不直接用正則表達式的原因

      我們是在Doc對象中而不是直接在字符串上做匹配(與正則表達式相比,matcher是配合Doc和Token這樣的方法來使用的, 而不是只作用于字符串上。)

      我們是在詞符及其屬性中做匹配

      我們可以直接調用模型的預測結果來寫規則。

      舉個例子,“duck” (動詞) vs. “duck” (名詞)是不一樣的("duck"名詞意思是鴨子,而動詞是閃避的意思)

      2.2 匹配的模板 Matcher

      匹配的模板是一個列表,列表中每個元素是一個字典。

      每個字典即一個字符,字典的key為字符屬性名,value為映射到對應的目標值。

      (1)注意一開始要傳入nlp.vocab詞表。

      (2)matcher.add方法可以用來添加一個模板。第一個參數是唯一的ID用來識別匹配的是哪一個模板。

      【栗子1】匹配詞符的完全一致的文字

      下面的for循環其實也可以寫成print("Matchers:", [doc[start: end].text for match_id, start, end in matches])。

      注意:官方教程說是matcher.add("IPHONE_PATTERN", pattern),但是試了下報錯(PS:spacy3.0以前的版本很多不太一樣的寫法),這里應該給pattern加上[ ],參考官方文檔的栗子:

      ![在這里插入圖片描述](https://img-blog.csdnimg.cn/df46dd02311f42a180a1e2d6f83ad92a.png#pic_center =400x)

      # 使用matcher import spacy from spacy.matcher import Matcher # 讀取一個模型,創建nlp實例 nlp = spacy.load("en_core_web_sm") # 用模型分享出的volab初始化matcher matcher = Matcher(nlp.vocab) # 給matcher加入模板 pattern = [{"TEXT": "iPhone"}, {"TEXT": "X"}] matcher.add("IPHONE_PATTERN", [pattern]) # 處理文本 doc = nlp("Upcoming iPhone X release date leaked") # 調用matcher matches = matcher(doc) # 遍歷所有的匹配結果 for mathc_id, start, end in matches: # 獲得匹配的跨度 matched_span = doc[start: end] print(matched_span.text)

      對doc調用一個matcher時會返回一個列表,其中列表中每個元素是一個元組tuple。

      每個元組由三個值構成:匹配到的ID,匹配到的跨度的起始start和終止索引end。

      所以我們可以對所有的匹配結果進行遍歷,然后創建Span實例。 這個實例即為doc被起始和終止索引截取的部分。

      iPhone X

      【栗子2】匹配任意的詞符屬性

      pattern = [ {"LEMMA": "喜歡", "POS": "VERB"}, {"POS": "NOUN"} ] doc = nlp("我喜歡狗但我更喜歡貓。")

      詞根是“喜歡”的動作,后面接一個名詞:

      喜歡狗 喜歡貓

      【栗子3】使用運算符和量詞

      可以規定匹配的次數:

      ![在這里插入圖片描述](https://img-blog.csdnimg.cn/5d0d3274d4d8426f88d22de251af2e39.png#pic_center =400x)

      pattern = [ {"LEMMA": "買"}, {"POS": "NUM", "OP": "?"}, # 可選: 匹配0次或者1次 {"POS": "NOUN"} ] doc = nlp("我買個肉夾饃。我還要買涼皮。")

      在這里"?"運算符使相應的判斷詞符變為可選, 所以我們會匹配到一個詞根為"買"的詞符,一個可選的數詞和一個名詞。

      買個肉夾饃 買涼皮

      2.3 Matcher小練習

      【栗子1】只匹配到所有提及完整iOS版本的部分

      doc = nlp( "升級iOS之后,我們并沒有發現系統設計有很大的不同,遠沒有當年iOS 7發布時帶來的" "煥然一新的感覺。大部分iOS 11的設計與iOS 10保持一致。但我們仔細試用后也發現了一些" "小的改進。" ) # 寫一個模板來匹配完整的iOS版本 ("iOS 7", "iOS 11", "iOS 10") pattern = [{"TEXT": "iOS"}, {"IS_DIGIT": True}]

      Match found: iOS 7 Match found: iOS 11 Match found: iOS 10

      【栗子2】“下載”+專有名詞

      doc = nlp( "我之前有去下載Dota到電腦上面,但是根本打不開游戲,怎么辦?" "我下載Minecraft,是Windows的版本,下載后是一個'.zip'的文件夾,然后我用了默認軟件做了" "解壓...我是不是還需要去下載Winzip?" ) # 寫一個模板來匹配"下載"加一個代詞 pattern = [{"TEXT": "下載"}, {"POS": "PROPN"}]

      Match found: 下載Dota Match found: 下載Minecraft Match found: 下載Winzip

      【栗子3】形容詞后接名詞

      匹配到形容詞(“ADJ”) 后面跟著一兩個名詞"NOUN"(一個名詞和另一個可能有的名詞)。

      doc = nlp( "這個app的特性包括了優雅設計、快捷搜索、自動標簽以及可選聲音。" ) # 寫一個模板是形容詞加上一個或者兩個名詞 pattern = [{"POS": "ADJ"}, {"POS": "NOUN"}, {"POS": "NOUN", "OP": "?"}]

      Match found: 優雅設計 Match found: 快捷搜索 Match found: 自動標簽 Match found: 可選聲音

      Reference

      (1)https://course.spacy.io/en/chapter1

      (2)spacy基礎教程

      自然語言處理基礎

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:阿姆達爾定律
      下一篇:提高操作速度的excel六大冷門快捷鍵(excel快捷鍵大全和excel 常用技巧整理)
      相關文章
      亚洲精品av无码喷奶水糖心| 亚洲成a人片在线观| 亚洲人成77777在线播放网站不卡| 亚洲av午夜成人片精品网站| 成人亚洲性情网站WWW在线观看| 亚洲欧洲日本在线| 噜噜噜亚洲色成人网站| 亚洲男人的天堂网站| 国产亚洲玖玖玖在线观看| 亚洲国产精品综合久久20| 亚洲不卡1卡2卡三卡2021麻豆| 亚洲欧洲综合在线| 亚洲第一区视频在线观看| 亚洲精品在线播放视频| 亚洲网站视频在线观看| 亚洲精品韩国美女在线| 亚洲国产综合在线| 亚洲一区精品视频在线| 亚洲综合中文字幕无线码| 亚洲最大av资源站无码av网址| 亚洲 暴爽 AV人人爽日日碰| 亚洲乱码一区二区三区国产精品| 亚洲人精品亚洲人成在线| 亚洲中文字幕久久精品无码A| 亚洲中文字幕无码av| 亚洲国产精品精华液| 婷婷亚洲综合一区二区 | 色天使亚洲综合一区二区| 鲁死你资源站亚洲av| 亚洲AV无码不卡在线观看下载| 亚洲 国产 图片| 狠狠综合久久综合88亚洲| 亚洲精品国产成人片| 亚洲精品无码不卡| 亚洲国产超清无码专区| 亚洲色无码专区一区| 亚洲国产精品尤物yw在线| 亚洲人成图片小说网站| 久久久久亚洲AV无码专区体验| 亚洲欧洲精品一区二区三区| 亚洲制服丝袜中文字幕|