自然語言處理(1) 詞彙標註

2021-09-03 01:20:08 字數 4952 閱讀 8160

如何進行詞彙標註呢?首先進行資料預處理,例如如果給定的是句子,先要對句子進行分割;最簡單的標註器,可以給定詞彙使用得最頻繁的詞性作為標註器中該詞彙的詞性,但是由於詞彙存在二義性,使得這種標註準確度受限,通過上下文語境,可以在一定程度上解決這個問題,可以採用n-gram標註器,此外,brill標註器具有修正功能。

為了使python的中文注釋正確,必須在開頭加上一句**

# -*- coding: utf-8 -*-

# 這個編碼轉換必須放在第一行,否則中文注釋會報錯

將詞彙按它們的詞性(parts-of-speech,pos)分類以及相應的標註它們的過程被稱為詞性標註(part-of-speech tagging, pos tagging)。

利用nltp,可以比較方便地進行詞性標註。

為了對詞彙進行標註,我們需要把句子進行分割,之後可以使用nltk的詞性標註器進行標註。

# 使用詞性標註器

text=nltk.word_tokenize("and now for something completely different")

nltk.pos_tag(text)

nltk中對資料進行預處理

# str2tuple()從表示乙個已標註的識別符號的標準字串建立乙個這樣的特殊元組

tagged_token=nltk.tag.str2tuple('fly/nn')

# text.similar()方法為乙個詞w 找出所有上下文w1ww2,然後找出所有出現在相同上下文中的詞w',即w1w'w2

text=nltk.text(word.lower() for word in nltk.corpus.brown.words())

text.similar('woman')

# 讀取已標註語料庫

# 常用語料庫 brown, nps_chat, conll2000, treebank,

nltk.corpus.brown.tagged_words()

from nltk.corpus import brown

brown_news_tagged=brown.tagged_words(categories='news')

tag_fd=nltk.freqdist(tag for (word, tag) in brown_news_tagged)

tag_fd.keys()[:5]

# 找出最頻繁的名詞標記

def findtags(tag_prefix, tagged_text):

cfd=nltk.conditionalfreqdist((tag,word) for (word,tag) in tagged_text

if tag.startswith(tag_prefix))

return dict((tag, cfd[tag].keys()[:5]) for tag in cfd.conditions())

# 檢視跟在ofen後的詞彙

brown_learned_text=nltk.corpus.brown.words(categories='learned')

sorted(set(b for(a,b) in nltk.bigrams(brown_learned_text) if a=='often'))

# 使用pos標記尋找三詞短語

from nltk.corpus import brown

def process(sentence):

for (w1,t1),(w2,t2),(w3,t3) in nltk.trigrams(sentence):

if (t1.startswith('v') and t2=='to' and t3.startswith('v')):

print w1,w2,w3

# 檢視標記模糊的詞

brown_news_tagged = brown.tagged_words(categories='news')

data=nltk.conditionalfreqdist((word.lower(),tag) for (word,tag) in brown_news_tagged)

for word in data.conditions():

if len(data[word])>=3:

tags=data[word].keys()

print word,' '.join(tags)

'''使用python字典對映詞及其屬性 pos['鍵']='值',字典不是序列,鍵沒有固定順序,

定義字典:pos=或pos=dict(a='a',b='b')

使用for迴圈遍歷字典中的鍵:for word in sorte(dict)

字典的鍵必須是不可改變的型別,如字串或元組

'''# 遞增的更新字典

counts=nltk.defaultdict(int)

from nltk.corpus import brown

for (word,tag) in brown.tagged_words(categories='news'):

counts[tag]+=1

from operator import itemgetter

sorted(counts.items(), key=itemgetter(1),reverse=true) #按照值遞減排序

# 如果經常用到反向查詢,可以建立乙個值到鍵的字典

標註器   二義性限制了標註器的上限,上下文可以解決歧義問題

n-gram標註 利用了上下文中的詞作為特徵,有點像開環的,沒有反饋

brill標註 歸納標註法 猜測每個詞的標註,然後返回和修復錯誤,有點像閉環,有返回,不對修正錯誤

# nltk資料載入

from nltk.corpus. import brown

