Все предложения 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', 'пистолет'], [ ' ''.']]
В этой области есть много исследований. Вероятно, было бы неплохо начать читать некоторые статьи или главы книг по классификации и семантической обработке. –
Это вы, NSA? –
Лескай получил это. Не беспокойтесь об этом. Просто позвольте NSA справиться с этим. –