0420學習筆記(NLTK繼續)

2021-10-05 06:14:20 字數 4374 閱讀 6377

情感分析:打分

例項1

利用af111.txt打分

sentiment_dictionary=

for line in

open

('data/afinn-111.txt'):

word, score = line.split(

'\t'

) sentiment_dictionary[word]

=int

(score)

words=

"i love you"

import nltk

word_list=nltk.word_tokenize(words)

total_score =

sum(sentiment_dictionary.get(word,0)

for word in word_list)

print

(total_score)

結果:

3例項2

nltk頻率統計

import nltk

from nltk import freqdist

# 做個詞庫先

corpus =

'this is my sentence ' \

'this is my life ' \

'this is the day'

# 隨便tokenize⼀下,顯然, 正如上⽂提到,這⾥可以根據需要做任何的preprocessing:stopwords, lemma, stemming, etc.

tokens = nltk.word_tokenize(corpus)

print

(tokens)

# 得到token好的word list['this', 'is', 'my', 'sentence','this', 'is', 'my', 'life', 'this','is', 'the', 'day']借用nltk的freqdist統計⼀下⽂字出現的頻率

fdist = freqdist(tokens)

# 它就類似於乙個dict,帶上某個單詞, 可以看到它在整個⽂章**現的次數

print

(fdist[

'is'])

# 3# 此刻, 我們可以把最常用的50個單詞拿出來

standard_freq_vector = fdist.most_common(50)

size =

len(standard_freq_vector)

print

(standard_freq_vector)

# [('is', 3), ('this', 3), ('my', 2),('the', 1), ('day', 1), ('sentence', 1),('life', 1)

# func: 按照出現頻率⼤小, 記錄下每⼀個單詞的位置

defposition_lookup

(v):

res =

counter =

0for word in v:

res[word[0]

]= counter

counter +=

1return res

# 把標準的單詞位置記錄下來

standard_position_dict = position_lookup(standard_freq_vector)

print

(standard_position_dict)

# 得到⼀乙個位置對照表

# 這時, 如果我們有個新句子:

sentence =

'this is cool'

# 先新建⼀個跟我們的標準vector同樣⼤小的向量

freq_vector =[0

]* size

# 簡單的preprocessing

tokens = nltk.word_tokenize(sentence)

# 對於這個新句子⾥的每乙個單詞

for word in tokens:

try:

# 如果在我們的詞庫⾥出現過

# 那麼就在"標準位置"上+1

freq_vector[standard_position_dict[word]]+=

1except keyerror:

# 如果是個新詞

# 就pass掉

continue

print

(freq_vector)

# [1, 1, 0, 0, 0, 0, 0]

# 第⼀個位置代表 this, 出現了一次

# 第⼆個位置代表 is, 出現了一次

# 後⾯面都⽊有

結果:

[『this』, 『is』, 『my』, 『sentence』, 『this』, 『is』, 『my』, 『life』, 『this』, 『is』, 『the』, 『day』]

3[(『this』, 3), (『is』, 3), (『my』, 2), (『sentence』, 1), (『life』, 1), (『the』, 1), (『day』, 1)]

[1, 1, 0, 0, 0, 0, 0]

例項3

利用nltk計算tf-idf值

tf: term frequency, 衡量⼀個term在⽂檔**現得有多頻繁。

tf(t) = (t出現在⽂檔中的次數) / (⽂檔中的term總數).

idf: inverse document frequency, 衡量⼀個term有多重要。

有些詞出現的很多,但是明顯沒用。

idf(t) = log_e(⽂檔總數 / 含有t的⽂檔總數).

import nltk

from nltk import freqdist

from nltk.text import textcollection

# ⾸先, 把所有的文件放到textcollection類中。這個類會⾃自動幫你斷句, 做統計, 做計算

sents=

['this is sentence one'

,'this is sentence two'

,'this is sentence three'

]sents=

[nltk.word_tokenize(sent)

for sent in sents]

#對每個句子進行分詞

corpus=textcollection(sents)

# 直接就能算出tf-idf

# (term: ⼀句句話中的某個term, text: 這句話)

print

(corpus.tf(

'one'

, corpus)

)print

(corpus.idf(

'one'))

print

(corpus.tf_idf(

'one'

,corpus)

)# 同理理, 怎麼得到⼀個標準⼤小的vector來表示所有的句子?

# 對於每個新句子

new_sentence =

'this is sentence five'

fdist = freqdist(corpus)

standard_freq_vector = fdist.most_common(50)

print

(standard_freq_vector)

standard_vocab =

for i in standard_freq_vector:0]

)# 遍歷⼀遍所有的vocabulary中的詞:

for word in standard_vocab:

print

(word)

print

(corpus.tf_idf(word, corpus)

)# 我們會得到乙個巨⻓(=所有vocab長度)的向量

結果:

0.08333333333333333 #tf

1.0986122886681098 #idf

0.0915510240556758 #tf-idf

[(『this』, 3), (『is』, 3), (『sentence』, 3), (『one』, 1), (『two』, 1), (『three』, 1)]

this

0.0is

0.0sentence

0.0one

0.0915510240556758

two0.0915510240556758

three

0.0915510240556758

沒出現過的tf為0,全出現的idf為0

NLTK學習筆記

學習參考書 nltk.set proxy com 80 nltk.download 2.使用sents fileid 函式時候出現 resource tokenizers punkt english.pickle not found.please use the nltk to obtain the...

NLTK學習筆記

學習參考書 nltk.set proxy com 80 nltk.download 2.使用sents fileid 函式時候出現 resource tokenizers punkt english.pickle not found.please use the nltk to obtain the...

NLTK學習筆記

學習參考書 nltk.set proxy com 80 nltk.download 2.使用sents fileid 函式時候出現 resource tokenizers punkt english.pickle not found.please use the nltk to obtain the...