簡體   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