python - 如何使用 spacy 在 pandas 数据框中删除停用词并获取引理?
问题描述
我在 python 的 pandas 数据框中有一列标记。看起来像:
word_tokens
(the,cheeseburger,was,great)
(i,never,did,like,the,pizza,too,much)
(yellow,submarine,was,only,an,ok,song)
我想使用 spacy 库在这个数据框中再获得两个新列。一列包含删除了停用词的每一行的标记,另一列包含第二列中的引理。我怎么能那样做?
解决方案
您将文本设置为 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 | (“我”、“从不”、“做过”、“喜欢”、“那个”、“比萨饼”、“太”、“很多”) |
2 | ('yellowed', 'submarines', 'was', 'only', 'an', 'ok', 'song') |
我定义了执行主要任务的函数:
- 令牌元组-> spaCy Doc
- spaCy Doc -> 非停用词列表
- 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 | 已移除_stops | 词形化 | |
---|---|---|---|
0 | ('the'、'cheeseburger'、'was'、'great') | ['芝士汉堡','很棒'] | ['芝士汉堡','很棒'] |
1 | (“我”、“从不”、“做过”、“喜欢”、“那个”、“比萨饼”、“太”、“很多”) | ['喜欢','披萨'] | ['喜欢','披萨'] |
2 | ('yellowed', 'submarines', 'was', 'only', 'an', 'ok', 'song') | ['yellowed', 'submarines', 'ok', 'song'] | ['黄色','潜艇','ok','歌曲'] |
根据您的用例,您可能想要探索 spaCy 文档对象 ( https://spacy.io/api/doc ) 的其他属性。doc.noun_chunks
特别是,看看doc.ents
你是否试图从文本中提取更多含义。
还值得注意的是,如果您打算将其用于大量文本,则应考虑nlp.pipe
:https ://spacy.io/usage/processing-pipelines 。它分批而不是一个一个地处理您的文档,并且可以使您的实施更有效率。
推荐阅读
- javascript - 排序数组从多个来源创建键值对
- c# - 如何有效地从大型 Excel 文档中检索所有字符串
- ansible - Ansible playbook - 解压缩到特定的(重命名目录
- windows - PDF24 处于错误状态,尽管它声称已准备好作为打印机
- php - 如何修复 Laravel 项目中的“打开流失败”错误?
- python - 从网页获取表格:获取完整 html 的问题
- python - 如何通过组合与Python中几个字典中的键对应的值来创建新字符串?
- ajax - 从 ajax-call 调用 vb 代码隐藏函数
- r - X 轴上的日期在 R 可视化中不是日期格式
- c# - 如果我在没有等待的情况下调用多个异步方法然后使用 Task.WhenAll,它会是异步的吗?