天道酬勤,学无止境

Unable to process accented words using NLTK tokeniser

I'm trying to compute the frequencies of words in an utf-8 encoded text file with the following code. Having successfully tokenized the file content and then looping through the words, my program is not able to read the accented characters.

import csv
import nltk
from nltk.tokenize import RegexpTokenizer
from nltk.corpus import stopwords

print "computing word frequency..."
if lang == "fr":
    stop = stopwords.words("french")
    stop = [word.encode("utf-8") for word in stop]
    stop.append("les")
    stop.append("a")
elif lang == "en":
    stop = stopwords.words("english")


rb = csv.reader(open(path+file_name))
wb = csv.writer(open('results/all_words_'+file_name,'wb'))

tokenizer = RegexpTokenizer(r'\w+')

word_dict = {}

i = 0

for row in rb:
    i += 1
    if i == 5:
        break
    text = tokenizer.tokenize(row[0].lower())
    text = [j for j in text if j not in stop]
    #print text
    for doc in text:
        try:

            try:
                word_dict[doc] += 1

            except:

                word_dict[doc] = 1
        except:
            print row[0]
            print " ".join(text)




word_dict2 = sorted(word_dict.iteritems(), key=operator.itemgetter(1), reverse=True)

if lang == "English":
    for item in word_dict2:
        wb.writerow([item[0],stem(item[0]),item[1]])
else:
    for item in word_dict2:
        wb.writerow([item[0],item[1]])

print "Finished"

Input text file:

rt annesorose envie crêpes
envoyé jerrylee bonjour monde dimanche crepes dimanche
The output written in a file is destroying certain words.
bonnes crepes tour nouveau vélo
aime crepe soleil ça fera bien recharger batteries vu jours hard annoncent

Results output:

crepes,2
dimanche,2
rt,1
nouveau,1
envie,1
v�,1 
jerrylee,1
cleantext,1
lo,1
bonnes,1
tour,1
crêpes,1
monde,1
bonjour,1
annesorose,1
envoy�,1

envoy� is envoyé in the actual file.

How can I correct this problem with accented characters?

评论

If you're using py2.x, reset default encoding to 'utf8':

import sys
reload(sys)
sys.setdefaultencoding('utf8')

Alternatively, you can use a ucsv module, see see General Unicode/UTF-8 support for csv files in Python 2.6

or use io.open():

$ echo """rt annesorose envie crêpes
> envoyé jerrylee bonjour monde dimanche crepes dimanche
> The output written in a file is destroying certain words.
> bonnes crepes tour nouveau vélo
> aime crepe soleil ça fera bien recharger batteries vu jours hard annoncent""" > someutf8.txt
$ python
>>> import io, csv
>>> text = io.open('someutf8.txt', 'r', encoding='utf8').read().split('\n')
>>> for row in text:
...     print row
... 
rt annesorose envie crêpes
envoyé jerrylee bonjour monde dimanche crepes dimanche
The output written in a file is destroying certain words.
bonnes crepes tour nouveau vélo
aime crepe soleil ça fera bien recharger batteries vu jours hard annoncent

Lastly, rather than using such a complex reading and counting module, simply use FreqDist in NLTK, see section 3.1 from http://www.nltk.org/book/ch01.html

Or personally, i prefer collections.Counter:

