создавать любые алгоритмы из фрагментов текста (кусков) - PullRequest
0 голосов
/ 26 июня 2019

У меня есть финальная работа модуля интеллектуального анализа текста, и я испытываю трудности с решением предложенной проблемы, поэтому я попросил поддержки для продолжения работы в python:

Цель состоит в том, чтобы запрограммироватьфункция, которая получает в качестве входных данных пользовательский текст и возвращает фрагменты текста (куски), которые относятся к запрошенным блюдам и количествам.Нет необходимости и не является целью этого упражнения построение классификатора намерения до этой функции, а просто функция, которая, как мы предполагаем, получает фразу с намерением «Order_food».Также нет цели нормализовать результат (например, нет необходимости преобразовывать «три» в «3» или «пиццу» в «пиццу»).Следовательно, это упражнение минимумов.

Por ejemplo: «quiero 3 bocadillos de anchoas y 2 pizzas» →

 {comida:'bocadillo', ingrediente:'anchoas', cantidad:3},
 {comida:'pizza', ingrediente:'null', cantidad:2}

Следовательно, выходные данные функции будут массивомсо словарями из 2 элементов (еда и количество).Если сумма не обнаружена, ее значение будет установлено равным «1» в качестве значения по умолчанию.

наилучшие пожелания.

Ответы [ 2 ]

0 голосов
/ 02 июля 2019
Thank you Vishal. 
see my code. i need to improve.

#Import required modules
import nltk
from nltk.stem import WordNetLemmatizer
from nltk.stem import PorterStemmer
from nltk.corpus import wordnet
from nltk.corpus import stopwords

def chunk_texto(text):
    tokens = nltk.word_tokenize(text)
    mySentance = nltk.pos_tag(tokens)
    newData = ""
    StartCapture = "No"

    stopwords = {'de'}

    #print(mySentance)

    for i in range(len(mySentance)):
        if mySentance[i][1] == "CD" or mySentance[i][1] == "DT":
            StartCapture = "Yes"

        if StartCapture == "Yes":
            if mySentance[i][1] == "NN":
               # newData = newData + mySentance[i][0] + " "
               newData =  " Comida: "+mySentance[i][0]+", " + newData + " "

            if mySentance[i][1] == "NNS":    
                #newData = newData + mySentance[i][0] + " "
                newData =  " Comida: "+mySentance[i][0] +", "+ newData + " "

            if mySentance[i][1] == "FW" and mySentance[i][0] not in stopwords:
               # newData = newData + mySentance[i][0] + " "
               newData =  " ingrediente: "+mySentance[i][0]+", " + newData + " "

            if mySentance[i][1] == "CD":
                #newData = newData + mySentance[i][0] + " "
                newData =  " Quantidade: " + mySentance[i][0] +", "+ newData + " "

            if mySentance[i][1] == "DT":       
                newData = newData + "1 "

    print(newData +'\n')


print(chunk_texto("quiero 3 bocadillos de anchoas y 2 pizzas"))

The result is:

Comida: pizzas,  Quantidade: 2,  ingrediente: anchoas,  Comida: bocadillos,  
Quantidade: 3,      

but I want the result in this way:

{comida:'bocadillo', ingrediente:'anchoas', Quantidade:3},
{comida:'pizza', ingrediente:'null', Quantidade:2}

    enter code here
0 голосов
/ 26 июня 2019

В Python я бы использовал библиотеку NLTK , чтобы сначала классифицировать предложение.

Например:

  1. пожалуйста, дайте мне 2 бутерброда и пиццу

    даст помеченный результат как

пожалуйста / NN дай / VBP me / PRP 2 / бутерброды с CD / NNS и / CC a / DT pizzas / NN

  1. пожалуйста, дайте мне три бутерброда и пиццу

пожалуйста / NN дай / VBP me / PRP три / бутерброды с CD / NNS и / CC пиццы / NNS

Используя тэг, я уберу утверждение. (Сохранение / CD, / DT, / NN и / NNS)

  1. пожалуйста / NN 2 / бутерброды с CD / NNS a / DT pizzas / NN
  2. пожалуйста / NN три / CD бутерброды / NNS пиццы / NNS

найти первое вхождение / CD и, если не первое / DT, а если не первое / NN .. удалить все начальные из него

  1. 2 / CD бутерброды / NNS a / DT pizzas / NN
  2. три / CD бутерброды / пицца NNS / NNS

Рассмотрим / DT как 1, а также если между / NN и / NNS нет / CD и / DT, то я бы посчитал 1 между ними

окончательный результат ниже того, который вы анализируете в нужном формате.

  1. 2, бутерброды, 1, пицца
  2. три, бутерброды, 1, пицца

Это всего лишь пример, который даст вам представление, что существует множество недостатков, таких как множественное вхождение / NN или / NNS в зависимости от передаваемой вами строки. также язык, на котором передается строка.

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

Вы можете очистить данные, перемещаясь по массиву. Ниже приведен пример:

mySentance = [('please', 'VB'), ('give', 'VB'), ('me', 'PRP'), ('2', 'CD'), ('sandwiches', 'NNS'), ('and', 'CC'), ('a', 'DT'), ('pizzas', 'NN')]
newData = ""
StartCapture = "No"

for i in range(len(mySentance)):
    if mySentance[i][1] == "CD" or mySentance[i][1] == "DT":
        StartCapture = "Yes"

    if StartCapture == "Yes":

        if mySentance[i][1] == "CD":
            newData = newData + mySentance[i][0] + " "

        if mySentance[i][1] == "DT":    
            newData = newData + "1 "

        if mySentance[i][1] == "NN":
            newData = newData + mySentance[i][0] + " "

        if mySentance[i][1] == "NNS":    
            newData = newData + mySentance[i][0] + " "
print(newData)

Результат: 2 бутерброда 1 пицца

...