Извлечь основную особенность абзацев, используя word2vec - PullRequest
0 голосов
/ 16 мая 2018

Я только что освоил модель Google word2vec и совершенно не знаком с этой концепцией. я пытаюсь извлечь основную особенность абзаца, используя следующий метод.

from gensim.models.keyedvectors import KeyedVectors
model = KeyedVectors.load_word2vec_format('../../usr/myProject/word2vec/GoogleNews-vectors-negative300.bin', binary=True)

...

for para in paragraph_array:
    para_name = "para_"+ file_name + '{0}'
    sentence_array = d[para_name.format(number_of_paragraphs)] = []

    # Split Paragraph on basis of '.' or ? or !.
    for l in re.split(r"\.|\?|\!", para):
        # Split line into list using space.
        sentence_array.append(l)
        #sentence_array.append(l.split(" "))

     print (model.wv.most_similar(positive=para, topn = 1))

Но я получаю следующую ошибку, в которой говорится, что проверенный абзац не является словом в словаре.

KeyError: 'word \' Республика Гана - это страна в Западной Африке. Он граничит с Кот-д'Ивуаром (также известным как Берег Слоновой Кости) на западе, Буркина-Фасо на севере, Того на востоке и Гвинейским заливом на юге. Слово «Гана» означает «Король-воин», Джексон, Джон Дж. Введение в африканские цивилизации, 2001. Стр. 201. и было источником названия «Гвинея» (через французское гиное), используемого для обозначения западноафриканского побережья ( как в Гвинейском заливе). \ 'не в словаре'

Теперь я знаю, что функция most_similar() ожидает один массив. Но я хотел бы знать, как это можно перевести, чтобы извлечь одну главную особенность или слово, которое отображает основную концепцию абзаца, используя модель word2vec.

Модифицированный

Я изменил приведенный выше код для передачи word_array в метод most_similar(), и я получаю следующую ошибку.

Traceback (последний вызов был последним): Файл "/home/manuelanayantarajeyaraj/PycharmProjects/ChatbotWord2Vec/new_approach.py", строка 108, в print (model.wv.most_simil (positive = word_array, topn = 1)) Файл "/home/manuelanayantarajeyaraj/usr/myProject/my_project/lib/python3.5/site-packages/gensim/models/keyedvectors.py", строка 361, в большинстве_подобных для слова, вес в положительном + отрицательном: ValueError: слишком много значений для распаковки (ожидается 2)

Модифицированная реализация

for sentence in sentence_array:
    if sentence:
        for w in re.split(r"\.|\?|\!|\@|\#|\$|\%|\^|\&|\*|\(|\)|\-",   sentence):
            split_word = w.split(" ")
            if split_word:
                word_array.append(split_word)
print(model.wv.most_similar(positive=word_array, topn=1))

Любые предложения на этот счет приветствуются.

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Я переработал весь код, добавив контрольные точки, чтобы избежать хранения пустых строк в объектах на каждом уровне, начиная с абзацев, предложений и заканчивая словами.

Рабочая версия

for file_name in files:
    file_identifier = file_name
    file_array = file_dictionary[file_identifier] =[]
    #file_array = file_dictionary[file_name.format((file_count))] = []
    file_path = directory_path+'/'+file_name

    with open(file_path) as f:
        #Level 2 Intents : Each file's main intent (One for each file)
        first_line = f.readline()
        print ()
        print("Level 2 Intent for ", c, " : ", first_line)

        #Level 3 Intents : Each paragraph's main intent (one for each para)

        paragraph_count = 0

        data = f.read()
        splat = data.split("\n")
        paragraph_array = []

        for number, paragraph in enumerate(splat, 1):
            paragraph_identifier = file_name + "_paragraph_" + str(paragraph_count)
            #print(paragraph_identifier)
            paragraph_array = paragraph_dictionary[paragraph_identifier.format(paragraph_count)] = []
            if paragraph :
                paragraph_array.append(paragraph)
            paragraph_count += 1
            if len(paragraph_array) >0 :
                file_array.append(paragraph_array)

            # Level 4 Intents : Each sentence's main intent (one for each sentence)

            sentence_count = 0
            sentence_array = []

            for sentence in paragraph_array:
                for line in re.split(r"\.|\?|\!", sentence):
                    sentence_identifier = paragraph_identifier + "_sentence_" + str(sentence_count)
                    sentence_array = sentence_dictionary[sentence_identifier.format(sentence_count)] = []
                    if line :
                        sentence_array.append(line)
                        sentence_count += 1

                    # Level 5 Intents : Each word with a certain level of prominance (one for each prominant word)

                    word_count = 0
                    word_array = []

                    for words in sentence_array:
                        for word in re.split(r" ", words):
                            word_identifier = sentence_identifier + "_word_" + str(word_count)
                            word_array = word_dictionary[word_identifier.format(word_count)] = []

                            if word :
                                word_array.append(word)
                                word_count += 1

Код для доступа к элементам словаря

#Accessing any paragraph array can be done as follows
print (paragraph_dictionary['S08_set4_a5.txt.clean_paragraph_4'])

#Accessing any sentence corresponding to a paragraph
print (sentence_dictionary['S08_set4_a5.txt.clean_paragraph_4_sentence_1'])

#Accessing any word corresponding to a sentence
print (word_dictionary['S08_set4_a5.txt.clean_paragraph_4_sentence_1_word_3'])

Вывод

['Celsius was born in Uppsala in Sweden. He was professor of astronomy at Uppsala University from 1730 to 1744, but traveled from 1732 to 1735 visiting notable observatories in Germany, Italy and France.']
[' He was professor of astronomy at Uppsala University from 1730 to 1744, but traveled from 1732 to 1735 visiting notable observatories in Germany, Italy and France']
['of']
0 голосов
/ 17 мая 2018

Ваша ошибка указывает на то, что вы просматриваете всю строку ('The Republic of Ghana is a country in West Africa. It borders Côte d\'Ivoire (also known as Ivory Coast) to the west, Burkina Faso to the north, Togo to the east, and the Gulf of Guinea to the south. The word "Ghana" means "Warrior King", Jackson, John G. Introduction to African Civilizations, 2001. Page 201. and was the source of the name "Guinea" (via French Guinoye) used to refer to the West African coast (as in Gulf of Guinea).'), как если бы это было одно слово, и это слово отсутствует.

Метод most_similar() может взять список положительных примеров, но вам придется разбить эту строку на слова, которые, вероятно, находятся внутри набора слов-векторов. (Скорее всего, это приведет к разбивке пробелов и знаков препинания, чтобы соответствовать тому, что Google сделал для подготовки этого набора слов-векторов.)

В этом случае most_similar() будет усреднять векторы всех заданных слов вместе и возвращать остальные слова, близкие к этому среднему.

Неясно, действительно ли это отражает «основную концепцию» текста. Хотя векторы слов могут оказаться полезными для идентификации концепций текста, это не является их основной или единственной функцией и не является автоматическим. Возможно, вы захотите отфильтровать набор слов до тех, которые уникальны каким-либо другим способом - например, менее распространенным в целом или иным образом влияющим в некотором корпусно-зависимом измерении (например, TF / IDF).

...