首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Gensim.Phrases从一个句子中提取重复的多个词,我做错了什么?

用Gensim.Phrases从一个句子中提取重复的多个词,我做错了什么?
EN

Stack Overflow用户
提问于 2021-10-30 02:49:10
回答 1查看 129关注 0票数 1

我想首先使用Gensim的词组从一个句子中提取重复的n-克,然后使用这些来去除句子中的重复。就像这样:

输入:“测试此测试--这里再次测试--这里再次测试 期望输出:“在这里再次测试此测试”

我的代码似乎使用多个句子生成了最多5克的代码,但是每当我传递给它一个句子(甚至是一个满是相同句子的列表)时,它都不起作用。如果我传递一个句子,它就会把单词分割成字符。如果我把满是同一个句子的列表传递给我,它就会检测出无稽之谈,就像不重复的单词,而不会检测重复的单词。

我认为我的代码是有效的,因为我使用了大约30 my的文本,并产生了非常容易理解的n克到n=5,这似乎符合我的预期。不过,我不知道如何判断它的精确程度和回忆。下面是完整的函数,它递归地生成从2到n的所有n克:

代码语言:javascript
复制
def extract_n_grams(documents, maximum_number_of_words_per_group=2, threshold=10, minimum_count=6, should_print=False, should_use_keywords=False):
    from gensim.models import Phrases
    from gensim.models.phrases import Phraser

    tokens = [doc.split(" ") for doc in documents] if type(documents) == list else [documents.split(" ") for _ in range(100)] # this is what I tried

    final_n_grams = []
    for current_n in range(maximum_number_of_words_per_group - 1):
        n_gram = Phrases(tokens, min_count=minimum_count, threshold=threshold, connector_words=connecting_words)

        n_gram_phraser = Phraser(n_gram)

        resulting_tokens = []
        for token in tokens:
            resulting_tokens.append(n_gram_phraser[token])

        current_n_gram_final = []
        for token in resulting_tokens:
            for word in token:
                if '_' in word:
                    # no n_gram should have a comma between words
                    if ',' not in word:
                        word = word.replace('_', ' ')

                        if word not in current_n_gram_final and all([word not in gram for gram in final_n_grams]):
                            current_n_gram_final.append(word)

        tokens = n_gram[tokens]

        final_n_grams.append(current_n_gram_final)

除了尝试重复列表中的句子之外,我还尝试使用NLKT的word_tokenize作为建议的这里。我做错了什么?有更简单的方法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-30 19:28:09

Gensim Phrases类的设计是为了在统计上检测特定的单词是否经常出现在一起,而不是独立地出现,因此将它们组合成一个令牌可能是有用的。

因此,它不太可能对您的示例任务有所帮助,即消除重复的3字['testing', 'again', 'here']运行标记。

首先,它从不消除令牌-只组合它们。因此,如果它看到对联['again', 'here']经常在一起出现,而不是作为单独的'again''here'出现,它会把它变成'again_here',而不是消除它。

但是第二,它并不是对每一个重复的n令牌分组都进行这些组合,只有在大量的训练数据表明,根据threshold配置的数据表明某些对突出时,它才会这样做。(只有在重复运行时,它才能超越对。)你的例子三字分组,['testing', 'again', 'here'],似乎不太可能突出作为一个额外的可能配对的组合。

如果您对哪些令牌/运行令牌需要删除有更严格的定义,那么您可能希望在令牌列表中运行其他Python代码来执行这种去复制。你能用更多的例子更详细地描述一下你想要删除的n-克的种类吗?(他们是只在课文的开头或结尾,还是在中间?它们必须是相邻的,还是可以在整个文本中传播?为什么数据中存在这样的重复,为什么认为删除它们很重要?)

更新:基于对实际目标的注释,在令牌列表中的每个位置检查下一个N标记是否与前一个N标记匹配(因此可以忽略)。例如:

代码语言:javascript
复制
def elide_repeated_ngrams(list_of_tokens):
    return_tokens = [] 
    i = 0
    while i < len(list_of_tokens):
        for candidate_len in range(len(return_tokens)):
            if list_of_tokens[i:i+candidate_len] == return_tokens[-candidate_len:]:
                i = i + candidate_len  # skip the repeat
                break  # begin fresh forward repeat-check
        else:
            # this token not part of any repeat; include & proceed
            return_tokens.append(list_of_tokens[i])
            i += 1
    return return_tokens 

在您的测试用例上:

代码语言:javascript
复制
>>> elide_repeated_ngrams("Testing test this test this testing again here testing again here".split())
['Testing', 'test', 'this', 'testing', 'again', 'here']
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69776426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档