1. 程式人生 > 其它 >如何預先處理電影評論資料以進行情感分析

如何預先處理電影評論資料以進行情感分析

對於不同的問題,文字資料的預先處理是不同的。

處理工作從簡單的幾步開始,例如載入資料。但是由於對您正在研究的資料的特定清理任務,這種預處理很快變得困難起來。在從何處開始,按什麼順序執行將原始資料轉化成建模資料的步驟這種問題上,您需要幫助。

在本教程中,您將逐步瞭解如何為情感分析預先處理電影評論的文字資料。

完成本教程後,您將知道:

  • 如何載入文字資料並清除其中的標點符號和其他非文字內容。
  • 如何開發詞彙表,定製詞彙表,並將其儲存到檔案中。
  • 如何使用預先定義的詞彙表和清理文字的技巧來預處理電影評論,並將其儲存到可供建模的新檔案中。

讓我們開始吧。

  • 2017年10月更新:修正了當跳過不匹配檔案時出現的小bug,謝謝Jan Zett。
  • 更新2017年12月:修正了一個示例中的小錯字,感謝Ray和Zain。
電影院的吃瓜群眾

如何預先處理電影評論資料以進行情感分析 照片由Kenneth Lu提供,保留某些權利。

教程概覽

本教程分為5個部分; 他們是:

  1. 電影評論資料集
  2. 載入文字資料
  3. 清理文字資料
  4. 開發詞彙表
  5. 儲存預處理好的資料

需要有關文字資料深度學習的幫助?

這是我7天的臨時郵箱(附帶例項程式碼)

點選登陸,同時得到一份該教程的PDF文字

https://machinelearningmastery.lpages.co/leadbox/144855173f72a2%3A164f8be4f346dc/5655638436741120/

1.電影評論資料集

“電影評論資料”是由彭博和李莉蓮於21世紀初從imdb.com網站上收集的電影評論。這些評論被收集並作為自然語言處理研究的一部分提供。

評論最初是在2002年釋出的,但2004年釋出了一個更新和清理後的版本,即“ v2.0 ”。

該資料集由IMDB擁有的rec.arts.movi​​es.reviews新聞組檔案中的1,000個正面和1,000個負面評論組成。作者將這個資料集稱為“ 極性資料集 ”。

我們的資料包含1000個正面評論和1000個負面評論,均在2002年以前編寫完成。大約每個類別下,每個作者平均有20篇評論(共312位作者)。我們將這個語料庫稱為極性資料集。

- 情感教育:基於最小分割的主觀性總結的情感分析

,2004。

資料已經被一定程度上清理了,例如:

  • 資料集僅包含英文評論。
  • 所有的文字都被轉換成了小寫。
  • 標點符號(例如句號,逗號,括號等)周圍都有空格
  • 文字每行被分成一個句子。

這些資料已被用於一些相關的自然語言處理任務。對於分類任務,經典模型(如支援向量機)的資料效能在70%到80%(例如78%到82%)的範圍內。

通過10倍交叉驗證,更復雜的資料預處理可能會得到高達86%的結果。如果我們希望在現代方法的實驗中使用這個資料集,那麼我們就需要知道一個80年代中期的概念。

... ...取決於下游極性分類器的選擇,我們可以實現顯著的,高度統計意義上的改善(從82.8%至86.4%)

- 情感教育:基於最小分割的主觀性總結的情感分析,2004。

你可以從這裡下載資料集:

解壓檔案後,你將會得到一個名為“ txt_sentoken ”的目錄,其中有兩個子目錄,分別是負面和正面評論。目錄名為“ neg ”和“ pos ”。每條正面和負面評論都分別儲存在一個檔案裡,檔案命名約定為 cv000cv999

接下來,讓我們看看如何載入文字資料。

2.載入文字資料

在本節中,我們將著眼於先載入單個文字檔案,然後處理檔案的目錄。

我們假定評論資料被下載到當前的工作目錄“txt_sentoken"中

