2013-06-26 2 views
-1

У меня есть несколько твитов, которые необходимо обработать. Я пытаюсь найти случаи сообщений, когда это означает какой-то вред для человека. Как я могу идти о достижении этой цели с помощью НЛПКак сопоставить похожие сообщения с помощью NLP

I bought my son a toy gun 
I shot my neighbor with a gun 
I don't like this gun 
I would love to own this gun 
This gun is a very good buy 
Feel like shooting myself with a gun 

В приведенных выше предложений, то второй, шестой один является то, что я хотел бы найти.

+1

В этой области есть много исследований. Вероятно, было бы неплохо начать читать некоторые статьи или главы книг по классификации и семантической обработке. –

+2

Это вы, NSA? –

+0

Лескай получил это. Не беспокойтесь об этом. Просто позвольте NSA справиться с этим. –

ответ

1

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

Тогда вы можете использовать список синонимов «стрелять» («убить», «убить», «ранить» и т. Д.) И «пистолет» («оружие», «винтовка» и т. Д.), Чтобы проверьте, встречаются ли они в этом шаблоне (глагол - предлог - существительное) в каждом предложении.

Будут другие способы выразить ту же идею, например. «Я купил пистолет для стрельбы по моему соседу», где отношение зависимостей различно, и вам также нужно будет обнаружить эти типы зависимостей.

1

Все предложения vpekar хороши. Вот некоторый код python, который по крайней мере проанализирует предложения и посмотрит, содержат ли они глаголы в определенном пользователем наборе слов вреда. Примечание: большинство «вредных слов», вероятно, имеют множественные чувства, многие из которых не могут иметь никакого отношения к вреду. Этот подход не пытается устранить смысл слова.

(Этот код предполагает, что вы NLTK и Stanford CoreNLP)

import os 
import subprocess 
from xml.dom import minidom 
from nltk.corpus import wordnet as wn 

def StanfordCoreNLP_Plain(inFile): 
    #Create the startup info so the java program runs in the background (for windows computers) 
    startupinfo = None 
    if os.name == 'nt': 
     startupinfo = subprocess.STARTUPINFO() 
     startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW 
    #Execute the stanford parser from the command line 
    cmd = ['java', '-Xmx1g','-cp', 'stanford-corenlp-1.3.5.jar;stanford-corenlp-1.3.5-models.jar;xom.jar;joda-time.jar', 'edu.stanford.nlp.pipeline.StanfordCoreNLP', '-annotators', 'tokenize,ssplit,pos', '-file', inFile] 
    output = subprocess.Popen(cmd, stdout=subprocess.PIPE, startupinfo=startupinfo).communicate() 
    outFile = file(inFile[(str(inFile).rfind('\\'))+1:] + '.xml') 
    xmldoc = minidom.parse(outFile) 
    itemlist = xmldoc.getElementsByTagName('sentence') 
    Document = [] 
    #Get the data out of the xml document and into python lists 
    for item in itemlist: 
     SentNum = item.getAttribute('id') 
     sentList = [] 
     tokens = item.getElementsByTagName('token') 
     for d in tokens: 
      word = d.getElementsByTagName('word')[0].firstChild.data 
      pos = d.getElementsByTagName('POS')[0].firstChild.data 
      sentList.append([str(pos.strip()), str(word.strip())]) 
     Document.append(sentList) 
    return Document 

def FindHarmSentence(Document): 
    #Loop through sentences in the document. Look for verbs in the Harm Words Set. 
    VerbTags = ['VBN', 'VB', 'VBZ', 'VBD', 'VBG', 'VBP', 'V'] 
    HarmWords = ("shoot", "kill") 
    ReturnSentences = [] 
    for Sentence in Document: 
     for word in Sentence: 
      if word[0] in VerbTags: 
       try: 
        wordRoot = wn.morphy(word[1],wn.VERB) 
        if wordRoot in HarmWords: 
         print "This message could indicate harm:" , str(Sentence) 
         ReturnSentences.append(Sentence) 
       except: pass 
    return ReturnSentences 

#Assuming your input is a string, we need to put the strings in some file. 
Sentences = "I bought my son a toy gun. I shot my neighbor with a gun. I don't like this gun. I would love to own this gun. This gun is a very good buy. Feel like shooting myself with a gun." 
ProcessFile = "ProcFile.txt" 
OpenProcessFile = open(ProcessFile, 'w') 
OpenProcessFile.write(Sentences) 
OpenProcessFile.close() 

#Sentence split, tokenize, and part of speech tag the data using Stanford Core NLP 
Document = StanfordCoreNLP_Plain(ProcessFile) 

#Find sentences in the document with harm words 
HarmSentences = FindHarmSentence(Document) 

Это выводит следующее:

Это сообщение может указывать на вред: [[ 'PRP', 'I'], ['VBD', 'shot'], ['PRP $', 'my'], ['NN', 'neighse'], ['IN', 'with'], ['DT', 'a'] , ['NN', 'gun'], ['.', '.']]

Это сообщение может указывать на вред: [['NNP', 'Feel'], ['IN', 'like' ], ['VBG', 'стрельба'], ['PRP', 'себя'], ['IN', 'with'], [ 'DT', 'а'], [ 'NN', 'пистолет'], [ ' ''.']]

0

Я бы взглянуть на SenticNet

http://sentic.net/sentics

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

 Смежные вопросы

  • Нет связанных вопросов^_^