В Python я бы использовал библиотеку NLTK , чтобы сначала классифицировать предложение.
Например:
пожалуйста, дайте мне 2 бутерброда и пиццу
даст помеченный результат как
пожалуйста / NN дай / VBP me / PRP 2 / бутерброды с CD / NNS и / CC a / DT pizzas / NN
- пожалуйста, дайте мне три бутерброда и пиццу
пожалуйста / NN дай / VBP me / PRP три / бутерброды с CD / NNS и / CC пиццы / NNS
Используя тэг, я уберу утверждение. (Сохранение / CD, / DT, / NN и / NNS)
- пожалуйста / NN 2 / бутерброды с CD / NNS a / DT pizzas / NN
- пожалуйста / NN три / CD бутерброды / NNS пиццы / NNS
найти первое вхождение / CD и, если не первое / DT, а если не первое / NN .. удалить все начальные из него
- 2 / CD бутерброды / NNS a / DT pizzas / NN
- три / CD бутерброды / пицца NNS / NNS
Рассмотрим / DT как 1, а также если между / NN и / NNS нет / CD и / DT, то я бы посчитал 1 между ними
окончательный результат ниже того, который вы анализируете в нужном формате.
- 2, бутерброды, 1, пицца
- три, бутерброды, 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 пицца