Формируйте биграммы в Pandas DataFrame не только слова рядом друг с другом

#python #pandas #nltk #n-gram

#python #pandas #nltk #n-грамм

Вопрос:

У меня есть огромный, но простой фрейм данных Pandas. строки выглядят так:

 index   Text
1   This is a sample text
2   I am a test text
3   this is a test
  

Я хочу создавать биграммы для каждой строки. Что я сделал:

 from nltk.collocations import *

def create_bigram(word_list):
    finder = BigramCollocationFinder.from_words(word_list)
    return finder.ngram_fd.items()

test_str = "This is a sample text".split()
create_bigram(test_str)
  

Который возвращает:

 [(('This', 'is'), 1),
 (('is', 'a'), 1),
 (('a', 'sample'), 1),
 (('sample', 'text'), 1)]
  

Но я хочу зарегистрировать все появления каждого слова в каждой строке, а не только слов рядом друг с другом.

Вот так:

 index   Bigrams
1   (this, is), (this, a), (this, sample), (this, text), (is, a), (is, sample), (is, text)...
  

и так далее…

Я хочу, чтобы это позволяло видеть, как часто слова появляются вместе в одной строке фрейма данных.

Есть ли какая-то функция по умолчанию от nltk (или других библиотек nlp) для этого или я должен сделать это самостоятельно?

Я не могу найти ничего, кроме биграмм или триграмм или нграмм, но все они выполняют вычисления только относительно своих прямых соседей, я прав?

И выполнение простого вложенного цикла for для более чем 300 000 строк более длинного текста, чем «Это образец текста», занимает довольно много времени, чтобы вычислить каждый внешний вид…

Редактировать: почему-то мне хочется пропустить очевидное, но я не могу этого увидеть.

Ответ №1:

Попробуй это:

 from itertools import permutations
import pandas as pd


def create_bigram(word_list):
    split_test_str = word_list.split()
    perms = [','.join(element) for element in permutations(split_test_str, 2)]   
    df = pd.DataFrame(data=[perms])
    print(df)


test_str = 'This is a sample text'
create_bigram(test_str)
  

Самый простой способ — создать перестановку вашей строки, чтобы получить желаемый результат.

Это возможно с помощью перестановки функций itertools . Подробнее о функции можно прочитать на https://docs.python.org/3/library/itertools.html

Комментарии:

1. @XEmporea помогло ли вам это?