#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 помогло ли вам это?