【问题标题】:How to create window/chunk for list of sentences?如何为句子列表创建窗口/块?
【发布时间】:2018-12-26 07:39:25
【问题描述】:

我有句子列表,我想创建skipgram (window size = 3),但我不要希望计数器跨越句子,因为它们都是不相关的。

所以,如果我有句子:

[["my name is John"] , ["This PC is black"]]

三胞胎将是:

[my name is]
[name is john]
[this PC is]
[PC is black]

最好的方法是什么?

【问题讨论】:

    标签: python nlp nltk n-gram language-model


    【解决方案1】:

    这是一个简单的函数。

    def skipgram(corpus, window_size = 3):
        sg = []
        for sent in corpus:
            sent = sent[0].split()
            if len(sent) <= window_size:
                sg.append(sent)
            else:
                for i in range(0, len(sent)-window_size+1):
                    sg.append(sent[i: i+window_size])
        return sg
    
    corpus = [["my name is John"] , ["This PC is black"]]
    skipgram(corups)
    

    【讨论】:

    • 感谢您的回答。您知道如何修改此代码以包含每个输出的计数吗?
    【解决方案2】:

    试试这个!

    from nltk import ngrams
    
    def generate_ngrams(sentences,window_size =3):
        for sentence in sentences:
            yield from ngrams(sentence[0].split(), window_size)
    
    sentences= [["my name is John"] , ["This PC is black"]]
    
    for c in generate_ngrams(sentences,3):
        print (c)
    
    #output:
    ('my', 'name', 'is')
    ('name', 'is', 'John')
    ('This', 'PC', 'is')
    ('PC', 'is', 'black')
    

    【讨论】:

    • 谢谢!给定三元组,word2vec 的 loss_function 有没有很好的实现?
    • @ai_learning 你知道为什么当我运行它时,它不会打印任何东西,只会给出“DeprecationWarning generator 'ngrams' raise StopIteration”消息。我可以忽略该消息,但在执行代码时它仍然不打印任何内容
    • 听起来很有趣。您能否添加更多详细信息并将其作为一个单独的问题提出。
    【解决方案3】:

    你并不真正想要 skipgram 本身,但你想要一个按大小划分的块,试试这个:

    from lazyme import per_chunk
    
    tokens = "my name is John".split()
    list(per_chunk(tokens, 2))
    

    [出]:

    [('my', 'name'), ('is', 'John')]
    

    如果你想要滚动窗口,即ngrams

    from lazyme import per_window
    
    tokens = "my name is John".split()
    list(per_window(tokens, 2))
    

    [出]:

    [('my', 'name'), ('name', 'is'), ('is', 'John')]
    

    在 NLTK 中同样适用于 ngram:

    from nltk import ngrams
    
    tokens = "my name is John".split()
    list(ngrams(tokens, 2))
    

    [出]:

    [('my', 'name'), ('name', 'is'), ('is', 'John')]
    

    如果你想要实际的skipgrams,How to compute skipgrams in python?

    from nltk import skipgrams
    
    tokens = "my name is John".split()
    list(skipgrams(tokens, n=2, k=1))
    

    [出]:

    [('my', 'name'),
     ('my', 'is'),
     ('name', 'is'),
     ('name', 'John'),
     ('is', 'John')]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 2020-01-18
      • 2010-11-25
      • 2013-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多