我正在使用nltk和python从语料库中提取ngram,我需要将生成的ngram保存在文本文件中。
我尝试了此代码,但没有结果:
import nltk, re, string, collections
from nltk.util import ngrams
with open("titles.txt", "r", encoding='utf-8') as file:
text = file.read()
tokenized = text.split()
Monograms = ngrams(tokenized, 1)
MonogramFreq = collections.Counter(Monograms)
with open('output.txt', 'w') as f:
f.write(str(MonogramFreq))
这是 titles.txt 的示例:
Joli appartement s3 aux jardins de carthage mz823
Villa 600m2 haut standing à hammamet
Hammem lif
S2 manzah 7
Terrain constructible de 252m2 clôturé
Terrain nu a gammarth
Terrain agrecole al fahes
Bureau 17 pièces
Usine 5000m2 mannouba
MongramFreq的简单打印必须提供如下内容:
('atelier',): 17, ('430',): 17, ('jabli',): 17, ('mall',): 17, ('palmeraies',): 17, ('r4',): 17, ('dégagée',): 17, ('fatha',): 17
但是甚至没有创建 output.txt 文件。
我更正了以下代码:
import nltk, re, string, collections
from nltk.util import ngrams
with open("titles.txt", "r", encoding='utf-8') as file:
text = file.read()
tokenized = text.split()
Threegrams = ngrams(tokenized, 3)
ThreegramFreq = collections.Counter(Threegrams)
for i in ThreegramFreq.elements():
with open('output.txt', 'a') as w:
w.write(str(i))
w.close()
以下是output.txt的示例:
('les', 'étudiants', 'S1')('Joli', 'appartement', 's3')('Joli', 'appartement', 's3')('Joli', 'appartement', 's3')('Joli', 'appartement', 's3')('Joli', 'appartement', 's3')('Joli', 'appartement', 's3')('Joli', 'appartement', 's3')('Joli', 'appartement', 's3')('Joli', 'appartement', 's3')('Joli', 'appartement', 's3')('Joli', 'appartement', 's3')('Joli', 'appartement', 's3')('Joli', 'appartement', 's3')('appartement', 's3', 'aux')('appartement', 's3', 'aux')('appartement', 's3', 'aux')('appartement', 's3', 'aux')('appartement', 's3', 'aux')('s3', 'aux', 'jardins')('s3', 'aux', 'jardins')('s3', 'aux', 'jardins')('s3', 'aux', 'jardins')('s3', 'aux', 'jardins')('s3', 'aux', 'jardins')('s3', 'aux', 'jardins')('s3', 'aux', 'jardins')('s3', 'aux', 'jardins')('s3', 'aux', 'jardins')('aux', 'jardins', 'de')('aux', 'jardins', 'de')('aux', 'jardins', 'de')('aux', 'jardins', 'de')('aux', 'jardins', 'de')('aux', 'jardins', 'de')('aux', 'jardins', 'de')('aux', 'jardins', 'de')('aux', 'jardins', 'de')('aux', 'jardins', 'de')('aux', 'jardins', 'de')('aux', 'jardins', 'de')('aux', 'jardins', 'de')('aux', 'jardins', 'de')('aux', 'jardins', 'de')('aux', 'jardins', 'de')('aux', 'jardins', 'de')('aux', 'jardins', 'de')('aux', 'jardins', 'de')('aux', 'jardins', 'de')('aux', 'jardins', 'de')('aux', 'jardins', 'de')('aux', 'jardins', 'de')('aux', 'jardins', 'de')('aux', 'jardins', 'de')('aux', 'jardins', 'de')('aux', 'jardins', 'de')('aux', 'jardins', 'de')('aux', 'jardins', 'de')('aux', 'jardins', 'de')('aux', 'jardins', 'de')('aux', 'jardins', 'de')('aux', 'jardins', 'de')('aux', 'jardins', 'de')('jardins', 'de', 'carthage')('jardins', 'de', 'carthage')('jardins', 'de', 'carthage')('jardins', 'de', 'carthage')('jardins', 'de', 'carthage')('jardins', 'de', 'carthage')('jardins', 'de', 'carthage')('jardins', 'de', 'carthage')('jardins', 'de', 'carthage')('jardins', 'de', 'carthage')('jardins', 'de', 'carthage')('jardins', 'de', 'carthage')('jardins', 'de', 'carthage')('jardins', 'de', 'carthage')
但是我需要在output.txt文件中记录每3克的频率。 怎么办?
答案 0 :(得分:0)
我的建议是为此使用CountVectorizer!
s='''Joli appartement s3 aux jardins de carthage mz823
Villa 600m2 haut standing à hammamet
Hammem lif
S2 manzah 7
Terrain constructible de 252m2 clôturé
Terrain nu a gammarth
Terrain agrecole al fahes
Bureau 17 pièces
Usine 5000m2 mannouba'''
text = s.split('\n')
from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(text)
我们已经将输入文本转换成单词包。我们将通过跨行求和来计算每个单词的出现频率。可以从vectorizer.get_feature_names()中检索与每个列名称相对应的单词。
MonogramFreq = {word:count for count,word in zip(X.sum(0).tolist()[0],
vectorizer.get_feature_names())}
print(MonogramFreq)
输出:
{'17': 1, '252m2': 1, '5000m2': 1, '600m2': 1, 'agrecole': 1, 'al': 1, 'appartement': 1, 'aux': 1, 'bureau': 1, 'carthage': 1, 'clôturé': 1, 'constructible': 1, 'de': 2, 'fahes': 1, 'gammarth': 1, 'hammamet': 1, 'hammem': 1, 'haut': 1, 'jardins': 1, 'joli': 1, 'lif': 1, 'mannouba': 1, 'manzah': 1, 'mz823': 1, 'nu': 1, 'pièces': 1, 's2': 1, 's3': 1, 'standing': 1, 'terrain': 3, 'usine': 1, 'villa': 1}
编辑:
要获取更多的字母组合(例如,二字母组合,三字母组合到6克)。
vectorizer = CountVectorizer(ngram_range=(1,6))
答案 1 :(得分:0)
但是请至少阅读评论:
from collections import Counter
from nltk import word_tokenize, ngrams
text='''Joli appartement s3 aux jardins de carthage mz823
Villa 600m2 haut standing à hammamet
Hammem lif
S2 manzah 7
Terrain constructible de 252m2 clôturé
Terrain nu a gammarth
Terrain agrecole al fahes
Bureau 17 pièces
Usine 5000m2 mannouba'''
# Create a counter object to track ngrams and counts.
ngram_counters = Counter()
# Split the text into sentences,
# For now, assume '\n' delimits the sentences.
for line in text.split('\n'):
# Update the counters with ngrams in each sentence,
ngram_counters.update(ngrams(word_tokenize(line), n=3))
# Opens a file to print out.
with open('ngram_counts.tsv', 'w') as fout:
# Iterate through the counter object, like a dictionary.
for ng, counts in ngram_counters.items():
# Use space to join the tokens in the ngrams before printing.
# Print the counts in a separate column.
print(' '.join(ng) +'\t' + str(counts), end='\n', file=fout)