Избавьтесь от униграмм в списке, если они содержатся в биграммах или триграммах python - PullRequest
0 голосов
/ 18 июня 2020

Допустим, у меня есть список n-грамм, и я хочу избавиться от любых униграмм, только если они уже содержатся в биграмме или триграмме в списке.

Например:

ngram_list = ["apple cider", "apple",  "cat man", "cat", "batman", "bat"]

В итоге я хотел бы получить:

ngram_list = ["apple cider", "cat man", "batman", "bat"]

В результате «яблоко» удаляется, потому что оно содержится в биграммы «яблочный сидр» и «кот» удаляются, потому что они содержатся в биграмме «человек-кошка», но «летучая мышь» остается, потому что даже если «летучая мышь» находится в «бэтмен», «бэтмен» не является биграммой или триграммой *. 1009 *

Способ, которым я думал подойти к этому, заключался в том, чтобы выделить только униграммы, l oop через них, и выполнить поиск каждой униграммы в отдельном списке, содержащем только биграммы и триграммы ... Но я Мне просто интересно, как это сделать наиболее эффективно?

1 Ответ

0 голосов
/ 19 июня 2020
• 1000 *
def clean_up(ngrams):
    seen = set()
    for ngram in ngrams:
        if ' ' in ngram:
            seen = seen.union(set(ngram.split()))
    return [ngram for ngram in ngrams if ngram not in seen]


print(clean_up(ngram_list))
# ['apple cider', 'cat man', 'batman', 'bat']

Если бы у вас было намного больше (n + 1) -грамм, чем униграмм, вы могли бы стать быстрее, сохранив некоторые результаты с первой итерации:

def clean_up2(ngrams):
    unigrams = []
    nplus1grams = []
    seen = set()
    for ngram in ngrams:
        if ' ' in ngram:
            nplus1grams.append(ngram)
            seen = seen.union(set(ngram.split()))
        else:
            unigrams.append(ngram)
    return nplus1grams + [unigram for unigram in unigrams if unigram not in seen]


print(clean_up(ngram_list))
# ['apple cider', 'cat man', 'batman', 'bat']

Хотя для этого потребуется немного больше памяти, и он (как правило) не сохранит порядок ввода, но поместит все (уцелевшие) униграммы в конец.

...