'word' 不在语料库中的词汇中,单词仅在 gensim 库中显示在单个列表中

'word' not in Vocabulary in a corpus with words shown in a single list only in gensim library

社区成员大家好,

目前我正在实现Word2Vec算法

首先,我提取了数据(句子),将句子打断并拆分为标记(单词),删除标点符号并将标记存储在一个列表中。该列表基本上包含单词。然后我计算了单词的频率,然后根据频率计算了它的出现。结果是一个列表。

接下来,我尝试使用 gensim 加载模型。但是,我遇到了一个问题。问题是关于 the word is not in the vocabulary。代码片段,无论我尝试过如下。

import nltk, re, gensim
import string
from collections import Counter
from string import punctuation
from nltk.tokenize import word_tokenize
from gensim.models import Word2Vec
from nltk.corpus import gutenberg, stopwords

def preprocessing():
    raw_data = (gutenberg.raw('shakespeare-hamlet.txt'))
    tokens = word_tokenize(raw_data)
    tokens = [w.lower() for w in tokens]
    table = str.maketrans('', '', string.punctuation)
    stripped = [w.translate(table) for w in tokens]
    global words
    words = [word for word in stripped if word.isalpha()]
    sw = (stopwords.words('english'))
    sw1= (['.', ',', '"', '?', '!', ':', ';', '(', ')', '[', ']', '{', '}'])
    sw2= (['for', 'on', 'ed', 'es', 'ing', 'of', 'd', 'is', 'has', 'have', 'been', 'had', 'was', 'are', 'were', 'a', 'an', 'the', 't', 's', 'than', 'that', 'it', '&', 'and', 'where', 'there', 'he', 'she', 'i', 'and', 'with', 'it', 'to', 'shall', 'why', 'ham'])
    stop=sw+sw1+sw2
    words = [w for w in words if not w in stop]
preprocessing()

def freq_count():
    fd = nltk.FreqDist(words)
    print(fd.most_common())
    freq_count()
def word_embedding():
    for i in range(len(words)):
        model = Word2Vec(words, size = 100, sg = 1, window = 3, min_count = 1, iter = 10, workers = 4)
        model.init_sims(replace = True)
        model.save('word2vec_model')
        model = Word2Vec.load('word2vec_model')
        similarities = model.wv.most_similar('hamlet')
        for word, score in similarities:
            print(word , score)
word_embedding()

注意:我在 Windows OS 中使用 Python 3.7。从syntax of gensim开始,建议使用句子拆分成token并应用它们来构建和训练模型。我的问题是如何将其应用于仅包含单词的单个列表的语料库。在模型训练期间,我也使用列表指定了单词,即 [words]。

传递给 Word2Vec 的第一个参数需要一个句子列表。您正在传递单词列表

import nltk
import re
import gensim
import string
from collections import Counter
from string import punctuation
from nltk.tokenize import word_tokenize
from gensim.models import Word2Vec
from nltk.corpus import gutenberg, stopwords


def preprocessing():
    raw_data = (gutenberg.raw('shakespeare-hamlet.txt'))
    tokens = word_tokenize(raw_data)
    tokens = [w.lower() for w in tokens]
    table = str.maketrans('', '', string.punctuation)
    stripped = [w.translate(table) for w in tokens]
    global words
    words = [word for word in stripped if word.isalpha()]
    sw = (stopwords.words('english'))
    sw1 = (['.', ',', '"', '?', '!', ':', ';', '(', ')', '[', ']', '{', '}'])
    sw2 = (['for', 'on', 'ed', 'es', 'ing', 'of', 'd', 'is', 'has', 'have', 'been', 'had', 'was', 'are', 'were', 'a', 'an', 'the', 't',
            's', 'than', 'that', 'it', '&', 'and', 'where', 'there', 'he', 'she', 'i', 'and', 'with', 'it', 'to', 'shall', 'why', 'ham'])
    stop = sw + sw1 + sw2
    words = [w for w in words if not w in stop]


preprocessing()


def freq_count():
    fd = nltk.FreqDist(words)
    print(fd.most_common())
    freq_count()


def word_embedding():
    for i in range(len(words)):
        print(type(words))
        #pass words as a list.
        model = Word2Vec([words], size=100, sg=1, window=3,
                        min_count=1, iter=10, workers=4)
        model.init_sims(replace=True)
        model.save('word2vec_model')
        model = Word2Vec.load('word2vec_model')
        similarities = model.wv.most_similar('hamlet')
        for word, score in similarities:
            print(word, score)


word_embedding()

希望这对您有所帮助:)

已经确定了您的主要问题,传递了一个单词列表,其中 Word2Vec 需要一个句子序列(例如单词列表列表) .结果,每个单词被视为一个句子,然后每个字母被视为句子中的一个单词——因此您的最终模型可能只有几十个单字符 'words'。

如果您在 INFO 级别启用了日志记录,并观察了输出——在尝试理解进程或调试问题时总是好的想法——您可能已经注意到报告的 sentences/words 计数已关闭。

此外:

  • 'Hamlet' 大约有 30,000 个单词——但是 gensim Word2Vec 的优化代码有一个每个文本示例(句子)10,000 个单词的实现限制 - 所以通过全文就好像它是一个单一的文本会导致大约 2/3 的文本被默默地忽略。而是将其作为一系列较短的文本(例如句子、段落,甚至 scenes/acts)传递。

  • 30,000 个单词对于良好的单词向量来说非常非常小,这些单词向量通常基于数百万到数十亿个单词的用法示例。使用小型语料库时,有时比默认值 epochs=5 更多的训练次数会有所帮助,有时将向量的维数缩小到默认值 vector_size=100 以下会有所帮助,但您不会获得全部价值的算法,这实际上取决于大量不同的文本示例来实现有意义的单词排列。

  • 通常只有1个或几个用法示例的单词不能从那几个(不一定具有代表性的)示例中得到好的向量,而且大量这样的单词充当noise/interference 在其他词的训练中(即 可以 获得好的词向量)。因此,设置 min_count=1 通常会导致 更差 词向量,对于稀有词和频繁词,在特定于任务的质量度量上,比完全丢弃稀有词的默认值。