Условное распределение частот пользовательской биграммы в Python NLTK - PullRequest
0 голосов
/ 08 июня 2018

Я хочу построить график, основанный на частоте появления определенной биграммы (естественной истории) в моем текстовом корпусе (т.е. у меня есть несколько сотен файлов).Пример в Книге NLTK (глава 2) работает только с униграммами, потому что он использует метод .startswith () в условной проверке:

   from nltk.corpus import inaugural
   cfd = nltk.ConditionalFreqDist(
        (target, fileid[:4])
        for fileid in inaugural.fileids()
        for w in inaugural.words(fileid)
        for target in ['america', 'citizen']
        if w.lower().startswith(target))

Как я могу изменить эту программу, чтобы она работалас биграммами тоже?Заранее спасибо!

1 Ответ

0 голосов
/ 08 июня 2018

Вы можете попытаться создать решение на основе приведенного ниже кода.

from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd
import matplotlib.pyplot as plt

Doc1 = 'Natural history is a domain of inquiry involving organisms including animals, fungi and plants in their environment; leaning more towards observational than experimental methods of study. A person who studies natural history is called a naturalist or natural historian'
Doc2 = 'Natural history encompasses scientific research but is not limited to it.'
Doc3 = 'It involves the systematic study of any category of natural objects or organisms'
Doc4 = "So while it dates from studies in the ancient Greco-Roman world and the mediaeval Arabic world, through to European Renaissance naturalists working in near isolation, today's natural history is a cross discipline umbrella of many specialty sciences"
my_vocabulary= ['natural history', 'natural historian', 'scientific research', 'natural objects', 'European Renaissance']  

# Create a list of all documents
docs = [Doc1, Doc2, Doc3, Doc4]
docs = [doc.lower() for doc in docs] 

# Train CountVectorizer using a list of bigrams
vectorizer = CountVectorizer(ngram_range=(2, 3))
vectorizer.fit(my_vocabulary)

# Calculate term frequency in docs and convert to a data frame
term_f = vectorizer.transform(docs)
df_freqs = pd.DataFrame(term_f.toarray(), columns=vectorizer.get_feature_names())
df_freqs.index = ['Doc{}'.format(i) for i, doc in enumerate(docs)]

# Plot the frequency of "natural history"
df_freqs['natural history'].plot.bar()
plt.ylabel('Frequency')
plt.title('Frequency of "natural history" in Docs')

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...