1629. 按鍵持續時間最長的鍵
898
2025-04-01
學習總結
(1)學習spacy的nlp對象、toke對象、span對象;在統計模型的依存標注、詞性標注、命名實體標注任務中的用法,以及基于規則的匹配matcher。

@[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訪問文本中每個分詞的文本,其可以是一個單詞或標點符號。

# -*- 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對象只是一個視圖,并沒有包含數據本身,

# 左開右閉 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
小測:

二、基于規則的匹配
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加上[ ],參考官方文檔的栗子:

# 使用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】使用運算符和量詞
可以規定匹配的次數:

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小時內刪除侵權內容。