words.words() 中的单词在 Python 中检查太慢且不准确

word in words.words() check too slow and inaccurate in Python

我有一个数据集,它由两列组成,一列是 Myers-Briggs 人格类型,另一列包含该人的最后 50 条推文。我已经标记化,从列表中删除了 URL 和停用词,并对这些词进行了词形还原。

然后我创建了一个 collections.Counter 最常用的单词,我正在检查它们是否是 nltk 的有效英语单词。

问题是检查语料库中是否存在该词需要花费太多时间,而且我还认为该词汇表中缺少很多词。这是我的代码:

import nltk    
import collections
from nltk.corpus import words

# nltk.download("words")

# Creating a frequency Counter of all the words
frequency_counter = collections.Counter(df.posts.explode())
sorted_common_words = sorted(frequency_counter.items(), key = lambda pair: -pair[1])

words_lst = []
for i in range(len(sorted_common_words)):
    if sorted_common_words[i][1] > 1000:
        words_lst.append(sorted_common_words[i][0])

valid_words = []
invalid_words = []

valid_words = [word for word in words_lst if word in words.words()]
invalid_words = [word for word in words_lst if word not in words.words()]

我的问题是 invalid_words 列表包含一些有效的英语单词,例如:

  1. f*ck
  2. 已更改
  3. 惊讶
  4. 女朋友
  5. 头像
  6. 不再

当然还有更多。即使手动检查这些词是否存在于 words.words() 它 returns False 中。我最初尝试对我的文本进行词干处理,但这产生了一些词根,看起来不正确,这就是为什么决定对它们进行词形还原的原因。

Python有没有一个图书馆有所有英文单词的词干版本?我想这会大大加快我的脚本速度。

我的原始数据框大约有 9000 行,清理数据集后有超过 500 万个标记化单词和大约 110.000 个唯一单词。 'words.words()is containing 236736 words, so checking if those 110.000 words are withinwords.words()` 会花费太多时间。我已经检查过,检查 1000 次大约需要一分钟。这主要是由于 Python 的限制只能在一个核心上 运行,所以我无法在所有可用核心上并行化操作。

我会建议这个解决方案:

# your code as it was before
words_lst = []
for i in range(len(sorted_common_words)):
    if sorted_common_words[i][1] > 1000:
        words_lst.append(sorted_common_words[i][0])

import numpy as np

words_arr = np.array(words_lst,dtype=str)
words_dictionary = np.array(words.words(),dtype=str)

mask_valid_words = np.in1d(words_arr, words_dictionary)

valid_words = words_arr[mask_valid_words]
invalid_words = words_arr[~mask_valid_words]