【问题标题】:How to remove stop words and get lemmas in a pandas data frame using spacy?如何使用 spacy 在 pandas 数据框中删除停用词并获取引理?
【发布时间】:2021-06-13 23:01:38
【问题描述】:

我在 python 的 pandas 数据框中有一列标记。看起来像:

 word_tokens
 (the,cheeseburger,was,great)
 (i,never,did,like,the,pizza,too,much)
 (yellow,submarine,was,only,an,ok,song)

我想使用 spacy 库在此数据框中再获得两个新列。一列包含删除了停用词的每一行的标记,另一列包含第二列中的引理。我怎么能这样做?

【问题讨论】:

    标签: python pandas nlp spacy stop-words


    【解决方案1】:

    您将文本设置为 spaCy 类型是正确的 - 您希望将每个标记元组转换为 spaCy Doc。从那里,最好使用标记的属性来回答“标记是停用词”(使用token.is_stop)或“这个标记的引理是什么”(使用token.lemma_)的问题。我的实现如下,我稍微更改了您的输入数据以包含一些复数示例,以便您可以看到词形还原正常工作。

    import spacy
    import pandas as pd
    
    nlp = spacy.load('en_core_web_sm')
    
    texts = [('the','cheeseburger','was','great'),
             ('i','never','did','like','the','pizzas','too','much'), 
             ('yellowed','submarines','was','only','an','ok','song')]
    
    df = pd.DataFrame({'word_tokens': texts})
    

    初始DataFrame如下所示:

    word_tokens
    0 ('the', 'cheeseburger', 'was', 'great')
    1 ('i', 'never', 'did', 'like', 'the', 'pizzas', 'too', 'much')
    2 ('yellowed', 'submarines', 'was', 'only', 'an', 'ok', 'song')

    我定义了执行主要任务的函数:

    1. token 元组 -> spaCy Doc
    2. spaCy Doc -> 非停用词列表
    3. spaCy Doc -> 不间断的词形还原词列表
    def to_doc(words:tuple) -> spacy.tokens.Doc:
        # Create SpaCy documents by joining the words into a string
        return nlp(' '.join(words))
    
    def remove_stops(doc) -> list:
        # Filter out stop words by using the `token.is_stop` attribute
        return [token.text for token in doc if not token.is_stop]
    
    def lemmatize(doc) -> list:
        # Take the `token.lemma_` of each non-stop word
        return [token.lemma_ for token in doc if not token.is_stop]
    

    应用这些看起来像:

    # create documents for all tuples of tokens
    docs = list(map(to_doc, df.word_tokens))
    
    # apply removing stop words to all
    df['removed_stops'] = list(map(remove_stops, docs))
    
    # apply lemmatization to all
    df['lemmatized'] = list(map(lemmatize, docs))
    

    你得到的输出应该是这样的:

    word_tokens removed_stops lemmatized
    0 ('the', 'cheeseburger', 'was', 'great') ['cheeseburger', 'great'] ['cheeseburger', 'great']
    1 ('i', 'never', 'did', 'like', 'the', 'pizzas', 'too', 'much') ['like', 'pizzas'] ['like', 'pizza']
    2 ('yellowed', 'submarines', 'was', 'only', 'an', 'ok', 'song') ['yellowed', 'submarines', 'ok', 'song'] ['yellow', 'submarine', 'ok', 'song']

    根据您的用例,您可能想要探索 spaCy 文档对象 (https://spacy.io/api/doc) 的其他属性。特别是,如果您想从文本中提取更多含义,请查看 doc.noun_chunksdoc.ents

    还值得注意的是,如果您打算将其用于大量文本,则应考虑nlp.pipehttps://spacy.io/usage/processing-pipelines。它分批而不是一个一个地处理您的文档,并且可以提高您的实施效率。

    【讨论】:

    • 谢谢布兰登。这是一个美丽的答案。
    【解决方案2】:

    如果您使用 spacy,您应该将文本设为 spacy 类型,如下所示:

     nlp = spacy.load("en_core_web_sm")
     text = topic_data['word_tokens'].values.tolist()
     text = '.'.join(map(str, text))
     text = nlp(text)
    

    这使它更容易使用。然后你可以像这样标记单词

     token_list = []
        for token in text:
        token_list.append(token.text)
    

    然后像这样删除停用词。
    token_list= [如果不是 nlp.Defaults.stop_words 中的单词,则在 token_list 中逐字逐句]

    我还没有弄清楚词形还原部分,但这是一个开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-12
      • 1970-01-01
      • 2021-07-21
      • 1970-01-01
      • 1970-01-01
      • 2018-05-11
      • 2019-02-19
      • 2017-05-01
      相关资源
      最近更新 更多