python - 使用 spaCy 提取两个连续的名词

标签 python pandas spacy

这是一个简单的数据集:

import pandas as pd
product = ['knife', 'box set', 'beautiful jewellery set on sale', 'green']
df = pd.DataFrame(product, columns = ['product_name'])
df

输出如下:

<表类="s-表"> <头> <日> 产品名称 <正文> 0 刀 1 盒装 2 美丽的珠宝套装特卖 3 绿色

如果需要,我想通过提取两个连续的名词来对这些产品进行分类。到目前为止,我有以下内容,但所有情况下类别仅由一个名词表示:

!pip install -q --upgrade spacy

import spacy
nlp = spacy.load('en_core_web_sm')

category=[]
for i in df['product_name'].tolist():
    doc = nlp(i)
    for t in doc:
      if t.pos_ in ['NOUN']:
        category.append(f'{t}')
        break
    if t.pos_ not in ['NOUN']:
      category.append('NaN')

df1 = pd.DataFrame(category, columns =['product_category'])
df1

我的输出:

<表类="s-表"> <头> <日> 产品类别 <正文> 0 刀 1 设置 2 首饰 3 NaN

预期输出:

<表类="s-表"> <头> <日> 产品类别 <正文> 0 刀 1 盒装 2 首饰套装 3 NaN

是否可以在代码中引入一些附加条件,提取两个名词接一个接一个?

最佳答案

你可以使用

import spacy
import pandas as pd
import numpy as np

product = ['knife', 'box set', 'beautiful jewellery set on sale', 'green']
df = pd.DataFrame(product, columns = ['product_name'])

nlp = spacy.load('en_core_web_sm')
matcher = spacy.matcher.Matcher(nlp.vocab)
pattern = [{'POS': 'NOUN'},{'POS': 'NOUN','OP':'?'}]
matcher.add('NOUN_PATTERN', [pattern])

def get_two_nouns(x):
    doc = nlp(x)
    results = []
    for match_id, start, end in matcher(doc):
        span = doc[start:end]
        results.append(span.text)
    return max(results, key = lambda x: len(x.split()), default=np.nan)

df['product_name'].apply(get_two_nouns)

输出:

0            knife
1          box set
2    jewellery set
3              NaN
Name: product_name, dtype: object

pattern = [{'POS': 'NOUN'},{'POS': 'NOUN','OP':'?'}] 模式匹配(组合)标记都是 NOUN。第二个是可选的,因为 OP 运算符设置为 ?

return max(results, key = lambda x: len(x.split()), default=np.nan) 部分返回最长长度的项(长度以空格分隔 token 计数在这里)。

关于python - 使用 spaCy 提取两个连续的名词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69078325/

相关文章:

python - 在不同的类中实现相同的方法

python - Python中的高维数据结构

python-3.6 - 应用简单训练模型时未命名向量上的 Spacy 错误

python - 将 spacy token 向量转换为文本

python - __str__ 和 Python 中的单引号与双引号行为

python - 定义字符串时出现关键错误,python

python - Keras 序列、fit_generator 和 steps_per_epoch

python - "index.week"使用 iterrows 时进行过滤

python - 使用 pandas 按一列一行中的值按字母顺序对数据框进行排序

python - 使用 spaCy 训练 NER 时损失平稳