Статьи

Методы лингвистического анализа данных (анализ текста)

В выходные я встретил студентов, изучающих лингвистику. Методы лингвистики очень важны для поиска текста и интеллектуального анализа данных. Вот почему, на мой взгляд, лингвистика также является очень важной частью веб-науки. Я всегда обеспокоен тем, что большинство людей, занимающихся веб-наукой, на самом деле являются компьютерными учеными, и что значительная часть потенциала в веб-науке теряется, если не обращать внимания на все дисциплины, которые могут внести вклад в веб-науку!

Вот почему я пытался научить лингвистов некоторому основному питону, чтобы провести некоторый базовый анализ литературы. Следующий скрипт, который скорее взломан, чем красивый код, может быть использован для анализа текстов разными авторами. Будет отображаться следующая статистика:

  • Подсчитайте, сколько слов в тексте
  • посчитай сколько предложений
  • Подсчитать среднее количество слов в предложении
  • Подсчитайте, сколько разных слов в тексте
  • Посчитайте, сколько раз каждое слово появляется
  • Посчитайте, сколько слов появляется только один, два, три раза и так далее …
  • Показать самый длинный аромат в тексте

Вы могли бы задавать еще более интересные вопросы и анализировать тексты разных веков, языков и делать много интересного! Я информатик / математик, я не знаю, какие вопросы задавать. Так что, если вы лингвист, не стесняйтесь давать мне отзывы и предлагать еще несколько интересных вопросов (-:

Немного статистики я подсчитал

ulysses
264965 слов в 27771 предложениях
==> 9,54 слова в предложении

30086 разных слов
каждое слово употреблялось в среднем 8,82 раза

faust1
30632 слова в 4178 предложениях
==> 7,33 слова в предложении

6337 разных слов
==> каждое слово использовалось в среднем 4,83 раза

faust2
44534 слова в 5600 предложениях
==> 7,95 слова в предложении

10180 разных слов
==> каждое слово использовалось в среднем 4,39 раза

отказ

Я знаю, что это еще не учебник и что я не очень хорошо объясняю код. Честно говоря, я вообще не объясняю код. Это печально. Когда я пытался учить питона лингвистам, я начинал так, как вы всегда начинаете: « Это цикл, а это список. Теперь давайте пройдемся по списку и покажем элементы … »Мотивации не осталось. Сценарий ниже был создан после того, как я понял, что кодирование не должно быть абстрактным, и нужно использовать интересный пример.

Если людям интересно (пожалуйста, сообщите мне об этом в комментариях!), Я рассмотрю возможность создания учебника по питону для лингвистов, который будет начинаться с небольших сценариев, выполняющих полезные вещи.

кстати, вы можете скачать тексты, которые я использовал для анализа в следующих местах

  • Улисс
  • Фауст 1
  • фауст 2

    # this code is licenced under creative commons licence as long as you 
    # cite the author: Rene Pickhardt / www.rene-pickhardt.de 
     
    # adds leading zeros to a string so all result strings can be ordered
    def makeSortable(w):
    	l = len(w)
    	tmp = ""
    	for i in range(5-l):
    		tmp = tmp + "0"
    	tmp = tmp + w
    	return tmp
     
    #replaces all kind of structures passed in l in a text s with the 2nd argument
    def removeDelimiter(s,new,l):
    	for c in l:
    		s = s.replace(c, new);
    	return s;
     
    def analyzeWords(s):
    	s = removeDelimiter(s," ",[".",",",";","_","-",":","!","?",""",")","("])
    	wordlist = s.split()
     
    	dictionary = {}
    	for word in wordlist:
    		if word in dictionary:
    			tmp = dictionary[word]
    			dictionary[word]=tmp+1
    		else:
    			dictionary[word]=1
     
    	l = [makeSortable(str(dictionary[k])) + " # " + k for k in dictionary.keys()]
     
    	for w in sorted(l):
    		print w
    	count = {}
     
    	for k in dictionary.keys():
    		if dictionary[k] in count: 
    			tmp = count[dictionary[k]]
    			count[dictionary[k]] = tmp + 1
    		else:
    			count[dictionary[k]] = 1
    	for k in sorted(count.keys()):
    		print str(count[k]) + " words appear " + str(k) + " times"
     
    def differentWords(s):
    	s = removeDelimiter(s," ",[".",",",";","_","-",":","!","?",""",")","("])
    	wordlist = s.split()
    	count = 0
    	dictionary = {}
    	for word in wordlist:
    		if word in dictionary:
    			tmp = dictionary[word]
    			dictionary[word]=tmp+1
    		else:
    			dictionary[word]=1
    			count = count + 1
    	print str(count) + " different words"
    	print "every word was used " + str(float(len(wordlist))/float(count)) + " times on average"	
    	return count
     
     
    def analyzeSentences(s):
    	s = removeDelimiter(s,".",[".",";",":","!","?"])
    	sentenceList = s.split(".")
    	wordList = s.split()
    	wordCount = len(wordList)
    	sentenceCount = len(sentenceList)
    	print str(wordCount) + " words in " + str(sentenceCount) + " sentences ==> " + str(float(wordCount)/float(sentenceCount)) + " words per sentence"	
     
    	max = 0
    	satz = ""
    	for w in sentenceList:
    		if len(w) > max:
    			max = len(w);
    			satz = w;
    	print satz + "laenge " + str(len(satz))
     
    texts = ["ulysses.txt","faust1.txt","faust2.txt"]
    for text in texts:
    	print text
    	datei = open(text,'r')
    	s = datei.read().lower()
    	analyzeSentences(s)
    	differentWords(s)
    	analyzeWords(s)
    	datei.close()
    
    


    Если вы вызываете этот скрипт getstats.py на компьютере с Linux, вы можете передать вывод непосредственно в файл, с которым вы можете работать дальше, используя

    python getstats.py> out.txt