brown_tagged_sents=brown.tagged_sents(categories='news') #載入已標註句子

brown_sents=brown.sents(categories='news') #載入句子

# 正規表示式標註器

patterns=[

(r'.*ing$','vbg'),

(r'.*ed&','vbd'),

(r'.*es$','vbz'),

(r'.*ould$', 'md'),

(r'.*\'s$', 'nn$'),

(r'.*s$', 'nns'),

(r'^-?[0-9]+(.[0-9]+)?$', 'cd'),

(r'.*', 'nn')

]regexp_tagger=nltk.regexptagger(patterns)

regexp_tagger.tag(brown_sents[3])

#查詢標註器

fd = nltk.freqdist(brown.words(categories='news')) #詞彙的頻率統計

cfd = nltk.conditionalfreqdist(brown.tagged_words(categories='news')) #詞彙的條件分布,該詞的詞性的統計

most_freq_words = fd.keys()[:100] #前100個高頻詞

likely_tags = dict((word, cfd[word].max()) for word in most_freq_words) #前100個高頻詞,以及高頻詞的最可能的詞性標註

baseline_tagger = nltk.unigramtagger(model=likely_tags)

# 回退

baseline_tagger = nltk.unigramtagger(model=likely_tags, backoff=nltk.defaulttagger('nn'))

# n-gram標註

from nltk.corpus import brown

brown_tagged_sents = brown.tagged_sents(categories='news')

brown_sents = brown.sents(categories='news')

unigram_tagger = nltk.unigramtagger(brown_tagged_sents) # 通過已經標註的句子訓練乙個一元標註器

unigram_tagger.tag(brown_sents[2007]) # 使用這個一元標註器標註未進行標註的句子

bigram_tagger.evaluate(test_sents) # 用於評估

# 組合標註器:解決精度和覆蓋範圍的乙個權衡辦法

t0=nltk.defaulttagger('nn')

t1=nltk.unigramtagger(train_sents,backoff=t0)

t2=nltk.bigramtagger(train_sents,backoff=t1)

t2.evaluate(test_sents) # 先呼叫t2的bigram標註器標註,找不到就嘗試t1,再不行就用預設標註器t0

nltk.bigramtagger(sents,cutoff=2,backoff=t1) # 丟棄只出現一兩次的上下文

# 儲存標註器給以後使用

from cpickle import dump

output=open('t2.pkl','wb')

dump(t2,output,-1) #將t2標註器寫到output,可以用方法的形式 p=cpickle.dump(t2)

output.close()

from cpickle import load

input=open('t2.pkl','rb')

tagger=load(input)

# brill標註器演示 基於轉換的標註學習一系列「改變標記s 為標記t 在上下文c 中」形式的修復規則

nltk.tag.brill.demo()

一直以來都沒有寫部落格的習慣,從今天開始,要改變自己。

統計自然語言處理(詞彙獲取)

詞彙獲取的一般目的,通過考察大型文字語料庫中詞彙出現的模式,設計一種演算法和統計技術來填補現有電子詞典的不足。在自然語言中我們感興趣的大部分詞的特性並沒有被收錄到電子詞典中,自然語言的新詞和舊詞新用法總是層出不窮,即使我們編輯了現有所有存在的詞彙,過幾天也會有新的出現,所以詞彙獲取在自然語言中則顯得...

自然語言處理之詞性標註

詞性標註作為nlp領域的一項基本任務,其與分詞任務同等重要,是很多任務的基礎,比如句法分析,命名實體識別等。命名實體識別在一定程度上也屬於標註任務,不過,難度相比一般的詞性標註而言,上公升了不少。對於詞性標註而言,不論是中文還是英文,其難點在於對於不同的語境,詞性的多變化 另一方面,隨著社會的發展,...

自然語言處理 詞性標註(北大,賓州)

詞性標註在中文領域暫無統一的標註標準,最常見較為主流的是北大和賓州詞性標註集。詞性編碼 詞性名稱 註解ag 形語素形容詞語素。形容詞 為a,語素 為g前面置以a a形容詞 取英語形容詞adjective的第1個字母 ad副形詞 直接作狀語的形容詞。形容詞 a和副詞 d並在一起 an名形詞 具有名詞功...