我們可以通過開啟它,讀取ASCII文字並關閉檔案來載入單個文字檔案。這是標準的檔案處理流程。例如,我們可以載入第一個負面評論檔案“ cv000_29416.txt ”,如下所示:

# load one file
filename = 'txt_sentoken/neg/cv000_29416.txt'
# open the file as read only
file = open(filename, 'r')
# read all text
text = file.read()
# close the file
file.close()

這將文件載入為ASCII並保留任何空白,如新行。

我們可以把它變成一個名為load_doc()的函式,它接受文件的檔名來載入並返回文字。

# load one file
filename = 'txt_sentoken/neg/cv000_29416.txt'
# open the file as read only
file = open(filename, 'r')
# read all text
text = file.read()
# close the file
file.close()

我們有兩個目錄,每個目錄有1000個檔案。我們可以依次處理每個目錄,首先使用listdir()函式獲取目錄中的檔案列表,然後依次載入每個檔案。

例如,實際上我們可以使用load_doc()函式來載入負面評論目錄中的每個文件。

from os import listdi
 
# load doc into memory
def load_doc(filename):
    # open the file as read only
    file = open(filename, 'r')
    # read all text
    text = file.read()
    # close the file
    file.close()
    return text
 
# specify directory to load
directory = 'txt_sentoken/neg'
# walk through all files in the folde
for filename in listdir(directory):
    # skip files that do not have the right extension
    if not filename.endswith(".txt"):
        continue
    # create the full path of the file to open
    path = directory + '/' + filename
    # load document
    doc = load_doc(path)
    print('Loaded %s' % filename)

執行此示例,列印每個載入後評論的檔名。

...
Loaded cv995_23113.txt
Loaded cv996_12447.txt
Loaded cv997_5152.txt
Loaded cv998_15691.txt
Loaded cv999_14636.txt

我們可以將文件的處理做成一個函式,稍後將其用作模板來開發一個函式來清理資料夾中的所有文件。例如,下面我們定義一個process_docs()函式來做同樣的事情。

from os import listdi
 
# load doc into memory
def load_doc(filename):
    # open the file as read only
    file = open(filename, 'r')
    # read all text
    text = file.read()
    # close the file
    file.close()
    return text
 
# load all docs in a directory
def process_docs(directory):
    # walk through all files in the folde
    for filename in listdir(directory):
        # skip files that do not have the right extension
        if not filename.endswith(".txt"):
            continue
        # create the full path of the file to open
        path = directory + '/' + filename
        # load document
        doc = load_doc(path)
        print('Loaded %s' % filename)
 
# specify directory to load
directory = 'txt_sentoken/neg'
process_docs(directory)

現在我們知道如何載入電影評論文字資料,讓我們看看如何清理它。

3.清理文字資料

在本節中,我們將看看我們可能想要對哪些電影評論資料進行資料清理。

我們將假設我們使用一個詞袋模型或者一個嵌入的詞,所以不需要太多的預處理。

拆分為標符

首先,我們載入一個檔案,看看由空格分割的原始標符。我們將使用前一節中開發的load_doc()函式。我們可以使用split()函式將載入的文件分割成由空格分隔的標符。

# load doc into memory
def load_doc(filename):
    # open the file as read only
    file = open(filename, 'r')
    # read all text
    text = file.read()
    # close the file
    file.close()
    return text
 
# load the document
filename = 'txt_sentoken/neg/cv000_29416.txt'
text = load_doc(filename)
# split into tokens by white space
tokens = text.split()
print(tokens)

執行這個例子.就得到了一個來自文件的,很好的原始標符的長列表。

 'years', 'ago', 'and', 'has', 'been', 'sitting', 'on', 'the', 'shelves', 'ever', 'since', '.', 'whatever', '.', '.', '.', 'skip', 'it', '!', "where's", 'joblo', 'coming', 'from', '?', 'a', 'nightmare', 'of', 'elm', 'street', '3', '(', '7/10', ')', '-', 'blair', 'witch', '2', '(', '7/10', ')', '-', 'the', 'crow', '(', '9/10', ')', '-', 'the', 'crow', ':', 'salvation', '(', '4/10', ')', '-', 'lost', 'highway', '(', '10/10', ')', '-', 'memento', '(', '10/10', ')', '-', 'the', 'others', '(', '9/10', ')', '-', 'stir', 'of', 'echoes', '(', '8/10', ')']

