1

我有一系列社交媒体评论,我想根据他们对日期的引用来探索这些评论。为此,我使用 SpaCy 的命名实体识别器来搜索DATE实体。df_test我在该列下调用的 pandas 数据框中有评论comment。我想dates在这个数据框中添加一个新列,其中包含在每个评论中找到的所有日期实体。有些评论不会有任何日期实体,在这种情况下None应该在此处添加。例如:

comment
'bla bla 21st century'
'bla 1999 bla bla 2022'
'bla bla bla'

应该:

comment                        dates
'bla bla 21st century'         '21st century'
'bla 1999 bla bla 2022'        '1999', '2022'
'bla bla bla'                  'None'

基于他们是否可以添加在新列中找到的新 NER 标记?我尝试了一种列表方法:

date_label = ['DATE']
dates_list = []

def get_dates(row):
    comment = str(df_test.comment.tolist())
    doc = nlp(comment)
    for ent in doc.ents:
        if ent.label_ in date_label:
            dates_list.append([ent.text])
        else:
            dates_list.append(['None'])

df_test.apply(lambda row: get_dates(row))
date_df_test = pd.DataFrame(dates_list, columns=['dates'])

但是,这会产生一个比原始数据框更长的列,例如:

comment                        dates
'bla bla 21st century'         '21st century'
'bla 1999 bla bla 2022'        '1999'
'bla bla bla'                  '2022'
                               'None'

这不起作用,因为日期条目不再与其相应的注释匹配。我知道这是因为我在所有实体中循环,但我不知道如何解决这个问题。有没有办法解决这个问题,以便我可以提取所有日期实体并以某种方式将它们连接到它们被发现的评论,以便以后分析?任何帮助深表感谢!

4

1 回答 1

1

通过使用此功能,我设法找到了解决我自己问题的方法。

date_label = ['DATE']

def extract_dates(text):
    doc = nlp(text)
    results = [(ent.text, ent.label_) for ent in doc.ents if ent.label_ in date_label]
    return results

df_test['dates'] = df_test['comment'].apply(extract_dates)

我希望这可以帮助任何面临类似问题的人。

于 2022-03-02T20:14:35.300 回答