Код для создания надежной языковой модели из моего собственного корпуса - PullRequest
0 голосов
/ 14 октября 2018

У меня есть набор предложений в определенной области.Я ищу код / ​​пакет с открытым исходным кодом, который я могу предоставить данные, и он создаст хорошую, надежную языковую модель.(Имеется в виду, учитывая контекст, знать вероятность для каждого слова).

Есть ли такой код / ​​проект?

Я видел этот репозиторий github: https://github.com/rafaljozefowicz/lm,, но это не такне работает.

Ответы [ 2 ]

0 голосов
/ 05 мая 2019

Вы можете попробовать word_language_model из примеров PyTorch.Просто может быть проблема, если у вас большой корпус.Они загружают все данные в память.

0 голосов
/ 14 октября 2018

Я рекомендую написать собственную базовую реализацию.Для начала нам понадобятся несколько предложений:

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

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

...