只要看一下這些原始標符,我們就能得到很多可以嘗試的想法,比如:

  • 從單詞中刪除標點符號(例如,“what's”)。
  • 刪除僅僅是標點符號的標符(例如' - ')。
  • 刪除包含數字的標符(例如'10 / 10')。
  • 刪除只有一個字元的標符(例如'a')。
  • 刪除沒有太多意義的標符(例如'and')

一些想法:

  • 我們可以使用字串translate()函式從標符中過濾掉標點符號。
  • 我們可以通過在每個標符上使用isalpha()函式來檢查和移除標點符號或包含數字的標符。
  • 我們可以利用NLTK載入列表來刪除英文停用詞。
  • 我們可以通過檢查標符的長度來過濾掉太短的標符。

以下是用於清理評論程式碼的更新版本。

from nltk.corpus import stopwords
import string
 
# load doc into memory
def load_doc(filename):
    # open the file as read only
    file = open(filename, 'r')
    # read all text
    text = file.read()
    # close the file
    file.close()
    return text
 
# load the document
filename = 'txt_sentoken/neg/cv000_29416.txt'
text = load_doc(filename)
# split into tokens by white space
tokens = text.split()
# remove punctuation from each token
table = str.maketrans('', '', string.punctuation)
tokens = [w.translate(table) for w in tokens]
# remove remaining tokens that are not alphabetic
tokens = [word for word in tokens if word.isalpha()]
# filter out stop words
stop_words = set(stopwords.words('english'))
tokens = [w for w in tokens if not w in stop_words]
# filter out short tokens
tokens = [word for word in tokens if len(word) > 1]
print(tokens)

執行這個例子,得到了一個更清晰的標符列表

 'explanation', 'craziness', 'came', 'oh', 'way', 'horror', 'teen', 'slasher', 'flick', 'packaged', 'look', 'way', 'someone', 'apparently', 'assuming', 'genre', 'still', 'hot', 'kids', 'also', 'wrapped', 'production', 'two', 'years', 'ago', 'sitting', 'shelves', 'ever', 'since', 'whatever', 'skip', 'wheres', 'joblo', 'coming', 'nightmare', 'elm', 'street', 'blair', 'witch', 'crow', 'crow', 'salvation', 'lost', 'highway', 'memento', 'others', 'stir', 'echoes']

我們可以把它送進一個名為clean_doc()的函式中,並在另一個積極的評論中進行測試。

from nltk.corpus import stopwords
import string
 
# load doc into memory
def load_doc(filename):
    # open the file as read only
    file = open(filename, 'r')
    # read all text
    text = file.read()
    # close the file
    file.close()
    return text
 
# turn a doc into clean tokens
def clean_doc(doc):
    # split into tokens by white space
    tokens = doc.split()
    # remove punctuation from each token
    table = str.maketrans('', '', string.punctuation)
    tokens = [w.translate(table) for w in tokens]
    # remove remaining tokens that are not alphabetic
    tokens = [word for word in tokens if word.isalpha()]
    # filter out stop words
    stop_words = set(stopwords.words('english'))
    tokens = [w for w in tokens if not w in stop_words]
    # filter out short tokens
    tokens = [word for word in tokens if len(word) > 1]
    return tokens
 
