Синтаксический анализ зависимостей руководства по воспроизведению пищевых графиков

сбор данных
Синтаксический анализ зависимостей руководства по воспроизведению пищевых графиков

Код этой статьи является открытым исходным кодом в:DesertsX/gulius-projects

На официальном сайте Харбинского технологического института Language Cloud есть статья под названием«Использование языкового облака для анализа пищевых привычек пользователей Weibo»В статье упоминается, что с помощью технологий NLP, таких как сегментация слов, тегирование частей речи и анализ синтаксиса зависимостей, из содержимого текста Weibo можно извлечь такие данные, как предпочтения пользователей в еде.

Затем он может комбинировать различные параметры информации, такие как пол пользователя, регион и время в Weibo, чтобы показать много интересных результатов.Например, следующие изображения показывают характерные привычки питания Шанхая, Чунцина и Гуандуна (мужчины):

Так как же добывать вышеуказанную пищу? В исходном тексте дается правило, состоящее из трех условий:Weibo содержит слово «есть» + синтаксическая связь, связанная со словом «есть», — это VOB (отношение глагол-объект) + объект «есть» — существительное., вы можете судить о возникновении пищевого поведения, а затем извлечь объект «съесть» соответствующую пищу.

В качестве пояснения приводятся три примерных предложения: «Я только что съел шоколадку», «Я сегодня ходил в кино, чтобы посмотреть «Шоколадный интенсив», «Я съел шоколадное мороженое».

Предложение разделено на слова, а часть речи отмечена ниже, а дуга зависимости указывает на отношения между каждым словом, такие как отношения подлежащее-сказуемое (SBV), отношения глагол-объект (VOB) и так далее.

Из приведенных выше правил можно судить, что второе предложение не имеет пищевого поведения, поэтому оно фильтруется; из двух других предложений можно извлечь соответственно «шоколад» и «мороженое» (разумеется, третье предложение должно быть более мелкозернистое и более точное «шоколадное».ароматное мороженое», как улучшить приведенные выше правила, об этом позже).

После вышеприведенного введения кажется, что это правило вполне логично, ведь оно должно работать, не так ли? Но по какой-то причине в моей голове внезапно возник смайлик Джеки Ченга, и вот-вот должна была выйти эта фраза...

Итак, я попробовал это с официальной онлайн-демонстрацией Language Cloud: появляется слово «есть» + есть отношение глагол-объект VOB, связанное со «есть» + объект — существительное «n» ... Это соответствует всем условиям слишком идеально.

Потянув его назад, нужно увидеть, что данная логика суждения по-прежнему надежна, так как же ее реализовать? "Чжан Коу Лай" оставил предложение: Разговоры дешевы. Покажите мне код. Однако при поиске исходного текста я не нашел кода реализации.

Давно читал эту статью, но так и не узнал.Попробовал еще раз и обнаружил,что очень просто.Как и ожидалось,это "не сложно для тех,кому сложно,но не сложно для тех,кто с этим сталкивается" , а основной код состоит всего из двух строк.

Ниже приведена часть кода (код этой статьи является открытым исходным кодом в:DesertsX/gulius-projects), не надо было говоритьpip install pyltpЭто своего рода базовая установка сторонних библиотек, а потому может появиться под WindowsMicrosoft Visual C++и другие сопутствующие ошибки, поэтому рекомендуется обратиться к: "Установка и использование Harbin обработки естественного языка ltp под windows10"Второй план статьи выполним для личного опробования.

Тогда введение в pyltp здесь пропущено, см. официальную документациюиспользовать пилтпДостаточно одной статьи.

пылтп этоLTPПакет Python обеспечивает сегментацию слов, тегирование частей речи, распознавание именованных сущностей, анализ зависимостей и тегирование семантических ролей.

После успешной установки pyltp и загрузки соответствующего файла модели LTP модели для сегментации слов, тегирования частей речи и синтаксического анализа зависимостей загружаются соответственно.

import os
from pyltp import Segmentor
LTP_DATA_DIR = '/path/to/your/ltp_data' # ltp模型目录的路径

# 加载分词模型
cws_model_path = os.path.join(LTP_DATA_DIR, 'cws.model')
segmentor = Segmentor()
segmentor.load(cws_model_path)

# 加载词性标注模型
from pyltp import Postagger
pos_model_path = os.path.join(LTP_DATA_DIR, 'pos.model')
postagger = Postagger()
postagger.load(pos_model_path)

# 加载依存句法分析模型
from pyltp import Parser
par_model_path = os.path.join(LTP_DATA_DIR, 'parser.model')
parser = Parser()
parser.load(par_model_path)

Выполните сегментацию слов, тегирование частей речи и анализ синтаксиса зависимостей для каждого предложения и извлеките идентификатор родительского узла дуги зависимости для каждого слова после сегментации (идентификатор корня равен 0, а остальные увеличиваются в соответствии с результат сегментации слова), зависимости и зависимости.Слово, соответствующее родительскому узлу. Наконец, напишите основной код для оценки пищевого поведения.

def extract_food(sentence):
    words = segmentor.segment(sentence)
    print(" ".join(words))
    postags = postagger.postag(words)
    for word, postag in zip(words, postags):
        print(word + '/'+ postag, end=' ')
    arcs = parser.parse(words, postags)

    # 例句:我 刚 吃 了 一 块 巧克力 。
    # 提取依存父节点id
    # 3, 3, 0, 3, 6, 7, 3, 3
    rely_id = [arc.head for arc in arcs]

    # 提取依存关系
    # ['SBV', 'ADV', 'HED', 'RAD', 'ATT', 'ATT', 'VOB', 'WP']
    relation = [arc.relation for arc in arcs]

    # 匹配依存父节点词语
    # ['吃', '吃', 'Root', '吃', '块', '巧克力', '吃', '吃']
    heads = ['Root' if id==0 else words[id-1] for id in rely_id]

    print("\n")
    for i in range(len(words)):
        if postags[i] == 'n' and heads[i] == '吃' and relation[i] == 'VOB':
            print("找到了一种食物:" + words[i])
    print("=" * 30)    

Если вы не понимаете эту часть зависимостей, вы можете прочитать эту статью:Как увидеть вывод результатов разбора зависимостей

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

sentences = ['我刚吃了一块巧克力。', '今天我去电影院看了浓情巧克力。', '我吃了个巧克力味冰淇淋。']
for sent in sentences:
    extract_food(sent)

Выше приведено простое воспроизведение идеи этого блога. Другая проблема заключается в том, что на самом деле то, как люди обсуждают диету, может быть не таким четким и простым, как предложения-примеры.

Возьмем в качестве примера предыдущие идеи сканирования Zhihu, связанные с «#вкусный Ханчжоу#» (Эта тема знает API идеи), есть всевозможные выражения, и пропасть между идеалом и реальностью очевидна.

Кроме того, повторяющийся код, логика извлечения пищевых объектов слишком проста, поэтому слова с префиксами, такими как «шоколадное мороженое» и «уксусная рыба Западного озера», не могут быть извлечены. Конечно, также может быть достигнуто завершение объекта, которое пока здесь не указано.

Код этой статьи является открытым исходным кодом в:DesertsX/gulius-projects