python - 为什么在某些情况下使用 NLTK 提取单词会截断最后的 'S'?

标签 python python-3.x text nlp nltk

我编写了一个 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/

相关文章:

ruby-on-rails - 在省略之前打印文本的前 100 个单词

python - Quandl + Python : The date column not "working"

python django 字典

python - 为什么按下 PyQt 按钮时 matplotlib 的计时器会加速?

Python 多处理查询

text - 在 Sublime Text 2 中突出显示 nbsp 字符?

python - GNU Radio (Companion) 在变量替换时给出 Python 语法错误

python - 在 Python 中将位转换为字节

python-3.x - 当查询包含来自多个数据库的表的连接时,如何在 boto3 中设置 QueryExecutionContext?

html - 关于如何使此文本 CSS 动画在小屏幕上具有响应性的任何想法?