# load the document
filename = 'txt_sentoken/pos/cv000_29590.txt'
text = load_doc(filename)
tokens = clean_doc(

再次,清理程式似乎產生了一套很好的標符,至少作為第一次清理是足夠好的。

 'comic', 'oscar', 'winner', 'martin', 'childs', 'shakespeare', 'love', 'production', 'design', 'turns', 'original', 'prague', 'surroundings', 'one', 'creepy', 'place', 'even', 'acting', 'hell', 'solid', 'dreamy', 'depp', 'turning', 'typically', 'strong', 'performance', 'deftly', 'handling', 'british', 'accent', 'ians', 'holm', 'joe', 'goulds', 'secret', 'richardson', 'dalmatians', 'log', 'great', 'supporting', 'roles', 'big', 'surprise', 'graham', 'cringed', 'first', 'time', 'opened', 'mouth', 'imagining', 'attempt', 'irish', 'accent', 'actually', 'wasnt', 'half', 'bad', 'film', 'however', 'good', 'strong', 'violencegore', 'sexuality', 'language', 'drug', 'content']
 

還有更多的清理步驟我們可以進行,我把它們留給你去想象。

接下來,我們來看看如何管理標符的首選詞彙表。

4.開發詞彙表

在處理文字的預測模型,如詞袋模型時,要減小詞彙表的規模是不太容易的。

詞彙表越大,每個單詞或文件的代表的內容就越少。

為情感分析預處理文字工作的一部分,包括定義和定製模型支援詞彙的詞彙表。

我們可以通過載入資料集中的所有文件並構建一組單詞來實現這一點。我們可能決定支援所有這些單詞,也許放棄一些單詞。然後可以將最終選中的詞彙表儲存到檔案中供以後呼叫,例如將來在新文件中過濾單詞。

我們可以跟蹤計數器中的詞彙表,計數器是一個單詞與其計數的詞典,再加上一些額外的便利功能。

我們需要開發一個新的函式來處理一個文件並將其新增到詞彙表中。該函式需要通過呼叫之前開發的load_doc()函式來載入文件。它需要使用先前開發的clean_doc()函式來清理載入的文件,然後它需要將所有的標符新增到計數器,並更新計數。我們可以通過呼叫counter物件上的update()函式來完成這最後一步。

下面是一個名為add_doc_to_vocab()的函式,它將文件檔名和計數器詞彙表作為引數。

# load doc and add to vocab
def add_doc_to_vocab(filename, vocab):
    # load doc
    doc = load_doc(filename)
    # clean doc
    tokens = clean_doc(doc)
    # update counts
    vocab.update(tokens)

最後,我們可以使用上面的模板來處理名為process_docs()的目錄中的所有文件,並更新它以呼叫add_doc_to_vocab()

# load all docs in a directory
def process_docs(directory, vocab):
    # walk through all files in the folde
    for filename in listdir(directory):
        # skip files that do not have the right extension
        if not filename.endswith(".txt"):
            continue
        # create the full path of the file to open
        path = directory + '/' + filename
        # add doc to vocab
        add_doc_to_vocab(path, vocab)

我們可以將所有這些放在一起,並利用資料集中的所有文件開發出完整的詞彙表。

from string import punctuation
from os import listdi
from collections import Counte
from nltk.corpus import stopwords
 
# load doc into memory
def load_doc(filename):
    # open the file as read only
    file = open(filename, 'r')
    # read all text
    text = file.read()
    # close the file
    file.close()
    return text
 
# turn a doc into clean tokens
def clean_doc(doc):
    # split into tokens by white space
    tokens = doc.split()
    # remove punctuation from each token
    table = str.maketrans('', '', punctuation)
    tokens = [w.translate(table) for w in tokens]
    # remove remaining tokens that are not alphabetic
    tokens = [word for word in tokens if word.isalpha()]
    # filter out stop words
    stop_words = set(stopwords.words('english'))
    tokens = [w for w in tokens if not w in stop_words]
    # filter out short tokens
    tokens = [word for word in tokens if len(word) > 1]
    return tokens
 
# load doc and add to vocab
def add_doc_to_vocab(filename, vocab):
    # load doc
    doc = load_doc(filename)
    # clean doc
    tokens = clean_doc(doc)
    # update counts
    vocab.update(tokens)
 
