首页 > 解决方案 > SpaCy lemmatizer 删除大写

问题描述

我想对匈牙利语中的一些文本数据进行词形还原,并在spaCy. 该token.lemma_函数在词形还原方面效果很好,但是,它返回了一些没有首字母大写的句子。这很烦人,因为我的下一个函数,unnest_stences(R) 需要第一个大写字母才能识别文本并将其分解为单个句子。 

首先,我认为问题在于我使用了最新版本的 spaCy,因为我收到了一个警告:

用户警告:[W031] 模型 'hu_core_ud_lg' (0.3.1) 需要 spaCy v2.1,并且与当前的 spaCy 版本 (2.3.2) 不兼容。这可能会导致意外结果或运行时错误。要解决此问题,请下载更新的兼容模型或使用当前 spaCy 版本重新训练您的自定义模型。

所以我继续安装 spacy 2.1,但问题仍然存在。 

我的数据来源是一些我无法在此处分享的电子邮件,但这里有一个小的人工示例:

# pip install -U spacy==2.1 # takes  9 mins
# pip install hu_core_ud_lg # takes 50 mins

import spacy
from spacy.lemmatizer import Lemmatizer
import hu_core_ud_lg
import pandas as pd
nlp = hu_core_ud_lg.load()

a = "Tisztelt levélíró!"
b = "Köszönettel vettük megkeresését."
df = pd.DataFrame({'text':[a, b]})

output_lemma = []

for i in df.text:
    mondat = ""
    doc = nlp(i)    
    for token in doc:
        mondat = mondat + " " + token.lemma_
    output_lemma.append(mondat)

output_lemma

产生

[' tisztelt levélíró !', ' köszönet vesz megkeresés .']

但我希望

[' Tisztelt levélíró !', ' Köszönet vesz megkeresés .']

当我将原始数据传递给该函数时,它会返回一些首字母大写的句子,而另一些则返回小写字母。出于某种奇怪的原因,我无法重现上面的模式,但我想重点是可见的。该功能无法按预期工作。

有什么想法可以解决这个问题吗?

我正在使用 Jupyter Notebook、Python 2.7、Win 7 和东芝笔记本电脑 (Portégé Z830-10R i3-2367M)。

标签: pythonnlpspacy

解决方案


小写是 spaCy 的 lemmatizer 对非专有名词标记的预期行为。

一种解决方法是检查每个标记是否有标题,并在词形还原后转换为原始大小写(仅适用于第一个字符)。

import spacy

nlp = spacy.load('en_core_web_sm')

text = 'This is a test sentence.'
doc = nlp(text)
newtext = ' '.join([tok.lemma_.title() if tok.is_title else tok.lemma_ for tok in doc])
print(newtext)
# This be a test sentence .

推荐阅读