【问题标题】:Calculate a measure between keywords and each word of a textfile计算关键字和文本文件的每个单词之间的度量
【发布时间】:2020-10-09 12:25:17
【问题描述】:

我有两个 .txt 文件,一个包含 200.000 个单词,第二个包含 100 个关键字(每行一个)。我想计算 100 个关键字中的每一个与我的 200.000 个单词中的每个单词之间的余弦相似度,并为每个关键字显示得分最高的 50 个单词。

这是我所做的,注意 Bertclient 是我用来提取向量的:

from sklearn.metrics.pairwise import cosine_similarity
from bert_serving.client import BertClient
bc = BertClient()

# Process words
with open("./words.txt", "r", encoding='utf8') as textfile:
    words = textfile.read().split()
    
with open("./100_keywords.txt", "r", encoding='utf8') as keyword_file:
    for keyword in keyword_file:
        vector_key = bc.encode([keyword])
        for w in words:
            vector_word = bc.encode([w])
            cosine_lib = cosine_similarity(vector_key,vector_word)
            print (cosine_lib)

这会继续运行,但不会停止。知道如何纠正这个问题吗?

【问题讨论】:

    标签: python python-3.x cosine-similarity


    【解决方案1】:

    我对伯特一无所知...但是导入和运行有些可疑。我认为您没有正确安装它或其他东西。我试图 pip 安装它并运行它:

    from sklearn.metrics.pairwise import cosine_similarity
    from bert_serving.client import BertClient
    bc = BertClient()
    print ('done importing')
    

    它从未完成。看看 bert 的 dox,看看是否需要做其他事情。

    在您的代码中,通常最好先读取所有内容,然后进行处理,因此请先分别导入两个列表,然后检查一些值,例如:

    # check first five
    print(words[:5])
    

    此外,您需要寻找一种不同的方法来进行比较,而不是使用嵌套循环。您现在意识到您每次都在为每个关键字转换words 中的每个单词,这不是必需的,而且可能真的很慢。我建议您使用字典将单词与编码配对,或者如果您对此更满意,请使用其中的(单词,编码)创建一个元组列表。

    在您启动并运行 Bert 后,如果这没有意义,请回复我。

    --编辑--

    这里有一段代码,其工作方式与您想做的类似。根据您的需要,您可以选择很多方法来保存结果等,但这应该可以帮助您开始使用“fake bert”

    from operator import itemgetter
    
    # fake bert  ... just return something like length
    def bert(word):
        return len(word)
    
    # a fake compare function that will compare "bert" conversions
    def bert_compare(x, y):
        return abs(x-y)
    
    # Process words
    with open("./word_data_file.txt", "r", encoding='utf8') as textfile:
        words = textfile.read().split()
    
    # Process keywords
    with open("./keywords.txt", "r", encoding='utf8') as keyword_file:
        keywords = keyword_file.read().split()
    
    # encode the words and put result in dictionary
    encoded_words = {}
    for word in words:
        encoded_words[word] = bert(word)
    
    encoded_keywords = {}
    for word in keywords:
        encoded_keywords[word] = bert(word)
    
    # let's use our bert conversions to find which keyword is most similar in
    # length to the word
    
    for word in encoded_words.keys():
        result = []   # make a new result set for each pass
        for kword in encoded_keywords.keys():
            similarity = bert_compare(encoded_words.get(word), encoded_keywords.get(kword))
            # stuff the answer into a tuple that can be sorted
            result.append((word, kword, similarity))
        result.sort(key=itemgetter(2))
        print(f'the keyword with the closest size to {result[0][0]} is {result[0][1]}')
    

    【讨论】:

    • 您好,感谢您的回复。我的 bert 正在运行,因为我在其他地方对其进行了测试,并且我有我需要的单词的向量。您需要使用您的 Bert 模型的路径在您的 cmd 上启动服务器...您可以在此处找到所需的文档,如果您愿意,可以阅读它:towardsdatascience.com/… 我还测试了 cozine 相似性功能,它与bert-client完美配合。我现在需要的是如何对每个单词进行循环以及如何对结果进行排序。
    • 事实证明我的文本文件将被一个包含超过 200.000 个关键字的文件替换,这意味着我需要计算 100 个第一个关键字和 200.000 个关键字之间的余弦相似度新文件。
    • 我只想感谢您花时间写下您的答案,即使您甚至无法重新创建它。这正是我所需要的,而且效果很好。我的代码中缺少这种组织,我正在努力。再次感谢您让我的周末更加美好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 2022-01-01
    • 2014-03-26
    • 2011-09-05
    • 1970-01-01
    • 2015-09-30
    相关资源
    最近更新 更多