如何使用 spacy 在 pandas 数据框中删除停用词并获取引理?
How to remove stop words and get lemmas in a pandas data frame using spacy?
我在 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 类型,例如:
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= [token_list 中的逐字逐句如果不是 nlp.Defaults.stop_words 中的单词]
我还没有弄清楚词形还原部分,但这是一个开始。
您将文本设为 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')
我定义函数来执行主要任务:
- 令牌元组 -> 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
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_chunks
和 doc.ents
。
还值得注意的是,如果您打算将此功能用于大量文本,则应考虑 nlp.pipe
:https://spacy.io/usage/processing-pipelines。它分批处理您的文档,而不是一个接一个地处理,并且可以使您的实施更有效率。
我在 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 类型,例如:
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= [token_list 中的逐字逐句如果不是 nlp.Defaults.stop_words 中的单词]
我还没有弄清楚词形还原部分,但这是一个开始。
您将文本设为 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') |
我定义函数来执行主要任务:
- 令牌元组 -> 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 | 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_chunks
和 doc.ents
。
还值得注意的是,如果您打算将此功能用于大量文本,则应考虑 nlp.pipe
:https://spacy.io/usage/processing-pipelines。它分批处理您的文档,而不是一个接一个地处理,并且可以使您的实施更有效率。