2013-08-07 36 views
2

我在學習Python,並試圖用它來執行情感分析。我正在關注這個鏈接的在線教程:http://www.alex-hanna.com/tworkshops/lesson-6-basic-sentiment-analysis/。我已經採取了一段代碼作爲映射器類,摘錄其中的是這樣的:這是什麼字典任務在做什麼?

sentimentDict = { 
    'positive': {}, 
    'negative': {} 
} 

def loadSentiment(): 
    with open('Sentiment/positive_words.txt', 'r') as f: 
     for line in f: 
      sentimentDict['positive'][line.strip()] = 1 

    with open('Sentiment/negative_words.txt', 'r') as f: 
     for line in f: 
      sentimentDict['negative'][line.strip()] = 1 

在這裏,我可以看到,新的字典與兩個按鍵,正面和負面的,但沒有價值創造。

接下來,打開兩個文本文件,每行都被剝離並映射到字典。

但是,= 1部分是什麼?這是爲什麼需要(如果它不是怎麼會被刪除?)

回答

7

該循環創建一個嵌套字典,並將所有值設置爲1,大概是然後只使用鍵作爲一種方式來清除重複的值。

你可以使用組代替,避免= 1值:

sentimentDict = {} 

def loadSentiment(): 
    with open('Sentiment/positive_words.txt', 'r') as f: 
     sentimentDict['positive'] = {line.strip() for line in f} 

    with open('Sentiment/negative_words.txt', 'r') as f: 
     sentimentDict['negative'] = {line.strip() for line in f} 

注意,你甚至不需要創建初始字典;你可以用一個語句,一個集合理解來創建整個集合。

如果其他代碼依靠字典的價值觀被設置爲1(也許是爲了更新在後一階段計數),這將會是更好的性能,使用dict.fromkeys()類方法代替:

sentimentDict = {} 

def loadSentiment(): 
    with open('Sentiment/positive_words.txt', 'r') as f: 
     sentimentDict['positive'] = dict.fromkeys((line.strip() for line in f), 1) 

    with open('Sentiment/negative_words.txt', 'r') as f: 
     sentimentDict['negative'] = dict.fromkeys((line.strip() for line in f), 1) 

然而,看看您的source blog article卻表明字典僅用於對按鍵進行成員資格測試,因此在此處使用集對於引導的其他代碼要好得多並且透明。

+0

感謝您的支持。我最喜歡這個答案。如果僅僅是爲了避免重複的值,一套顯然是繼續進行的合乎邏輯的方式。 –

1

這是創建字典的字典,所以sentimentDict['negative'][/something/] = 1大概會創建一個字典,看起來像這樣*:

sentimentDict : {'negative' : { 'some_word' : 1, 'some_other_word' : 1, etc. }} 

值來自line.strip(),這可能會產生一個正面和負面的單詞列表。每個單詞分別成爲'負面'和'正面'字符串中的一個關鍵字(它們應該是不同的文件,並生成不同的列表),每個單詞的值爲1.這樣,您可以輕鬆地運行文件,取文件中的每個字,然後將其插入到你的字典,並添加了結果:

sentiment_count = 0 
for word in some_file: 
    if word in sentimentDict['negative'].keys(): 
     sentiment_count += sentimentDict['negative'][word] 
    etc. 

ONE MORE編輯 的Martijn有答案。我誤讀strip()split()(我的一個常見錯誤)。

+0

我假設,因爲這是一個基本的積極/消極情緒分析,如果每個單詞都有一個值,他們可以根據需要添加或減去以獲得情感評分。謝謝! –

+0

啊。這把我扔了。我想通過split()來獲取每一行的所有單詞。 – erewok

+0

請注意,如果word中的sentimentDict ['negative']'在Python 2中工作**好得多**,因爲'.keys()'返回一個列表,迫使您搜索該列表(O(n)性能)與只是測試詞典的成員身份(O(1)常量表達)。 –

2

問題是,這是一個嵌套字典。 sentimentDict是一本字典,而sentimentDict['positive']sentimentDict['negative']也是字典。

loadSentiment()函數中,這些內部字典會填充項目。字是鑰匙,值總是1

所以你得到的東西是這樣的:

{'negative': {'bad': 1, 
       'disgusting': 1, 
       'horrible': 1}, 
'positive': {'amazing': 1, 
       'awesome': 1, 
       'cool': 1}} 

我的關於價值1的含義的猜測是,這些字典只是初始化這裏,後來這些數可增至表示較強或較弱的情緒。

+0

嘎,打我20秒。+ 1 – wflynny

+0

看看鏈接的代碼 - 數值既不會被讀取也不會被改變。只是用作一套。 –

+0

@ w.m這段代碼似乎是教程的一部分。所以我不知道這位「老師」是不是想簡單地開始創建一個稍後會被修改的結構,或者他/她只是選擇了一個不恰當的數據結構。 –

0

從你給的鏈接http://www.alex-hanna.com/tworkshops/lesson-6-basic-sentiment-analysis/的代碼,它是存儲1只是作爲一個字典鍵的值

這個詞本身的佔位符是關鍵,它的值(= 1)不顯著。

更好的方法是有一個集或簡單列表的字典,而不是鏈接顯示的詞典字典。

+0

在列表中查找應該是O(n)而不是O(1)在一個詞典集或詞典中進行搜索。 –

+0

@Sukrit Kalra正確 - 列出它需要O(n)。然而,在這種情況下,一個集合就足夠了(集合具有O(1)時間的分期查找順序) – Anshul