Python 使用Word2Vec后,如何找到一组文档中的肯定词?

Python 使用Word2Vec后,如何找到一组文档中的肯定词?,python,machine-learning,word2vec,Python,Machine Learning,Word2vec,我正在用Word2Vec进行测试,以找到具有相同含义的单词,到目前为止,它进展顺利,因为肯定单词的列表是准确的。然而,我想知道每个积极的词是在哪里找到的,比如在哪个文件中 我尝试迭代每个文档,并将每个单词与积极单词列表进行比较,如下所示: for i in documents: # iterating the documents for j in i: # iterating the words in the document for k in similar_words

我正在用Word2Vec进行测试,以找到具有相同含义的单词,到目前为止,它进展顺利,因为肯定单词的列表是准确的。然而,我想知道每个积极的词是在哪里找到的,比如在哪个文件中

我尝试迭代每个文档,并将每个单词与积极单词列表进行比较,如下所示:

for i in documents: # iterating the documents
    for j in i: # iterating the words in the document
        for k in similar_words: # iterating the positive words
            if k[0] in j: # k[0] is the positive word, k[1] is the positive value
                print('found word')
这个很好用。然而,有了这一点,积极的词语实际上被删去了,这就是为什么我使用“in”。因此,假设词干向下的肯定词是“ice”,许多词中都包含短语“ice”,文档中可能不止一个词,只有一个是真正的肯定词

使用Word2Vec时,有没有避免词干的方法?或者有没有办法找到找到的每个肯定词的文档编号

更新

下面是我用来训练模型和使用“most_similar()”的代码


在word2vec模型培训期间,可以使用未命名的单词。但在实践中,这样做通常会显著降低结果向量的质量

如果使用预训练向量,则必须使用训练期间使用的相同的词干分析器功能


当你有一本字典时,你可以用
相似的单词制作一本字典,然后在相似的单词中使用
词干(word)匹配单词

在word2vec模型训练期间可以使用未命名的单词。但在实践中,这样做通常会显著降低结果向量的质量

如果使用预训练向量,则必须使用训练期间使用的相同的词干分析器功能


当你找到一本词典时,你可以用
相似的词
制作一本词典,然后用
词干(word)匹配相似词中的词

许多已发表的
Word2Vec
作品,包括谷歌的原始论文,都不需要词干分析。如果你有一个足够大的语料库,每种形式的单词都有很多不同的例子,那么每种形式都会得到一个非常好的向量(与其他形式非常接近),即使是原始的未插入单词。(另一方面,在较小的语料库中,词干分析更有可能发挥作用,因为它允许一个词的所有不同形式将它们的出现贡献给一个好的向量。)

在培训过程中,
Word2Vec
只观察培训文本,寻找它所需的附近单词信息:它不记得单个文档的内容。如果您需要该信息,您需要将其保留在您自己的代码中

您可以遍历所有文档以查找单个单词,就像在代码中一样。(而且,正如@alexey的回答所指出的,您应该比较词干词和词干词,而不仅仅是检查子字符串的包含情况。)


在全文搜索中使用的另一个选项是构建一个“反向索引”,它可以记住每个单词出现在哪些文档中(以及可能出现在每个文档中的位置)。然后,您基本上有一个字典,在其中查找“iced”,并返回一个文档列表,如“doc1、doc17、doc42”。(或者可能是一个文档加位置的列表,如“doc2:pos11,pos91;doc17:pos22,doc42:pos77”。)需要更多的前期工作,并存储反向索引(根据保留的详细程度,反向索引几乎可以与原始文本一样大),但是找到包含单词的文档要比对每个单词进行完整的迭代搜索快得多。

许多已发布的
Word2Vec
作品,包括谷歌的原始论文,都不需要对单词词干进行分析。如果你有一个足够大的语料库,每种形式的单词都有很多不同的例子,那么每种形式都会得到一个非常好的向量(与其他形式非常接近),即使是原始的未插入单词。(另一方面,在较小的语料库中,词干分析更有可能发挥作用,因为它允许一个词的所有不同形式将它们的出现贡献给一个好的向量。)

在培训过程中,
Word2Vec
只观察培训文本,寻找它所需的附近单词信息:它不记得单个文档的内容。如果您需要该信息,您需要将其保留在您自己的代码中

您可以遍历所有文档以查找单个单词,就像在代码中一样。(而且,正如@alexey的回答所指出的,您应该比较词干词和词干词,而不仅仅是检查子字符串的包含情况。)


在全文搜索中使用的另一个选项是构建一个“反向索引”,它可以记住每个单词出现在哪些文档中(以及可能出现在每个文档中的位置)。然后,您基本上有一个字典,在其中查找“iced”,并返回一个文档列表,如“doc1、doc17、doc42”。(或者可能是一个文档加位置的列表,如“doc2:pos11,pos91;doc17:pos22,doc42:pos77”。)需要更多的前期工作,并存储反向索引(根据保留的详细程度,反向索引几乎可以与原始文本一样大),但是找到包含单词的文档要比对每个单词进行完全迭代搜索快得多。

有没有办法找到文档中的肯定单词?您迭代文档术语并检查每个术语的方法非常好。或者你对此有问题吗?我提到的问题是,有些词有不同的词干,例如,如果一个肯定词是“ice”,那么如果一个文档有“ice”、“police”、“magnific”;它将标记它们,而实际上只需要“ice”。这就是为什么你应该使用
stem(word)=positive\u word
而不是
positive\u word in word
。有没有办法找到文档中的肯定词?你迭代文档术语并检查每个术语的方法很好。或者你对此有问题吗?我提到的问题是
def remove_stopwords(texts):
    # Removes stopwords in a text
    return [[word for word in simple_preprocess(str(doc)) if word not in stop_words] for doc in texts]


def sent_to_words(sentences):
    # Tokenize each sentence into a list of words and remove unwanted characters
    for sentence in sentences:
        yield(gensim.utils.simple_preprocess(str(sentence), deacc=True))


df = pd.read_excel('my_file.xlsx')
df.columns = map(str.lower, df.columns)

data = df['Comment Section'].values.tolist()

# Remove the new line character and single quotes
data = [re.sub(r'\s+', ' ', str(sent)) for sent in data]
data = [re.sub("\'", "", str(sent)) for sent in data]

# Convert our data to a list of words. Now, data_words is a 2D array,
# each index contains a list of words
data_words = list(sent_to_words(data))

# Remove the stop words
data_words_nostops = remove_stopwords(data_words)

model = gensim.models.Word2Vec(
            data_words_nostops,
            alpha=0.1,
            min_alpha=0.001,
            size=250,
            window=1,
            min_count=2,
            workers=10)

model.train(data_words_nostops, total_examples=len(data_words_nostops), epochs=10)

print(model.wv.vocab) # At this step, the words are not stemmed

positive = ['injuries', 'fail', 'dangerous', 'oil']

negative = ['train', 'westward', 'goods', 'calgary', 'car', 'automobile', 'appliance']

similar_words_size = array_length(model.wv.most_similar(positive=positive, negative=negative, topn=0))

for i in model.wv.most_similar(positive=positive, negative=negative, topn=similar_words_size):
    if len(i[0]) > 2:
        risks.append(i)
        print(risks) # At this step, the words are stemmed