# load all docs in a directory
def process_docs(directory, vocab):
    # walk through all files in the folde
    for filename in listdir(directory):
        # skip files that do not have the right extension
        if not filename.endswith(".txt"):
            continue
        # create the full path of the file to open
        path = directory + '/' + filename
        # add doc to vocab
        add_doc_to_vocab(path, vocab)
 
# define vocab
vocab = Counter()
# add all docs to vocab
process_docs('txt_sentoken/neg', vocab)
process_docs('txt_sentoken/pos', vocab)
# print the size of the vocab
print(len(vocab))
# print the top words in the vocab
print(vocab.most_common(50))

執行示例將建立包含資料集中所有文件的詞彙表,包括正面和負面的評論。

可以看到,所有的評論中總共有超過46,000個獨特的單詞,排名前三的單詞是“ film ”,“ one ”和“ movie ”。

 46557
[('film', 8860), ('one', 5521), ('movie', 5440), ('like', 3553), ('even', 2555), ('good', 2320), ('time', 2283), ('story', 2118), ('films', 2102), ('would', 2042), ('much', 2024), ('also', 1965), ('characters', 1947), ('get', 1921), ('character', 1906), ('two', 1825), ('first', 1768), ('see', 1730), ('well', 1694), ('way', 1668), ('make', 1590), ('really', 1563), ('little', 1491), ('life', 1472), ('plot', 1451), ('people', 1420), ('movies', 1416), ('could', 1395), ('bad', 1374), ('scene', 1373), ('never', 1364), ('best', 1301), ('new', 1277), ('many', 1268), ('doesnt', 1267), ('man', 1266), ('scenes', 1265), ('dont', 1210), ('know', 1207), ('hes', 1150), ('great', 1141), ('another', 1111), ('love', 1089), ('action', 1078), ('go', 1075), ('us', 1065), ('director', 1056), ('something', 1048), ('end', 1047), ('still', 1038)]

也許最不常用的詞,那些在所有評論中只出現一次的詞,都是不可預測的。也許一些最常用的詞語也沒用。

這些都是很好的問題,應該用一個特定的預測模型進行測試。

一般而言,在2,000條評論中只出現一次或幾次的詞語很可能不具有預測性,可以從詞彙表中刪除,這大大減少了我們需要建模的標符數量。

我們可以通過單詞及其計數來進行篩選,只有在計數高於所選閾值的情況下才進行建模。這裡我們將把計數闕值設定為5次

# keep tokens with > 5 occurrence
min_occurane = 5
tokens = [k for k,c in vocab.items() if c >= min_occurane]
print(len(tokens))

這將詞彙量從46557個減少到14803個,大幅下降。也許最少有五次是過於激進的; 你可以嘗試不同的值。

然後,我們可以將所選單詞的詞彙儲存到一個新檔案中。我喜歡將詞彙表儲存為ASCII碼,每行一個單詞

下面定義了一個名為save_list()的函式,用於儲存專案列表,如此,可以儲存標符到檔案,每行一個。

def save_list(lines, filename):
    data = 'n'.join(lines)
    file = open(filename, 'w')
    file.write(data)
    file.close()

下面展示了定義和儲存詞彙的完整示例。

from string import punctuation
from os import listdi
from collections import Counte
from nltk.corpus import stopwords
 
# load doc into memory
def load_doc(filename):
    # open the file as read only
    file = open(filename, 'r')
    # read all text
    text = file.read()
    # close the file
    file.close()
    return text
 
# turn a doc into clean tokens
def clean_doc(doc):
    # split into tokens by white space
    tokens = doc.split()
    # remove punctuation from each token
    table = str.maketrans('', '', punctuation)
    tokens = [w.translate(table) for w in tokens]
    # remove remaining tokens that are not alphabetic
    tokens = [word for word in tokens if word.isalpha()]
    # filter out stop words
    stop_words = set(stopwords.words('english'))
    tokens = [w for w in tokens if not w in stop_words]
    # filter out short tokens
    tokens = [word for word in tokens if len(word) > 1]
    return tokens
 
