繁体   English   中英

如何使用 spacy 将 python 中的列表列表词形还原?

[英]How can I lemmatize list of lists in python using spacy?

我有一个列表,其中包含需要词形还原的单词。 我收到一个错误,说需要字符串而不是列表,因为我使用的是 Spacy。

如果我转换为字符串,即nlp(str(list_1)) ,则列表分隔符(如:“,”和“[”)被标记并包含在我的输出中。

如何将列表列表中的项目词形还原并将其恢复为相同的形式,即列表列表?

需要词形还原的单词可以位于列表列表中的任何位置。

我想要这样的东西:

输入:

[["flower", "grows", "garden"], [["boy", "running", "playground"]]

输出:

[["flower", "grow", "garden"], ["boy", "run", "playground"]]

import spacy
nlp = spacy.load("en_core_web_sm")
list_1 = [["flower", "grows", "garden"], ["boy", "running", "playground"]]

for item in nlp(str(list_1)):
      print(item.lemma_)

我会将这项任务分为以下几部分:

1.创建nlp对象和您的文本

您已经做到了,但为了后代:

nlp = spacy.load("en_core_web_sm")
words = [["flower", "grows", "garden"], ["boy", "running", "playground"]]

2.获取每个列表的长度

我们需要每个列表的长度,以便以后可以对其进行迭代(以调整输出的形状)。 使用numpy.cumsum,我们可以创建一个数组,该数组将允许我们在O(n)时间内执行此操作。

# remember about importing numpy
lengths = np.cumsum([0] + list(map(len, words)))
print(lengths)

这将为我们提供以下数组(针对您的情况):

[0 3 6]

稍后我们将使用从该数组创建的范围,例如标记[0:3]构成第一个数组,标记[3:6]构成第二个数组。

3.展平数组并创建文档

flat_words = [item for sublist in words for item in sublist]
doc = spacy.tokens.Doc(nlp.vocab, words=flat_words)

最好将flat_words作为列表传递,这样spacy不必执行不必要的标记化操作。

4.迭代跨度

最后,在spacy.tokens.Span对象上遍历其令牌,然后将它们(当然是复lemmatized )添加到列表中。

lemmatized = []
# Iterate starting with 1
for index in range(1, len(lengths)):
    # Slice doc as described in the first point, so [0:3] and [3:6]
    span = doc[lengths[index - 1] : lengths[index]]
    # Add lemmatized tokens as list to the outer list
    lemmatized.append([token.lemma_ for token in span])

print(lemmatized)输出将如您所愿:

[['flower', 'grow', 'garden'], ['boy', 'run', 'playground']]

5.整个代码

为了使您更轻松,下面的整个代码:

import numpy as np
import spacy

nlp = spacy.load("en_core_web_sm")
words = [["flower", "grows", "garden"], ["boy", "running", "playground"]]

lengths = np.cumsum([0] + list(map(len, words)))
print(lengths)


flat_words = [item for sublist in words for item in sublist]
doc = spacy.tokens.Doc(nlp.vocab, words=flat_words)

lemmatized = []
# Iterate starting with 1
for index in range(1, len(lengths)):
    # Slice doc as described in the first point, so [0:3] and [3:6]
    span = doc[lengths[index - 1] : lengths[index]]
    # Add lemmatized tokens as list to the list
    lemmatized.append([token.lemma_ for token in span])

print(lemmatized)

在处理列表列表时,可以加入列表中的项目,然后使用nlp() 接下来,获取其中每个项目的引理。 要再次返回列表列表,只需在项目出现的索引处对其进行定形。

for item in list_1:
    doc = nlp(' '.join(item))    
    for indexer,i in enumerate(doc):
        item[indexer] = i.lemma_
print(list_1)
#Output:
[['flower', 'grow', 'garden'], ['boy', 'run', 'playground']]

我认为这不是最佳解决方案,但是您可以做到这一点

import spacy
nlp = spacy.load("en_core_web_sm")
list_1 = [["flower", "grows", "garden"], ["boy", "running", "playground"]]

s=""
for item in nlp(str(list_1)):
      s+=item.lemma_
ss=s[2:-2].replace('\'','').split('],[')
l=[]
for sss in ss :
     l.append(sss.split(','))
print(l)

#output
[['flower', 'grow', 'garden'], ['boy', 'run', 'playground']]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM