我编写了一个 python 脚本来从 pandas 数据框列中提取单词。我观察到,在提取单词时,如果单词的最后一个字母是“s”,则最后一个“s”会被截断。下面是实际的代码和输出
我的代码
import re
import unicodedata
import nltk
# Create dataframe
data = ['gautam das',
'vas',
'kansas usa',
'maryam lass']
# Create the dataframe
df = pd.DataFrame(data, columns=['name'])
df = pd.concat([df[col].astype(str).str.lower() for col in df.columns], axis=1)
def basic_clean(text):
wnl = nltk.stem.WordNetLemmatizer()
text = (unicodedata.normalize('NFKD', text)
.encode('ascii', 'ignore')
.decode('utf-8', 'ignore')
.lower())
words = re.sub(r'[^\w\s]', '', text).split()
return([wnl.lemmatize(word) for word in words if word not in stopwords])
words = basic_clean(''.join(str(df['name'].tolist())))
words
输出
['gautam', 'da', 'va', 'kansa', 'usa', 'maryam', 'lass']
在此示例中,单词“gautam”、“usa”和“maryam”被正确提取,但“das”被提取为“da”,“vas”被提取为“va”,“kansas”被提取为'堪萨斯'。然而,'lass' 被正确提取,它的最后一个 's' 没有被截断。
问题:为什么会发生这种情况,我该如何避免?我不介意不使用 NLTK 的解决方案,只要它能有效地提取单词即可。
最佳答案
这是因为您正在使用 WordNetLemmatizer()
类中的 lemmatize()
方法。尽管该类称为 lemmatizer
,但它使用了一种特殊的 _morphy
方法,实际上 stems单词而不是 lemmatizing他们。虽然我不知道您使用的是什么语言模型,但我的猜测是 WordNetLemmatizer
将末尾带有“s”的单词分类为某种复数语素,最终导致隔断。
有关内部工作原理的更多信息,请参阅 WordNetLemmatizer 的文档以及 morphy method nltk 的。
如果不需要token词形还原,可以省略该过程。否则,您可以考虑使用 spaCy .您需要下载您选择的语言模型并使用如下方式对您的单词进行词形还原:
import spacy
nlp = spacy.load("en_core_web_sm")
lemmas = []
doc = nlp(text)
for token in doc:
if (token.is_stop == False) and (token.is_punct == False):
lemmas.append(token.lemma_)
希望这对您有所帮助。
关于python - 为什么在某些情况下使用 NLTK 提取单词会截断最后的 'S'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74125171/