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
列表包含一些有效的英语单词,例如:
- f*ck
- 已更改
- 惊讶
- 女朋友
- 头像
- 不再
当然还有更多。即使手动检查这些词是否存在于 words.words()
它 returns False
中。我最初尝试对我的文本进行词干处理,但这产生了一些词根,看起来不正确,这就是为什么决定对它们进行词形还原的原因。
Python有没有一个图书馆有所有英文单词的词干版本?我想这会大大加快我的脚本速度。
我的原始数据框大约有 9000 行,清理数据集后有超过 500 万个标记化单词和大约 110.000 个唯一单词。 'words.words()is containing 236736 words, so checking if those 110.000 words are within
words.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]
我有一个数据集,它由两列组成,一列是 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
列表包含一些有效的英语单词,例如:
- f*ck
- 已更改
- 惊讶
- 女朋友
- 头像
- 不再
当然还有更多。即使手动检查这些词是否存在于 words.words()
它 returns False
中。我最初尝试对我的文本进行词干处理,但这产生了一些词根,看起来不正确,这就是为什么决定对它们进行词形还原的原因。
Python有没有一个图书馆有所有英文单词的词干版本?我想这会大大加快我的脚本速度。
我的原始数据框大约有 9000 行,清理数据集后有超过 500 万个标记化单词和大约 110.000 个唯一单词。 'words.words()is containing 236736 words, so checking if those 110.000 words are within
words.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]