为什么使用 NLTK 提取单词会在某些场合截断最后一个"S"?



我编写了一个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'[^ws]', '', 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"one_answers"maryam"被正确提取,但"das"被提取为"da","vas"被提取成"va","kansas"被提取出"kansa"。但是,"lass"已正确提取,其最后一个"s"未被截断。

问题:为什么会发生这种情况,我该如何避免?我不介意不使用NLTK的解决方案,只要它能有效地提取单词。

这是因为您使用的是WordNetLemmatizer()类中的lemmatize()方法。尽管该类被称为lemmatizer,但它使用了一个特殊的_morphy方法,该方法实际上是词干,而不是将它们旅名化。虽然我不知道你使用的是什么语言模型,但我的猜测是,WordNetLemmatizer将结尾带有"s"的单词归类为某种复数词素,这最终会导致截断。有关内部工作的更多信息,请参阅WordNetLemmatizer的文档以及nltk的morphy方法。

如果您不需要标记引理,则可以省略该过程。否则,您可以考虑使用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_)

希望这能有所帮助。

相关内容

最新更新