您好社区成员,
目前,我正在实现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]。
答案 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
设置字词向量通常会导致更差的字向量,无论是稀有字还是频繁字,都是基于特定于任务的质量度量,而不是默认完全丢弃稀有字。