2014-12-03 5 views
1

Я использую пакет python nltk, чтобы найти наиболее часто используемые слова во французском тексте. Я считаю, что на самом деле не работает ... Вот мой код:наиболее часто встречающиеся слова во французском тексте

#-*- coding: utf-8 -*- 

#nltk: package for text analysis 
from nltk.probability import FreqDist 
from nltk.corpus import stopwords 
import nltk 
import tokenize 
import codecs 
import unicodedata 


#output French accents correctly 
def convert_accents(text): 
    return unicodedata.normalize('NFKD', text).encode('ascii', 'ignore') 



### MAIN ### 

#openfile 
text_temp=codecs.open('text.txt','r','utf-8').readlines() 

#put content in a list 
text=[] 
for word in text_temp: 
    word=word.strip().lower() 
    if word!="": 
     text.append(convert_accents(word)) 

#tokenize the list 
text=nltk.tokenize.word_tokenize(str(text)) 

#use FreqDist to get the most frequents words 
fdist = FreqDist() 
for word in text: 
    fdist.inc(word) 
print "BEFORE removing meaningless words" 
print fdist.items()[:10] 

#use stopwords to remove articles and other meaningless words 
for sw in stopwords.words("french"): 
    if fdist.has_key(sw): 
      fdist.pop(sw) 
print "AFTER removing meaningless words" 
print fdist.items()[:10] 

Вот результат:

BEFORE removing meaningless words 
[(',', 85), ('"', 64), ('de', 59), ('la', 47), ('a', 45), ('et', 40), ('qui', 39), ('que', 33), ('les', 30), ('je', 24)] 
AFTER removing meaningless words 
[(',', 85), ('"', 64), ('a', 45), ('les', 30), ('parce', 15), ('veut', 14), ('exigence', 12), ('aussi', 11), ('pense', 11), ('france', 10)] 

Моя проблема заключается в том, что stopwords не отбрасывает все бессмысленные слова. Например, ',' не является словом и должен быть удален, 'les' является статьей и должен быть удален.

Как исправить проблему?

Текст я можно найти на этой странице: http://www.elysee.fr/la-presidence/discours-d-investiture-de-nicolas-sarkozy/

+1

Если 'stopwords', предлагаемый' nltk', вам не подходит, тогда вы должны сделать свой собственный список со стоп-словами, которые хотите удалить, или искать другую библиотеку. Что касается запятых ',' вы можете попробовать 'newstr = oldstr.replace (", "," ")' во всем тексте, перед любой другой работой над ним. – tomasyany

+0

Хорошо для ваших предложений. Но почему функция «nltk stopwords» не выполняет работу, которую она должна выполнять? !!! – rom

+1

Я взглянул на французские 'stopwords' из' nltk', и я бы сказал, что он довольно полный (я также говорю по-французски). Еще несколько слов, таких как «ils», «elles», «les», «leurs» (в основном множественные числа), и это будет сделано. Я догадался, что ребята, написавшие «Stopwords Corpus», который используется в 'nltk', не знали француза так хорошо. Но это не то, что мы можем жаловаться, ведь они дали нам великолепную библиотеку бесплатно! – tomasyany

ответ

4

Обычно его лучшая идея использовать список игнорируемых слов ваших собственных. С этой целью вы можете получить список французских стоп-слов от here. В списке также находится текстовое слово «les». Создайте текстовый файл и используйте файл для удаления стоп-слов из вашего корпуса. Затем для пунктуации вы должны написать функцию удаления пунктуации. Как вы должны это написать, сильно зависит от вашего приложения. Но только чтобы показать вам несколько примеров, которые вы начали, вы можете написать:

import string 
t = "hello, eric! how are you?" 
print t.translate(string.maketrans("",""), string.punctuation) 

и выход:

hello eric how are you 

или другой способ, чтобы просто написать:

t = t.split() 
for w in t: 
    w = w.strip('\'"?,.!_+=-') 
    print w 

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

+0

Хорошо для ваших предложений. Думаю, я в конечном итоге воспользуюсь вашим решением ... Но почему функция «nltk stopwords» не выполняет работу, которую она должна выполнять? !!! – rom

+1

Поскольку команда, которая разработала nltk, могла не говорить на всех языках, которые покрывали nltk, они, скорее всего, использовали огромный текст текста для каждого языка и нашли наиболее распространенные слова, которые были использованы в этом корпусе как стоп-слова. Таким образом, этот список, вероятно, был создан автоматически. Кроме того, слова остановки меняются в зависимости от приложения. Например, останавливать слова в контексте классификации тем не так, как в контексте классификации чувств. Вот почему, в конце концов, с точки зрения разработчиков достаточно приблизительного списка стоп-слов. – user823743

+0

понял! Спасибо за объяснение :) – rom

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