Я рекомендую написать собственную базовую реализацию.Для начала нам понадобятся несколько предложений:
import nltk
from nltk.corpus import brown
words = brown.words()
total_words = len(words)
sentences = list(brown.sents())
sentences
теперь список списков.Каждый подсписок представляет предложение с каждым словом в качестве элемента.Теперь вам нужно решить, хотите ли вы включить пунктуацию в вашу модель.Если вы хотите удалить его, попробуйте что-то вроде следующего:
punctuation = [",", ".", ":", ";", "!", "?"]
for i, sentence in enumerate(sentences.copy()):
new_sentence = [word for word in sentence if word not in punctuation]
sentences[i] = new_sentence
Далее вам нужно решить, заботитесь ли вы о капитализации или нет.Если вас это не волнует, вы можете удалить его следующим образом:
for i, sentence in enumerate(sentences.copy()):
new_sentence = list()
for j, word in enumerate(sentence.copy()):
new_word = word.lower() # Lower case all characters in word
new_sentence.append(new_word)
sentences[i] = new_sentence
Далее нам понадобятся специальные start и end слова для представления слов, которыедействительны в начале и в конце предложений.Вы должны выбрать начало и конец слова, которых нет в ваших тренировочных данных.
start = ["<<START>>"]
end = ["<<END>>"]
for i, sentence in enumerate(sentences.copy()):
new_sentence = start + sentence + end
sentences[i] = new_sentence
Теперь давайте посчитаем униграммы.Униграмма - это последовательность одного слова в предложении.Да, модель униграммы - это просто распределение частот каждого слова в корпусе:
new_words = list()
for sentence in sentences:
for word in sentence:
new_words.append(word)
unigram_fdist = nltk.FreqDist(new_words)
И теперь пришло время считать биграммы.Биграмм - это последовательность двух слов в предложении.Итак, для предложения «Я морж» мы имеем следующие биграммы: «<> i» , «Я есть» , "am" , "морж" и "морж <>" .
bigrams = list()
for sentence in sentences:
new_bigrams = nltk.bigrams(sentence)
bigrams += new_bigrams
Теперь мы можем создать распределение частот:
bigram_fdist = nltk.ConditionalFreqDist(bigrams)
Наконец, мы хотим знать вероятность каждого слова в модели:
def getUnigramProbability(word):
if word in unigram_fdist:
return unigram_fdist[word]/total_words
else:
return -1 # You should figure out how you want to handle out-of-vocabulary words
def getBigramProbability(word1, word2):
if word1 not in bigram_fdist:
return -1 # You should figure out how you want to handle out-of-vocabulary words
elif word2 not in bigram_fdist[word1]:
# i.e. "word1 word2" never occurs in the corpus
return getUnigramProbability(word2)
else:
bigram_frequency = bigram_fdist[word1][word2]
unigram_frequency = unigram_fdist[word1]
bigram_probability = bigram_frequency / unigram_frequency
return bigram_probability
Хотя это не фреймворк / библиотека, которая просто строит модель для вас, янадеюсь, увидев этот код, демистифицировано то, что происходит в языковой модели.