语料库的词汇表中没有单词,单词仅在gensim库中显示在单个列表中

时间:2018-08-21 09:23:24

标签: python-3.x nltk gensim word2vec nltk-book

您好社区成员,

目前,我正在实现Word2Vec算法。

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

接下来,我正在尝试使用gensim加载模型。但是,我面临一个问题。问题与if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 0); } } 有关。该代码段如下所示。

the word is not in the vocabulary

注意:我在Windows OS中使用Python 3.7。从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() 开始,建议使用句子并将其拆分为标记,然后将其应用以构建和训练模型。我的问题是,如何将其应用于仅包含单词的单个列表的语料库。在模型训练期间,我也使用列表指定了单词,即[words]。

2 个答案:

答案 0 :(得分:2)

传递给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()

希望这会有所帮助:)

答案 1 :(得分:2)

Madhan Varadhodiyil's answer已经确定了您的主要问题,通过传递一个单词列表,其中Word2Vec需要一个句子序列(例如单词列表)。结果,每个单词都被视为一个句子,然后每个字母都被视为一个句子中的一个单词-因此,您得到的模型可能只有几十个单字符“单词”。

如果您启用了INFO级别的日志记录功能,并观看了输出-试图理解流程或调试问题时始终是个好主意-您可能已经注意到报告的句子/单词计数不正确。

另外:

  • 'Hamlet'大约有30,000个单词-但是gensim Word2Vec的优化代码的每个文本示例(句子)的实现限制为10,000个单词-因此,将全文当作单个文本将导致大约2/3的文本被静默忽略。而是将其作为一系列较短的文本(例如句子,段落甚至场景/动作)传递。

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

  • 通常只有1个或几个用法示例的单词不能从这几个(不必要地代表)示例中获得良好的向量,此外,大量此类单词在训练中会产生噪音/干扰换句话说(可以获得好的单词向量)。因此,针对min_count=1设置字词向量通常会导致更差的字向量,无论是稀有字还是频繁字,都是基于特定于任务的质量度量,而不是默认完全丢弃稀有字。