# load doc and add to vocab
def add_doc_to_vocab(filename, vocab):
    # load doc
    doc = load_doc(filename)
    # clean doc
    tokens = clean_doc(doc)
    # update counts
    vocab.update(tokens)
 
# load all docs in a directory
def process_docs(directory, vocab):
    # walk through all files in the folde
    for filename in listdir(directory):
        # skip files that do not have the right extension
        if not filename.endswith(".txt"):
            continue
        # create the full path of the file to open
        path = directory + '/' + filename
        # add doc to vocab
        add_doc_to_vocab(path, vocab)
 
# save list to file
def save_list(lines, filename):
    data = 'n'.join(lines)
    file = open(filename, 'w')
    file.write(data)
    file.close()
 
# define vocab
vocab = Counter()
# add all docs to vocab
process_docs('txt_sentoken/neg', vocab)
process_docs('txt_sentoken/pos', vocab)
# print the size of the vocab
print(len(vocab))
# print the top words in the vocab
print(vocab.most_common(50))
# keep tokens with > 5 occurrence
min_occurane = 5
tokens = [k for k,c in vocab.items() if c >= min_occurane]
print(len(tokens))
# save tokens to a vocabulary file
save_list(tokens, 'vocab.txt')

在建立詞彙表後執行最後這個的模組,將會儲存所選擇的單詞到檔案裡去。

檢視,甚至學習你選擇的詞彙表是明智的,這樣可以提前有些想法,有利於未來更好的預處理這些資料或文字資料。

hasnt
updating
figuratively
symphony
civilians
might
fisherman
hokum
witch
buffoons
...

接下來,我們討論如何使用詞彙表來建立電影評論資料集的預處理版本。

5.儲存預處理好的資料

我們可以使用資料清理和挑選好的詞彙表來預處理每個電影評論,並儲存準備建模的評論預處理版本。

這是一個很好的做法,因為它可以將資料準備與建模分離開來,使您可以專注於建模。並在您有新想法後隨時回到資料準備上。

我們可以從載入“ vocab.txt ” 詞彙表開始。

# load doc into memory
def load_doc(filename):
    # open the file as read only
    file = open(filename, 'r')
    # read all text
    text = file.read()
    # close the file
    file.close()
    return text
 
# load vocabulary
vocab_filename = 'review_polarity/vocab.txt'
vocab = load_doc(vocab_filename)
vocab = vocab.split()
vocab = set(vocab)

接下來,我們要清理評論,使用載入的詞彙表來過濾不需要的標符,並將乾淨的評論儲存在一個新檔案中。

一種方法是將所有正面評論儲存在一個檔案中,將所有負面評論儲存在另一個檔案中,對於每個評論,在單獨的行上將濾過的標符用空格分割。

首先,我們可以定義一個函式來處理一個文件,清理它,過濾它,並將它作為一個可以儲存在檔案中的單行來返回。下面定義了doc_to_line()函式,將檔名和詞彙表(設為一個集合)作為引數。

它呼叫之前定義的load_doc()函式來載入文件,並使用clean_doc()由文件得到標符

# load doc, clean and return line of tokens
def doc_to_line(filename, vocab):
    # load the doc
    doc = load_doc(filename)
    # clean doc
    tokens = clean_doc(doc)
    # filter by vocab
    tokens = [w for w in tokens if w in vocab]
    return ' '.join(tokens)

接下來,我們可以定義一個新版本的process_docs()函式來遍歷資料夾中的所有評論,並通過為每個文件呼叫doc_to_line()將它們轉換為行。然後返回行的列表。

# load all docs in a directory
def process_docs(directory, vocab):
    lines = list()
    # walk through all files in the folde
    for filename in listdir(directory):
        # skip files that do not have the right extension
        if not filename.endswith(".txt"):
            continue
        # create the full path of the file to open
        path = directory + '/' + filename
        # load and clean the doc
        line = doc_to_line(path, vocab)
        # add to list
        lines.append(line)
    return lines

