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_tokenize
和 word_tokenize
:
print(sent_tokenize(paragraph))
print(word_tokenize(paragraph))
但是如何将这些方法应用于整个数据集?我被困在这里,甚至无法尝试进行任何文本预处理(小写字母、删除标点符号、词形还原等)。
TIA
要回答 第一个问题,您只需将它们放入 dataframe
中,只包含您感兴趣的列(即 rating
和 review_text
).这是为了避免逐条循环和管理它们,并且也很容易在进一步的过程中被操纵。
想出 dataframe
后,使用 apply
进行预处理(例如 lower、tokenize , 删除标点符号, 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')
).
希望这会有所帮助
我正在尝试使用 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_tokenize
和 word_tokenize
:
print(sent_tokenize(paragraph))
print(word_tokenize(paragraph))
但是如何将这些方法应用于整个数据集?我被困在这里,甚至无法尝试进行任何文本预处理(小写字母、删除标点符号、词形还原等)。
TIA
要回答 第一个问题,您只需将它们放入 dataframe
中,只包含您感兴趣的列(即 rating
和 review_text
).这是为了避免逐条循环和管理它们,并且也很容易在进一步的过程中被操纵。
想出 dataframe
后,使用 apply
进行预处理(例如 lower、tokenize , 删除标点符号, 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')
).
希望这会有所帮助