如何使用spacy对python中的列表列表进行元素化?

如何使用spacy对python中的列表列表进行元素化?,python,spacy,Python,Spacy,我有一个列表,其中包含需要进行语法化的单词。我得到一个错误,说字符串是必需的,而不是列表,因为我使用的是Spacy 如果我转换为字符串,即nlpstrlist_1,则列表分隔符(如:、和[)将被标记并包含在我的输出中 如何将列表列表中的项目进行线性化,并将其恢复为相同的形式,即列表列表 需要进行柠檬化的单词可以在列表中的任何位置 我想要这样的东西: 输入: 花儿,植物,花园,男孩,跑步,操场 输出: 花儿,成长,花园,男孩,奔跑,操场 在处理列表列表时,您可以将列表中的项目连接起来,然后使用nl

我有一个列表,其中包含需要进行语法化的单词。我得到一个错误,说字符串是必需的,而不是列表,因为我使用的是Spacy

如果我转换为字符串,即nlpstrlist_1,则列表分隔符(如:、和[)将被标记并包含在我的输出中

如何将列表列表中的项目进行线性化,并将其恢复为相同的形式,即列表列表

需要进行柠檬化的单词可以在列表中的任何位置

我想要这样的东西:

输入:

花儿,植物,花园,男孩,跑步,操场

输出:

花儿,成长,花园,男孩,奔跑,操场


在处理列表列表时,您可以将列表中的项目连接起来,然后使用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']]

在处理列表列表时,您可以将列表中的项目连接起来,然后使用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']]

我将此任务分为以下几个部分:

1.创建nlp对象和文本 你已经做到了,但为了子孙后代:

nlp = spacy.load("en_core_web_sm")
words = [["flower", "grows", "garden"], ["boy", "running", "playground"]]
2.获取每个列表的长度 我们需要每个列表都有一个长度,这样我们可以在以后对它进行迭代,以便重新塑造输出。使用我们可以创建一个数组,它将允许我们按时这样做

这将为您的案例提供以下阵列:

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

3.展平阵列并创建文档 最好将平面单词作为列表传递,这样spacy就不必执行不必要的标记化操作

4.迭代跨度 最后,在对象上迭代,在它们的标记上迭代,并将那些元素化的标记添加到列表中

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])
PrintLemmated的输出将如您所愿:

[['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)

我将此任务分为以下几个部分:

1.创建nlp对象和文本 你已经做到了,但为了子孙后代:

nlp = spacy.load("en_core_web_sm")
words = [["flower", "grows", "garden"], ["boy", "running", "playground"]]
2.获取每个列表的长度 我们需要每个列表都有一个长度,这样我们可以在以后对它进行迭代,以便重新塑造输出。使用我们可以创建一个数组,它将允许我们按时这样做

这将为您的案例提供以下阵列:

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

3.展平阵列并创建文档 最好将平面单词作为列表传递,这样spacy就不必执行不必要的标记化操作

4.迭代跨度 最后,在对象上迭代,在它们的标记上迭代,并将那些元素化的标记添加到列表中

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])
PrintLemmated的输出将如您所愿:

[['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)

谢谢!但我如何将它们恢复到原始形式,即列表形式?@amanb创建spacy.tokens.Doc I次并在每个步骤后执行不必要的标记化是非常低效的,不是吗?谢谢!但我如何将它们恢复到原始形式,即列表形式?@amanb创建spacy.tokens.Doc I非常低效在每一步之后执行不必要的标记化,不是吗?