NLP 的文本预处理,但来自词典列表

Text Preprocessing for NLP but from List of Dictionaries

我正在尝试使用 goodreads 数据集做一个 NLP 项目。我的数据集是字典列表。每个字典看起来像这样(列表称为 'reviews'):

>>> reviews[0]
{'user_id': '8842281e1d1347389f2ab93d60773d4d',
'book_id': '23310161',
'review_id': 'f4b4b050f4be00e9283c92a814af2670',
'rating': 4,
'review_text': 'Fun sequel to the original.',
'date_added': 'Tue Nov 17 11:37:35 -0800 2015',
'date_updated': 'Tue Nov 17 11:38:05 -0800 2015',
'read_at': '',
'started_at': '',
'n_votes': 7,
'n_comments': 0}

我的数据集中有 700k+ 这些词典。

第一个问题:我只对元素'rating''review_text'感兴趣。我知道我可以从每个字典中删除元素,但我如何对所有字典执行此操作?

第二个问题:我可以通过指定列表中的字典,然后是元素'review_text',对列表中的单个字典进行句子和单词标记化在字典中像这样:

paragraph = reviews[0]['review_text']

然后像这样应用 sent_tokenizeword_tokenize

print(sent_tokenize(paragraph))
print(word_tokenize(paragraph))

但是如何将这些方法应用于整个数据集?我被困在这里,甚至无法尝试进行任何文本预处理(小写字母、删除标点符号、词形还原等)。

TIA

要回答 第一个问题,您只需将它们放入 dataframe 中,只包含您感兴趣的列(即 ratingreview_text ).这是为了避免逐条循环和管理它们,并且也很容易在进一步的过程中被操纵。

想出 dataframe 后,使用 apply 进行预处理(例如 lowertokenize , 删除标点符号, lemmatize, 和 stem) 你的文本列并生成名为 [=17 的新列=] 存储预处理的文本(即 tokens)。这是为了满足第二个问题

from nltk import sent_tokenize, word_tokenize
from nltk.stem import WordNetLemmatizer
from nltk.stem import PorterStemmer
import string

punc_list = list(string.punctuation)
porter = PorterStemmer()    
lemmatizer = WordNetLemmatizer()

def text_processing(row):
    all_words = list()
    # sentence tokenize
    for sent in sent_tokenize(row['review_text']):
        # lower words and tokenize
        words = word_tokenize(sent.lower())
        # lemmatize
        words_lem = [lemmatizer.lemmatize(w) for w in words]
        # remove punctuation
        used_words = [w for w in words_lem if w not in punc_list]
        # stem
        words_stem = [porter.stem(w) for w in used_words]
        all_words += words_stem
    return all_words

# create dataframe from list of dicts (select only interesting columns)
df = pd.DataFrame(reviews, columns=['user_id', 'rating', 'review_text'])

df['tokens'] = df.apply(lambda x: text_processing(x), axis=1)
print(df.head())

输出示例:

  user_id  rating              review_text                        tokens
0       1       4        Fun sequel to the        [fun, sequel, to, the]
1       2       2  It was a slippery slope  [it, wa, a, slipperi, slope]
2       3       3     The trick to getting         [the, trick, to, get]
3       4       3           The bird had a           [the, bird, had, a]
4       5       5      That dog likes cats        [that, dog, like, cat]

最后,如果你不喜欢dataframe,你可以将其导出为其他格式,如csv(to_csv)、json(to_json)、和字典列表 (to_dict('records')).

希望这会有所帮助