Как сгенерировать результат биграмм с наибольшей вероятностью со списком отдельных алфавитных строк в качестве входных данных - PullRequest
0 голосов
/ 24 августа 2018

Я изучаю обработку естественного языка по теме Bigram. На этом этапе у меня возникают трудности с вычислениями на Python, но я стараюсь.

Я буду использовать этот корпус, который не был подвергнут токенизации, в качестве основного набора необработанных данных. Я могу генерировать результаты биграмм, используя модуль nltk. Тем не менее, мой вопрос заключается в том, как вычислить в Python, чтобы генерировать биграммы, содержащие более двух конкретных слов. Более конкретно, я хочу найти все биграммы, доступные в corpus_A, которые содержат слова из word_of_interest.

corpus = ["он не так легко сдается, но чувствует себя одиноким все время, когда у него сильный ум, и он всегда встречает новых друзей, чтобы получить мотивацию и вдохновение к успеху, он твердо стоит за академическую честность, когда он был молодым, он надеется, что Санта подарит ему больше друзей после того, как он станет взрослым, и он перестанет желать, чтобы Санта-Клаус приехал сюда. Он и его друг всегда едят вне дома, но перед едой они чистят руку, чтобы удалить песок "]

word_of_interest = ['santa', 'and', 'hand', 'stand', 'handy', 'sand']

Я хочу получить биграмму для каждого отдельного слова из списка word_of_interest. Далее я хочу получить частоту для каждой доступной биграммы в зависимости от их появления в corpus_A. С доступной частотой, я хочу отсортировать и распечатать биграммы, основываясь на их вероятности от наивысшей к меньшей.

Я опробовал коды из онлайнового поиска, но это не дает мне вывода. Коды указаны ниже:

for i in corpus:
    bigrams_i = BigramCollocationFinder.from_words(corpus, window_size=5)
    bigram_j = lambda i[x] not in i
    x += 1
print(bigram_j)

К сожалению, результат не вернул то, что я планирую достичь.

Пожалуйста, посоветуйте мне. Вывод, который мне нужен, будет иметь биграмму с конкретными словами из word_of_interest и их вероятностями, отсортированными, как показано ниже.

[((santa, clauss), 0.89), ((he, and), 0.67), ((stands, firm), 0.34))] 

1 Ответ

0 голосов
/ 09 сентября 2018

Вы можете попробовать этот код:

import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
vec = TfidfVectorizer(ngram_range=(2,2),use_idf=False)

corpus = ["he is not giving up so easily but he feels lonely all the time his mental is strong and he always meet new friends to get motivation and inspiration to success he stands firm for academic integrity when he was young he hope that santa would give him more friends after he is a grown up man he stops wishing for santa clauss to arrival he and his friend always eat out but they clean their hand to remove sand first before eating"]
word_of_interest = ['santa', 'and', 'hand', 'stands', 'handy', 'sand']
matrix = vec.fit_transform(corpus).toarray()
vocabulary = vec.get_feature_names()

all_bigrams = []
all_frequencies = []
for word in word_of_interest:
    for bigram in vocabulary:
        if word in bigram:
            index = vocabulary.index(bigram)
            tuple_bigram = tuple(bigram.split(' '))
            frequency = matrix[:,index].sum()
            all_bigrams.append(tuple_bigram)
            all_frequencies.append(frequency)

df = pd.DataFrame({'bigram':all_bigrams,'frequency':all_frequencies})
df.sort_values('frequency',inplace=True)
df.head()

Выходные данные - это кадр данных pandas, показывающий биграммы, отсортированные по частоте.

    bigram  frequency
0     (for, santa)   0.109764
19  (stands, firm)   0.109764
18    (he, stands)   0.109764
17   (their, hand)   0.109764
16      (hand, to)   0.109764

Обоснование здесь заключается в том, что TfidfVectorizer подсчитывает, сколько раз токен присутствует в каждом документе корпуса, затем вычисляет частоту, относящуюся к термину, и затем сохраняет эту информацию в столбце, связанном с этим токеном. Индекс этого столбца совпадает с индексом связанного слова в словаре, который извлекается с помощью метода .get_feature_names () в векторизаторе, который уже подходит. Затем вам просто нужно выбрать все строки в матрице, содержащей относительные частоты токенов, и суммировать их по интересующему столбцу.

Цикл for с двойным вложением не идеален, и для него может быть более эффективная реализация. Проблема в том, что get_feature_names возвращает не кортежи, а список строк в форме ['first_token second_token',]. Мне было бы интересно увидеть лучшую реализацию второй половины вышеприведенного кода.

...