通过 Pandas 数据帧运行 nltk sent_tokenize

Ove*_*ass 4 python nltk dataframe pandas

我有一个由两列组成的数据框:ID 和 TEXT。假设数据如下:

ID      TEXT
265     The farmer plants grain. The fisher catches tuna.
456     The sky is blue.
434     The sun is bright.
921     I own a phone. I own a book.
Run Code Online (Sandbox Code Playgroud)

我知道所有 nltk 函数都不适用于数据帧。sent_tokenize 如何应用于上述数据帧?

当我尝试:

df.TEXT.apply(nltk.sent_tokenize)  
Run Code Online (Sandbox Code Playgroud)

输出与原始数据帧没有变化。我想要的输出是:

TEXT
The farmer plants grain.
The fisher catches tuna.
The sky is blue.
The sun is bright.
I own a phone.
I own a book.
Run Code Online (Sandbox Code Playgroud)

此外,我想将这个新的(所需的)数据框与这样的原始ID数字联系起来(在进一步的文本清理之后):

ID    TEXT
265     'farmer', 'plants', 'grain'
265     'fisher', 'catches', 'tuna'
456     'sky', 'blue'
434     'sun', 'bright'
921     'I', 'own', 'phone'
921     'I', 'own', 'book'
Run Code Online (Sandbox Code Playgroud)

这个问题与我在这里的另一个问题有关。如果我能提供任何信息来帮助澄清我的问题,请告诉我!

abe*_*abe 6

编辑:由于@alexis 有保证的刺激,这里是一个更好的回应

句子标记化

这应该为您提供每个 ID 和句子一行的 DataFrame:

sentences = []
for row in df.itertuples():
    for sentence in row[2].split('.'):
        if sentence != '':
            sentences.append((row[1], sentence))
new_df = pandas.DataFrame(sentences, columns=['ID', 'SENTENCE'])
Run Code Online (Sandbox Code Playgroud)

其输出如下所示:

在此处输入图片说明

split('.')如果句子实际上由句号分隔并且句号没有用于其他用途(例如表示缩写),则会快速将字符串分解成句子,并且会在此过程中删除句号。如果句号有多个用例和/或并非所有句子结尾都用句号表示,这将失败。正如您所问的那样,一种更慢但更健壮的方法是使用sent_tokenize 逐句拆分行:

sentences = []
for row in df.itertuples():
    for sentence in sent_tokenize(row[2]):
        sentences.append((row[1], sentence))
new_df = pandas.DataFrame(sentences, columns=['ID', 'SENTENCE'])
Run Code Online (Sandbox Code Playgroud)

这会产生以下输出:

在此处输入图片说明

如果您想从这些行中快速删除句点,您可以执行以下操作:

new_df['SENTENCE_noperiods'] = new_df.SENTENCE.apply(lambda x: x.strip('.'))
Run Code Online (Sandbox Code Playgroud)

这将产生:

在此处输入图片说明

您还可以采用 apply -> map 方法(df是您的原始表):

df = df.join(df.TEXT.apply(sent_tokenize).rename('SENTENCES'))
Run Code Online (Sandbox Code Playgroud)

产量:

在此处输入图片说明

继续:

sentences = df.SENTENCES.apply(pandas.Series)
sentences.columns = ['sentence {}'.format(n + 1) for n in sentences.columns]
Run Code Online (Sandbox Code Playgroud)

这产生:

在此处输入图片说明

由于我们的索引没有改变,我们可以将其加入到我们的原始表中:

df = df.join(sentences)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

词标记化

继续上面的df,我们可以提取给定句子中的标记如下:

df['sent_1_words'] = df['sentence 1'].apply(word_tokenize)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明