【问题标题】:Filtering data based on a list of keywords根据关键字列表过滤数据
【发布时间】:2019-11-25 03:14:46
【问题描述】:

我有一个包含 +- 130k 条推文的数据框,旁边有一个标签(1 = 正面,0 = 负面)。从这个数据框中,我想提取与电影相关的推文。为此,我想出了一个与电影相关的单词列表:

movie_related_words = ["movie", "movies", "watch", 
                       "watching", "film", "cinema", 
                       "actor", "video", "thriller", 
                       "horror", "dvd", "bluray", "soundtrack", 
                       "director", "remake", "blockbuster"]

经过一些预处理后,数据框中的推文被标记化,因此我的数据框的文本列包含 推文列表,其中每个单词都是一个单独的列表元素。供您参考,请在下面找到我的数据框的三个随机元素:

[well, time, for, bed, 500, am, comes, early, nice, chatting, with, everyone, have, a, good, evening, and, rest, of, the, weekend, whats, left, of, it]
[tekkah, defyingsantafe, umm, dont, forget, that, youre, all, gay, socialist, atheists]
[s, mom, nearly, got, ran, over, by, a, truck, on, her, bike, and, dropped, her, work, bag, with, all, her, information, which, was, then, stolen, fb]

我想过滤推文,当给定推文的任何字词(因此是列表的元素)movie_related_words列表,我想保留那个观察,如果没有,我想丢弃它。

我尝试过像这样应用 lambda 表达式:

def filter_movies(text):
    movie_filtered = "".join([i for i in text if i in movie_related_words])
    return movie_filtered

twitter_loaded_df['text'] = twitter_loaded_df['text'].apply(lambda x : filter_movies(x))

但这给了我一个奇怪的结果。任何有关如何实现这一目标的指导将不胜感激。一种pythonic /有效的方式将导致我对你的永恒爱。我希望为此目的存在某种熊猫功能,但我还没有找到它......

【问题讨论】:

    标签: python pandas dataframe text


    【解决方案1】:

    如果我理解正确,请尝试:

    twitter_loaded_df['movie_related'] = twitter_loaded_df['text'].map(lambda x: max([word in movie_related_words for word in x]))
    

    如果这些词中的任何一个在您的列表中,它应该添加一个带有 True/False 的列“movie_related”。

    【讨论】:

    • 我试过这个,但它似乎不起作用; twitter_loaded_df['movie_related'] 中的所有值都是 False,虽然我确定数据集中有与电影相关的推文。
    • @Psychotechnopath 在您作为示例提供的 3 个列表中,我没有看到匹配项。尝试找到一个匹配的地方,并且我的解决方案确实给出了错误的False。也许它需要一个小的调整。
    • ['no', 'movie', 'times', 'for', 'sunday', 'rats', 'will', 'have', 'to', 'plan', 'tomorrow', 'i', 'guess', 'this', 'means', 'i', 'have', 'to', 'work', 'on', 'those', 'two', 'presentations', 'i', 'am', 'doing'] 有一个元素显示“电影”,但在您的解决方案中 twitter_loaded_df['movie_related'] 仍然是 False。
    • @Psychotechnopath 只是运行它,它给了我该行的 True。您确定在“文本”列中有单词列表吗?也许它是一个列表或其他东西的列表?
    • 我们可能会在这里做一些事情。如果我使用twitter_loaded_df.dtypes,我会看到我的文本列是“对象”类型。我认为 pandas 会自动为类似字符串的数据执行此操作;但可能因此“常规”python 代码在使用 pandas 数据框时不起作用?
    【解决方案2】:

    这个怎么样:

    MOVIE_RELATED_WORDS = set(["movie", "movies", "watch", 
                               "watching", "film", "cinema", 
                               "actor", "video", "thriller", 
                               "horror", "dvd", "bluray", "soundtrack", 
                               "director", "remake", "blockbuster"])
    
    def contains_movie_word(words):
        return any(word in MOVIE_RELATED_WORDS for word in words)
    
    is_movie_related = df['text'].apply(contains_movie_word)
    
    df = df[is_movie_related]  # Filter using boolean series
    

    这种方法的优点是:

    1. 只要在给定的推文中找到一个与电影相关的单词,它就会短路(提前返回)。
    2. 数据框中的每一行都是O(N_tweet_words),因为集合查找平均为O(1)

    例子:

    import pandas
    df = pandas.DataFrame({'text': [['Hello', 'world'], ['Great', 'movie'], ['Bad', 'weather']]})
    

    这里,df 是:

                 text
    0  [Hello, world]
    1  [Great, movie]
    2  [Bad, weather]
    

    应用解决方案后,is_movie_related 为:

    0    False
    1     True
    2    False
    Name: text, dtype: bool
    

    【讨论】:

    • 感谢您的回复!经过仔细调查,问题似乎与我的数据框有关;当我使用print(type(df['text'][0])) 检查您的数据框时,它打印出类型是“列表”,这是正确的。当我在我的数据框上执行此操作时,它返回给我它是“字符串”类型。尽管我的数据看起来完全 一个列表,但它似乎是 pandas 的字符串。我不知道这是为什么或如何转换它。
    • 是的,您的数据可能不是您期望的格式。如果简单地赋值v = df.loc[0, ‘text’],那么v的类型和值究竟是什么?如果不是列表或集合,则需要备份并修复该问题。
    • 我想我设法隔离了这个问题。一切都很好,确实我的数据框包含单词列表(如预期的那样)。但是,我使用 pandas 的 to_csv 方法将结果缓存到中间的 CSV 文件中。当我尝试重新加载结果时,它突然将所有列表都视为“字符串”。很奇怪。
    • 这一点也不奇怪。如果数据框有一个对象列,其中每个元素都是一个重要的 Python 数据结构,例如列表、字典或集合,那么应该如何将复杂的数据结构写入 CSV 字段?我敢打赌您的 CSV 包含带有转义逗号的字符串。如果您将数据名改为 JSON(即将每个列表元素写入 JSON 数组),也许 pandas 会做一些明智的事情。
    • 你说得对,pandas 无法在写入 CSV 后推断出这些结构!愚蠢的我!我通过预处理删除了所有标点符号,因此没有转义逗号。让我明白的是,在从 CSV 加载回来后,数据仍然 看起来 就好像它是 CSV,即使 python 将其视为字符串。有时是小错误杀死了你。还是谢谢
    猜你喜欢
    • 2021-11-06
    • 2015-05-17
    • 2020-09-11
    • 2020-02-06
    • 2012-11-21
    • 2012-12-12
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    相关资源
    最近更新 更多