$ python
>>> import io
>>> text = io.open('someutf8.txt', 'r', encoding='utf8').read()
>>> from collections import Counter
>>> Counter(word_tokenize(text))
Counter({u'crepes': 2, u'dimanche': 2, u'fera': 1, u'certain': 1, u'is': 1, u'bonnes': 1, u'v\xe9lo': 1, u'batteries': 1, u'envoy\xe9': 1, u'vu': 1, u'file': 1, u'in': 1, u'The': 1, u'rt': 1, u'jerrylee': 1, u'destroying': 1, u'bien': 1, u'jours': 1, u'.': 1, u'written': 1, u'annesorose': 1, u'annoncent': 1, u'nouveau': 1, u'envie': 1, u'hard': 1, u'cr\xeapes': 1, u'\xe7a': 1, u'monde': 1, u'words': 1, u'bonjour': 1, u'a': 1, u'crepe': 1, u'soleil': 1, u'tour': 1, u'aime': 1, u'output': 1, u'recharger': 1})
>>> myFreqDist = Counter(word_tokenize(text))
>>> for word, freq in myFreqDist.items():
...     print word, freq
... 
fera 1
crepes 2
certain 1
is 1
bonnes 1
vélo 1
batteries 1
envoyé 1
vu 1
file 1
in 1
The 1
rt 1
jerrylee 1
destroying 1
bien 1
jours 1
. 1
written 1
dimanche 2
annesorose 1
annoncent 1
nouveau 1
envie 1
hard 1
crêpes 1
ça 1
monde 1
words 1
bonjour 1
a 1
crepe 1
soleil 1
tour 1
aime 1
output 1
recharger 1

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 在 Python 中使用 NLTK 的短语的一致性(concordance for a phrase using NLTK in Python)
    问题 是否可以在 NLTK 中获得短语的一致性? import nltk from nltk.corpus import PlaintextCorpusReader corpus_loc = "c://temp//text//" files = ".*\.txt" read_corpus = PlaintextCorpusReader(corpus_loc, files) corpus = nltk.Text(read_corpus.words()) test = nltk.TextCollection(corpus_loc) corpus.concordance("claim") 例如上面的回报 on okay okay okay i can give you the claim number and my information and decide on the shop okay okay so the claim number is xxxx - xx - xxxx got 现在,如果我尝试corpus.concordance("claim number")它不起作用......我确实有代码可以通过使用.partition()方法和一些进一步的编码来做到这一点......但我我想知道是否可以使用concordance做同样的事情。 回答1 根据这个问题,(还
  • code for counting number of sentences, words and characters in an input file
    I have written the following code to count the number of sentences, words and characters in the input file sample.txt, which contains a paragraph of text. It works fine in giving the number of sentences and words, but does not give the precise and correct number of characters ( without whitespaces and punctuation marks) lines,blanklines,sentences,words=0,0,0,0 num_chars=0 print '-'*50 try: filename = 'sample.txt' textf = open(filename,'r')c except IOError: print 'cannot open file %s for reading' % filename import sys sys.exit(0) for line in textf: print line lines += 1 if line.startswith('\n')
  • 深度学习实战(5)NLP数据预处理
    NLP数据预处理 前言常见的数据预处理Tokenisationlowercase and true-casingstopwords removalStemming and Lemmatisation 前言 如何成为一个优秀的NLP工程师,it’s not all about training! 很多小伙伴的模型在训练集上表现良好,却在测试集上表现欠佳,有的小伙伴甚至连训练集都拟合不了。一个优秀的NLP工程师做一个项目的时候第一件是不是训练模型,而是观察自己的数据,自己的数据有什么,有什么可能是我们模型最需要的特征,我们能否删除一些不重要的信息,可以说数据预处理是NLP工程师也是很多DL行业必备的一项技能。 常见的数据预处理 Tokenisation 分词tokenisation是NLP领域最常用的技巧之一了,现在的模式是无法直接地对一个句子获得其embedding的,无论是一切的word2vec还是现在大火大热的bert,都需要分词器。在这里我们介绍最简单的分词代码 # 下载分词集合 import nltk nltk.download('punkt') from nltk import word_tokenize sentence = " I love python! " sentence = ' '.join(word_tokenize(sentence)) lowercase
  • 在scikit中保存和重用TfidfVectorizer学习(Save and reuse TfidfVectorizer in scikit learn)
    问题 我在scikit中使用TfidfVectorizer学习从文本数据创建矩阵。 现在,我需要保存该对象以供以后重用。 我尝试使用泡菜,但出现了以下错误。 loc=open('vectorizer.obj','w') pickle.dump(self.vectorizer,loc) *** TypeError: can't pickle instancemethod objects 我尝试在sklearn.externals中使用joblib,这再次给出了类似的错误。 有什么方法可以保存该对象,以便以后可以重用? 这是我的全部对象: class changeToMatrix(object): def __init__(self,ngram_range=(1,1),tokenizer=StemTokenizer()): from sklearn.feature_extraction.text import TfidfVectorizer self.vectorizer = TfidfVectorizer(ngram_range=ngram_range,analyzer='word',lowercase=True,\ token_pattern='[a-zA-Z0-9]+',strip_accents='unicode',tokenizer=tokenizer) def load
  • 从词频中删除停用词(Remove stopwords from words frequency)
    问题 我正在尝试从这些数据中删除停用词 DateTime Clean 2020-01-07 then 28 and 28 pizza 14 capital 14 ... ... ... 2020-03-31 college 14 included 14 of 14 ........... 数据来自 df4.groupby('DateTime').agg({'Clean': 'value_counts'}).rename(columns={'Clean': 'Count'}).groupby('DateTime').head(4) 如何从此频率列表中删除这些停用词? 分组前的数据样本(原始数据): Text Clean all information regarding the state of art ... [all, information, regarding, the, state, of, art ... all information regarding the state of art ... [all, information, regarding, the, state, of, art ... to get a good result you should ... [to, get, a, good ,... 第一个是我需要标记的文本。 Clean
  • 使用 FreqDist 并写入 CSV(Using FreqDist and writing to CSV)
    问题 我正在尝试使用 nltk 和 pandas 从另一个 csv 中查找前 100 个单词并将它们列在新的 CSV 中。 我能够绘制单词,但是当我打印到 CSV 时,我得到 word | count 52 | 7 <- This is current CSV output 不知道我哪里出错了,寻找一些指导。 我的代码是 words= [] with open('SECParse2.csv', encoding = 'utf-8') as csvfile: reader = csv.reader(csvfile) next(reader) freq_all = nltk.FreqDist() for row in reader: note = row[1] tokens = [t for t in note.split()] freq = nltk.FreqDist(tokens) fd_t100 = freq.most_common(100) freq_all.update(tokens) freq_all.plot(100, cumulative=False) df3 = pd.DataFrame(freq_all,columns=['word','count'], index=[1]) df3.to_csv("./SECParse3.csv", sep=',',index
  • 自然语言处理(NLP)笔记-文本预处理
    文本预处理(text pre-processing) Why: 单词由于时态,单复数,比较级等不同有不同的形态 典型的文本预处理步骤: Tokenisation: 将文本分割为句子,然后分割为单词。 句子分割(sentence segmentetion):在语法上正确的意思独立的最短的一组词。通过标点进行分割,叹号和问号是明确的,但是句号却有点模糊(例如缩写或者小数等)。可以通过a.手写规则(if-then)b.正则表达式c.机器学习来处理。以下是一个判断一个单词是否是一句话结尾的决策树。 词语分割(word segmentation): 针对的是汉语。最大匹配法/MM方法(The Maximum Matching Method) 正向最大匹配指的是从左到右对一个字符串进行匹配,所匹配的词越长越好,比如“中国科学院计算研究所”,按照词典中最长匹配原则的切分结果是:“中国科学院/计算研究所”,而不是“中国/科学院/计算/研究所”。 但是正向最大匹配也会存在一些bad case,常见的例子如:“他从东经过我家”,使用正向最大匹配会得到错误的结果:“他/从/东经/过/我/家”。 逆向最大匹配的顺序是从右向左倒着匹配,如果能匹配到更长的词,则优先选择,上面的例子“他从东经过我家”逆向最大匹配能够得到正确的结果“他/从/东/经过/我/家”。 但是逆向最大匹配同样存在badcase:
  • Python Arpabet语音转录(Python Arpabet phonetic transcription)
    问题 python中是否有一个可以将单词(主要是名称)转换为Arpabet语音转录的库? 桶-> B AA1 RB AH0 LZ 烧烤-> B AA1 RB IH0 KY UW2 烧烤-> B AA1 RB IH0 KY UW2 D 烧烤-> B AA1 RB IH0 KY UW2 IH0 NG 烧烤-> B AA1 RB IH0 KY UW2 Z 回答1 在安装了cmudict语料库的情况下使用nltk: arpabet = nltk.corpus.cmudict.dict() for word in ('barbels', 'barbeque', 'barbequed', 'barbequeing', 'barbeques'): print(arpabet[word]) 产量 [['B', 'AA1', 'R', 'B', 'AH0', 'L', 'Z']] [['B', 'AA1', 'R', 'B', 'IH0', 'K', 'Y', 'UW2']] [['B', 'AA1', 'R', 'B', 'IH0', 'K', 'Y', 'UW2', 'D']] [['B', 'AA1', 'R', 'B', 'IH0', 'K', 'Y', 'UW2', 'IH0', 'NG']] [['B', 'AA1', 'R', 'B', 'IH0', 'K', 'Y', 'UW2',
  • Python NLTK:Stanford NER 标记器错误消息:NLTK 无法找到 java 文件(Python NLTK: Stanford NER tagger error message: NLTK was unable to find the java file)
    问题 试图让斯坦福 NER 使用 Python。 按照网络上的一些说明进行操作,但收到错误消息:“NLTK 无法找到 java 文件!使用软件特定的配置参数或设置 JAVAHOME 环境变量。” 哪里错了? 谢谢! from nltk.tag.stanford import StanfordNERTagger from nltk.tokenize import word_tokenize model = r'C:\Stanford\NER\classifiers\english.muc.7class.distsim.crf.ser.gz' jar = r'C:\Stanford\NER\stanford-ner-3.9.1.jar' ner_tagger = StanfordNERTagger(model, jar, encoding = 'utf-8') text = 'While in France, Christine Lagarde discussed short-term stimulus ' \ 'efforts in a recent interview with the Wall Street Journal.' words = word_tokenize(text) classified_words = ner_tagger.tag(words) 回答1
  • Python NLTK: Stanford NER tagger error message: NLTK was unable to find the java file
    Trying to get Stanford NER working with Python. Followed some instructions on the web, but got the error message: "NLTK was unable to find the java file! Use software specific configuration paramaters or set the JAVAHOME environment variable." What was wrong? Thank you! from nltk.tag.stanford import StanfordNERTagger from nltk.tokenize import word_tokenize model = r'C:\Stanford\NER\classifiers\english.muc.7class.distsim.crf.ser.gz' jar = r'C:\Stanford\NER\stanford-ner-3.9.1.jar' ner_tagger = StanfordNERTagger(model, jar, encoding = 'utf-8') text = 'While in France, Christine Lagarde discussed
  • 无法下载 nltk 数据(Unable to download nltk data)
    问题 import nltk nltk.download() 它显示[SSL:CERTIFICATE_VERIFY_FAILED] 。 在requests情况下,可以使用verify=False ,但在这里做什么。 更新: 此错误在 Mac OS X 10.7.5 上使用 NLTK 3.0 的 Python 3.6 上仍然存在: 更改 NLTK 下载器中的索引(此处建议)允许下载器显示所有 NLTK 文件,但是当尝试下载所有文件时,会出现另一个 SSL 错误(参见照片底部): 回答1 我在尝试配置 nltk 和 SpaCy 时遇到了同样的问题。 根据这个问题中的说明,我能够克服这个问题。 尝试运行/Applications/Python\ 3.6/Install\ Certificates.command ,然后重试 NLTK 下载 回答2 在 MacOS 10.12.6 上,这是通过在 bash 终端中输入以下内容解决的 pip install certifi /Applications/Python\ 3.6/Install\ Certificates.command 安装 nltk 语料库的常用方法然后对我有用 import nltk nltk.download() 回答3 如果要手动下载,比如需要tokenizer/punkt数据,可以直接下载到: https://raw
  • 如何从一系列文本条目中提取常用/重要短语(How to extract common / significant phrases from a series of text entries)
    问题 我有一系列文本项-来自MySQL数据库的原始HTML。 我想在这些条目中找到最常用的短语(而不是单个最常用的短语,理想情况下,不强制单词对单词的匹配)。 我的示例是Yelp.com上的任何评论,其中以给定餐厅的数百条评论显示了3个摘要,格式为: “尝试汉堡”(共44条评论) 例如,此页面的“评论重点”部分: http://www.yelp.com/biz/sushi-gen-los-angeles/ 我已经安装了NLTK,并且已经对其进行了一些尝试,但是老实说,这些选择让他们不知所措。 这似乎是一个相当普遍的问题,我无法通过在此处搜索找到简单的解决方案。 回答1 我怀疑您不只是想要最普通的短语,而是想要最有趣的搭配。 否则,您可能最终会过度表达由普通单词组成的短语,而减少有趣和翔实的短语。 为此,您实际上将需要从数据中提取n元语法,然后找到具有最高点智慧互信息(PMI)的n元语法。 就是说,您希望找到共同出现的单词,而不是希望它们偶然出现的单词。 NLTK搭配使用方法在大约7行代码中涵盖了如何执行此操作,例如: import nltk from nltk.collocations import * bigram_measures = nltk.collocations.BigramAssocMeasures() trigram_measures = nltk
  • Are there any classes in NLTK for text normalizing and canonizing?
    The prevalent amount of NLTK documentation and examples is devoted to lemmatization and stemming but is very sparse on such matters of normalization as: converting all letters to lower or upper case removing punctuation converting numbers into words removing accent marks and other diacritics expanding abbreviations removing stopwords or "too common" words text canonicalization (tumor = tumour, it's = it is) Please point me where in NLTK to dig. Any NLTK equivalents (JAVA or any other) for aforementioned purposes are welcome. Thanks. UPD. I have written a python library of text normalization
  • 将 sklearn TfidfVectorizer 与已经标记化的输入一起使用?(Use sklearn TfidfVectorizer with already tokenized inputs?)
    问题 我有一个标记化句子的列表,并希望适合 tfidf Vectorizer。 我尝试了以下方法: tokenized_list_of_sentences = [['this', 'is', 'one'], ['this', 'is', 'another']] def identity_tokenizer(text): return text tfidf = TfidfVectorizer(tokenizer=identity_tokenizer, stop_words='english') tfidf.fit_transform(tokenized_list_of_sentences) 哪个错误为 AttributeError: 'list' object has no attribute 'lower' 有没有办法做到这一点? 我有十亿个句子,不想再次标记它们。 在此之前的另一个阶段将它们标记化。 回答1 尝试使用参数lowercase=False初始化TfidfVectorizer对象(假设这实际上是需要的,因为您在前一阶段已将标记小写)。 tokenized_list_of_sentences = [['this', 'is', 'one', 'basketball'], ['this', 'is', 'a', 'football']] def identity
  • cp8_Sentiment_urlretrieve_pyprind_tarfile_bag词袋_walk目录_regex_verbose_pyrind_Hash_colab_verbose_文本向量化
    In the modern internet and social media age, people's opinions, reviews, and recommendations have become a valuable resource for political science and businesses. Thanks to modern technologies, we are now able to collect and analyze such data most efficiently. In this chapter, we will delve into a subfield of natural language processing (NLP) called sentiment analysis and learn how to use machine learning algorithms to classify documents based on their polarity: the attitude of the writer. In particular, we are going to work with a dataset of 50,000 movie reviews from the Internet Movie
  • 将字符串解析为argv / argc(Parse string into argv/argc)
    问题 C语言中是否有一种方法可以解析一段文本并获取argv和argc的值,就好像该文本已通过命令行传递给应用程序一样? 这不必在Windows上运行,而只能在Linux上运行-我也不在乎参数的引用。 回答1 如果glib解决方案对于您的情况而言过于严格,则可以考虑自己编写一个。 然后你可以: 扫描字符串并计算有多少个参数(您会得到argc) 分配一个char *数组(用于您的argv) 重新扫描字符串,在分配的数组中分配指针,并用'\ 0'替换空格(如果您不能修改包含参数的字符串,则应复制它)。 不要忘记释放您分配的内容! 下图应阐明(希望如此): aa bbb ccc "dd d" ee <- original string aa0bbb0ccc00dd d00ee0 <- transformed string | | | | | argv[0] __/ / / / / argv[1] ____/ / / / argv[2] _______/ / / argv[3] ___________/ / argv[4] ________________/ 可能的API可能是: char **parseargs(char *arguments, int *argc); void freeparsedargs(char **argv)
  • NLTK was unable to find the gs file
    I'm trying to use NLTK, the stanford natural language toolkit. After install the required files, I start to execute the demo code: http://www.nltk.org/index.html >>> import nltk >>> sentence = """At eight o'clock on Thursday morning ... Arthur didn't feel very good.""" >>> tokens = nltk.word_tokenize(sentence) >>> tokens ['At', 'eight', "o'clock", 'on', 'Thursday', 'morning', 'Arthur', 'did', "n't", 'feel', 'very', 'good', '.'] >>> tagged = nltk.pos_tag(tokens) >>> tagged[0:6] [('At', 'IN'), ('eight', 'CD'), ("o'clock", 'JJ'), ('on', 'IN'), ('Thursday', 'NNP'), ('morning', 'NN')] >>> entities
  • 用 quanteda 一步步创建 dfm(Create dfm step by step with quanteda)
    问题 我想分析一个大 (n=500,000) 的文档语料库。 我在使用quanteda时期望它比tm tm_map()更快。 我想一步一步地进行,而不是使用dfm()的自动化方式。 我有这样做的原因:在一种情况下,我不想在删除停用词之前进行标记,因为这会导致许多无用的二元组,在另一种情况下,我必须使用特定于语言的程序预处理文本。 我希望实现这个序列: 1) 去掉标点符号和数字 2)删除停用词(即在标记化之前避免无用的标记) 3) 使用 unigrams 和 bigrams 进行标记 4)创建dfm 我的尝试: > library(quanteda) > packageVersion("quanteda") [1] ‘0.9.8’ > text <- ie2010Corpus$documents$texts > text.corpus <- quanteda:::corpus(text, docnames=rownames(ie2010Corpus$documents)) > class(text.corpus) [1] "corpus" "list" > stopw <- c("a","the", "all", "some") > TextNoStop <- removeFeatures(text.corpus, features = stopw) # Error in
  • spacy 是否将令牌列表作为输入?(Does spacy take as input a list of tokens?)
    问题 我想在不使用单词标记化的情况下使用 spacy 的 POS 标记、NER 和依赖项解析。 事实上,我的输入是一个代表一个句子的标记列表,我想尊重用户的标记化。 无论是使用 spacy 还是任何其他 NLP 包,这都可能吗? 现在,我使用这个基于 spacy 的函数将一个句子(一个 unicode 字符串)放入 Conll 格式: import spacy nlp = spacy.load('en') def toConll(string_doc, nlp): doc = nlp(string_doc) block = [] for i, word in enumerate(doc): if word.head == word: head_idx = 0 else: head_idx = word.head.i - doc[0].i + 1 head_idx = str(head_idx) line = [str(i+1), str(word), word.lemma_, word.tag_, word.ent_type_, head_idx, word.dep_] block.append(line) return block conll_format = toConll(u"Donald Trump is the new president of the United
  • 使用nltk从文本文件中提取所有名词(Extracting all Nouns from a text file using nltk)
    问题 有更有效的方法吗? 我的代码读取一个文本文件并提取所有名词。 import nltk File = open(fileName) #open file lines = File.read() #read all lines sentences = nltk.sent_tokenize(lines) #tokenize sentences nouns = [] #empty to array to hold all nouns for sentence in sentences: for word,pos in nltk.pos_tag(nltk.word_tokenize(str(sentence))): if (pos == 'NN' or pos == 'NNP' or pos == 'NNS' or pos == 'NNPS'): nouns.append(word) 如何减少此代码的时间复杂度? 有没有办法避免使用嵌套的for循环? 提前致谢! 回答1 如果您愿意使用NLTK以外的其他选项,请签出TextBlob。 它可以轻松提取所有名词和名词短语: >>> from textblob import TextBlob >>> txt = """Natural language processing (NLP) is a field of computer