然後,我們可以對正面和負面評論的目錄呼叫 process_docs() 方法,然後呼叫上一節中的save_list()方法將每個處理後的評論列表儲存到一個檔案中。

下面提供了完整的程式碼。

from string import punctuation
from os import listdi
from collections import Counte
from nltk.corpus import stopwords
 
# load doc into memory
def load_doc(filename):
    # open the file as read only
    file = open(filename, 'r')
    # read all text
    text = file.read()
    # close the file
    file.close()
    return text
 
# turn a doc into clean tokens
def clean_doc(doc):
    # split into tokens by white space
    tokens = doc.split()
    # remove punctuation from each token
    table = str.maketrans('', '', punctuation)
    tokens = [w.translate(table) for w in tokens]
    # remove remaining tokens that are not alphabetic
    tokens = [word for word in tokens if word.isalpha()]
    # filter out stop words
    stop_words = set(stopwords.words('english'))
    tokens = [w for w in tokens if not w in stop_words]
    # filter out short tokens
    tokens = [word for word in tokens if len(word) > 1]
    return tokens
 
# save list to file
def save_list(lines, filename):
    data = 'n'.join(lines)
    file = open(filename, 'w')
    file.write(data)
    file.close()
 
# load doc, clean and return line of tokens
def doc_to_line(filename, vocab):
    # load the doc
    doc = load_doc(filename)
    # clean doc
    tokens = clean_doc(doc)
    # filter by vocab
    tokens = [w for w in tokens if w in vocab]
    return ' '.join(tokens)
 
# load all docs in a directory
def process_docs(directory, vocab):
    lines = list()
    # walk through all files in the folde
    for filename in listdir(directory):
        # skip files that do not have the right extension
        if not filename.endswith(".txt"):
            continue
        # create the full path of the file to open
        path = directory + '/' + filename
        # load and clean the doc
        line = doc_to_line(path, vocab)
        # add to list
        lines.append(line)
    return lines
 
# load vocabulary
vocab_filename = 'vocab.txt'
vocab = load_doc(vocab_filename)
vocab = vocab.split()
vocab = set(vocab)
# prepare negative reviews
negative_lines = process_docs('txt_sentoken/neg', vocab)
save_list(negative_lines, 'negative.txt')
# prepare positive reviews
positive_lines = process_docs('txt_sentoken/pos', vocab)
save_list(positive_lines, 'positive.txt')

執行示例儲存到兩個新檔案中,分別名為“ negative.txt ”和“ positive.txt ”,分別包含預處理好的正面和反面評論。

資料已經準備好用在一個詞袋甚至是文字嵌入模型中。

擴充套件

本節列出了您可能希望探索的一些擴充套件。

  • 詞幹。我們可以使用像Porter stemmer這樣的詞幹演算法將文件中的每個單詞都縮減為詞幹。
  • 多單詞。除了專注於單個單詞,我們還可以開發詞對的單詞表。即雙詞。我們甚至還可以考察使用更大的片語,例如三詞,以及多詞。
  • 編碼詞。我們可以儲存單詞的整數編碼,而不是按原樣儲存標符,用唯一的整數作為索引來代表單詞表中的每個單詞。這將使建模時更容易處理資料。
  • 編碼文件。我們不用在文件中儲存標符,而是使用詞袋模型對文件進行編碼,並將每個單詞編碼為布林型存在/不存在。或者使用更復雜的評分方式,如TF-IDF。

如果你嘗試任何這些擴充套件,我很想知道。 在下面的評論中分享你的結果。

進一步閱讀

如果您正在深入研究,本節將提供更多有關該主題的資源。

資料集

介面

總結

在本教程中,您將一步一步瞭解瞭如何為情感分析預處理電影評論文字資料。

具體來說,你瞭解到:

  • 如何載入文字資料並清理它以去除標點符號和其他非單詞內容。
  • 如何開發詞彙表,定製詞彙表,並將其儲存到檔案中。
  • 如何使用預定義的詞彙表和清理方法來預處理電影評論,並將其儲存到新的檔案中以供建模。