python英文分词统计(python英文分词库)
Python 分词后词频统计
out_one?=??re.compile(r'(.*?)\000',re.S)
out_one_re?=?re.findall(self.out_one,i)
a={}
for?j?in?out_one_re?:
???a[j]?=?out_one_re?.count(j)
??
??
使用字典属性,内容唯一来进行统计。出来的包括内容和次数。
编写程序,给出英文句子,统计单词个数,python
代码如下:
len(str.split())
其中str代表给出的英文句子。
代码解释:
1. 将句子切分成一个一个的单词。
str.split()是使用空格将英文句子分成一个一个的单词。空格是split方法的默认值,可以自行更改。返回值就是单词列表。
2. 统计单词数量。
前面我们得到了单词的列表,len()方法可以统计列表的长度,这个长度就是单词的个数。
如何用python统计一个txt文件中各个单词出现的次数
1、首先,定义一个变量,保存要统计的英文文章。
2、接着,定义两个数组,保存文章中的单词,以及各单词的词频。
3、从文章中分割出所有的单词,保存在数组中。
4、然后,计算文章中单词的总数,保存在变量中。
5、用for循环,统计文章中各单词的词频。
6、最后,输出文章中各单词的词频。
7、运行程序,电脑会自动统计输入文章中各单词的词频。
如何用python和jieba分词,统计词频?
?#!?python3
#?-*-?coding:?utf-8?-*-
import?os,?codecs
import?jieba
from?collections?import?Counter
?
def?get_words(txt):
????seg_list?=?jieba.cut(txt)
????c?=?Counter()
????for?x?in?seg_list:
????????if?len(x)1?and?x?!=?'\r\n':
????????????c[x]?+=?1
????print('常用词频度统计结果')
????for?(k,v)?in?c.most_common(100):
????????print('%s%s?%s??%d'?%?('??'*(5-len(k)),?k,?'*'*int(v/3),?v))
?
if?__name__?==?'__main__':
????with?codecs.open('19d.txt',?'r',?'utf8')?as?f:
????????txt?=?f.read()
????get_words(txt)
Python中,已经得到一个包含所有单词的词典,如何统计词典中的单词在每一句话中出现的次数?
众所周知,英文是以词为单位的,词和词之间是靠空格隔开,而中文是以字为单位,句子中所有的字连起来才能描述一个意思。例如,英文句子I am a student,用中文则为:“我是一个学生”。计算机可以很简单通过空格知道student是一个单词,但是不能很容易明白“学”、“生”两个字合起来才表示一个词。把中文的汉字序列切分成有意义的词,就是中文分词,有些人也称为切词。我是一个学生,分词的结果是:我 是 一个 学生。
中文分词技术属于自然语言处理技术范畴,对于一句话,人可以通过自己的知识来明白哪些是词,哪些不是词,但如何让计算机也能理解?其处理过程就是分词算法。
现有的分词算法可分为三大类:基于字符串匹配的分词方法、基于理解的分词方法和基于统计的分词方法。
1、基于字符串匹配的分词方法
这种方法又叫做机械分词方法,它是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行配,若在词典中找到某个字符串,则匹配成功(识别出一个词)。按照扫描方向的不同,串匹配分词方法可以分为正向匹配和逆向匹配;按照不同长度优先匹配的情况,可以分为最大(最长)匹配和最小(最短)匹配;按照是否与词性标注过程相结合,又可以分为单纯分词方法和分词与标注相结合的一体化方法。常用的几种机械分词方法如下:
1)正向最大匹配法(由左到右的方向);
2)逆向最大匹配法(由右到左的方向);
3)最少切分(使每一句中切出的词数最小)。
还可以将上述各种方法相互组合,例如,可以将正向最大匹配方法和逆向最大匹配方法结合起来构成双向匹配法。由于汉语单字成词的特点,正向最小匹配和逆向最小匹配一般很少使用。一般说来,逆向匹配的切分精度略高于正向匹配,遇到的歧义现象也较少。统计结果表明,单纯使用正向最大匹配的错误率为1/169,单纯使用逆向最大匹配的错误率为1/245。但这种精度还远远不能满足实际的需要。实际使用的分词系统,都是把机械分词作为一种初分手段,还需通过利用各种其它的语言信息来进一步提高切分的准确率。
一种方法是改进扫描方式,称为特征扫描或标志切分,优先在待分析字符串中识别和切分出一些带有明显特征的词,以这些词作为断点,可将原字符串分为较小的串再来进机械分词,从而减少匹配的错误率。另一种方法是将分词和词类标注结合起来,利用丰富的词类信息对分词决策提供帮助,并且在标注过程中又反过来对分词结果进行检验、调整,从而极大地提高切分的准确率。
对于机械分词方法,可以建立一个一般的模型,在这方面有专业的学术论文,这里不做详细论述。
2、基于理解的分词方法
这种分词方法是通过让计算机模拟人对句子的理解,达到识别词的效果。其基本思想就是在分词的同时进行句法、语义分析,利用句法信息和语义信息来处理歧义现象。它通常包括三个部分:分词子系统、句法语义子系统、总控部分。在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信息来对分词歧义进行判断,即它模拟了人对句子的理解过程。这种分词方法需要使用大量的语言知识和信息。由于汉语语言知识的笼统、复杂性,难以将各种语言信息组织成机器可直接读取的形式,因此目前基于理解的分词系统还处在试验阶段。
3、基于统计的分词方法
从形式上看,词是稳定的字的组合,因此在上下文中,相邻的字同时出现的次数越多,就越有可能构成一个词。因此字与字相邻共现的频率或概率能够较好的反映成词的可信度。可以对语料中相邻共现的各个字的组合的频度进行统计,计算它们的互现信息。定义两个字的互现信息,计算两个汉字X、Y的相邻共现概率。互现信息体现了汉字之间结合关系的紧密程度。当紧密程度高于某一个阈值时,便可认为此字组可能构成了一个词。这种方法只需对语料中的字组频度进行统计,不需要切分词典,因而又叫做无词典分词法或统计取词方法。但这种方法也有一定的局限性,会经常抽出一些共现频度高、但并不是词的常用字组,例如“这一”、“之一”、“有的”、“我的”、“许多的”等,并且对常用词的识别精度差,时空开销大。实际应用的统计分词系统都要使用一部基本的分词词典(常用词词典)进行串匹配分词,同时使用统计方法识别一些新的词,即将串频统计和串匹配结合起来,既发挥匹配分词切分速度快、效率高的特点,又利用了无词典分词结合上下文识别生词、自动消除歧义的优点。
到底哪种分词算法的准确度更高,目前并无定论。对于任何一个成熟的分词系统来说,不可能单独依靠某一种算法来实现,都需要综合不同的算法。笔者了解,海量科技的分词算法就采用“复方分词法”,所谓复方,相当于用中药中的复方概念,即用不同的药才综合起来去医治疾病,同样,对于中文词的识别,需要多种算法来处理不同的问题。
如何用python实现英文短文的双词频统计
简单版:
#!/usr/bin/env?python3
import?re
import?jieba
from?collections?import?Counter
fname?=?'counttest.txt'
with?open(fname)?as?f:
????s?=?f.read()
pattern?=?re.compile(r'[a-zA-Z]+\-?[a-zA-Z]*')
english_words?=?Counter(pattern.findall(s))
other_words?=?Counter(jieba.cut(pattern.sub('',?s)))
print('\n英文单词统计结果:\n'+'-'*17)
print('\n'.join(['{}:?{}'.format(i,?j)?for?i,?j?in?english_words.most_common()]))
print('\n中文及符号统计结果:\n'+'-'*19)
print('\n'.join(['{}:?{}'.format(i,?j)?for?i,?j?in?other_words.most_common()]))
复杂版:
#!/usr/bin/env?python
#?-*-?coding:?utf-8?-*-
from?__future__?import?print_function,?division,?unicode_literals
import?sys,?re,?time,?os,?jieba
from?collections?import?Counter
from?datetime?import?datetime
class?WordCounter(object):
????def?__init__(self,?from_file,?to_file=None,?coding=None,?jieba_cut=None):
????????'''根据设定的进程数,把文件from_file分割成大小基本相同,数量等同与进程数的文件段,
????????来读取并统计词频,然后把结果写入to_file中,当其为None时直接打印在终端或命令行上。
????????Args:
????????@from_file?要读取的文件
????????@to_file?结果要写入的文件
????????@coding?文件的编码方式,默认为采用chardet模块读取前1万个字符来自动判断
????????@jieba_cut?是否启用结巴分词,默认为None
????????
????????How?to?use:
????????w?=?WordCounter('a.txt',?'b.txt')
????????w.run()????????
????????'''
????????if?not?os.path.isfile(from_file):
????????????raise?Exception('No?such?file:?文件不存在')
????????self.f1?=?from_file
????????self.filesize?=?os.path.getsize(from_file)
????????self.f2?=?to_file
????????if?coding?is?None:
????????????try:
????????????????import?chardet
????????????except?ImportError:
????????????????os.system('pip?install?chardet')
????????????????print('-'*70)
????????????????import?chardet
????????????with?open(from_file,?'rb')?as?f:????
????????????????coding?=?chardet.detect(f.read(10000))['encoding']????????????
????????self.coding?=?coding
????????self._c?=?[Counter(),?Counter()]
????????self.jieba?=?False
????????if?jieba_cut?is?not?None:??????????????????
????????????self.jieba?=?True
????????????
????def?run(self):
????????start?=?time.time()
????????if?1:
????????????self.count_direct(self.f1)??????????
????????if?self.f2?not?in?['None',?'Null',?'none',?'null',?None]:
????????????with?open(self.f2,?'wb')?as?f:
????????????????f.write(self.result.encode(self.coding))
????????else:
????????????print('\nEnglish?words:\n'?+?'-'*15)
????????????print(self.result)
????????cost?=?'{:.1f}'.format(time.time()-start)
????????size?=?humansize(self.filesize)
????????tip?=?'\nFile?size:?{}.?Cost?time:?{}?seconds'?????
#????????print(tip.format(size,?cost))
????????self.cost?=?cost?+?'s'
????def?count_direct(self,?from_file):
????????'''直接把文件内容全部读进内存并统计词频'''
????????start?=?time.time()
????????with?open(from_file,?'rb')?as?f:
????????????line?=?f.read()
????????for?i?in?range(len(self._c)):
????????????self._c[i].update(self.parse(line)[i])??
?????????????????
????????????????????
????def?parse(self,?line):??#解析读取的文件流
????????text?=?line.decode(self.coding)
????????text?=?re.sub(r'\-\n',?'',?text)?#考虑同一个单词被分割成两段的情况,删除行末的-号
????????pattern?=?re.compile(r'[a-zA-Z]+\-?[a-zA-Z]*')?#判断是否为英文单词
????????english_words?=?pattern.findall(text)
????????rest?=?pattern.sub('',?text)????????
????????ex?=?Counter(jieba.cut(rest))?if?self.jieba?else?Counter(text)
????????return?Counter(english_words),?ex
????????
????def?flush(self):??#清空统计结果
????????self._c?=?[Counter(),?Counter()]
????@property
????def?counter(self):??#返回统计结果的Counter类???????
????????return?self._c
????????????????????
????@property
????def?result(self):??#返回统计结果的字符串型式,等同于要写入结果文件的内容
????????ss?=?[]
????????for?c?in?self._c:
????????????ss.append(['{}:?{}'.format(i,?j)?for?i,?j?in?c.most_common()])
????????
????????tip?=?'\n\n中文及符号统计结果:\n'+'-'*15+'\n'
????????return?tip.join(['\n'.join(s)?for?s?in?ss])
def?humansize(size):
????"""将文件的大小转成带单位的形式
?????humansize(1024)?==?'1?KB'
????True
?????humansize(1000)?==?'1000?B'
????True
?????humansize(1024*1024)?==?'1?M'
????True
?????humansize(1024*1024*1024*2)?==?'2?G'
????True
????"""
????units?=?['B',?'KB',?'M',?'G',?'T']????
????for?unit?in?units:
????????if?size??1024:
????????????break
????????size?=?size?//?1024
????return?'{}?{}'.format(size,?unit)
????????
def?main():
????if?len(sys.argv)??2:
????????print('Usage:?python?wordcounter.py?from_file?to_file')
????????exit(1)
????from_file,?to_file?=?sys.argv[1:3]
????args?=?{'coding'?:?None,?'jieba_cut':?1}
????for?i?in?sys.argv:
????????for?k?in?args:
????????????if?re.search(r'{}=(.+)'.format(k),?i):
????????????????args[k]?=?re.findall(r'{}=(.+)'.format(k),?i)[0]
????w?=?WordCounter(from_file,?to_file,?**args)
????w.run()
????
if?__name__?==?'__main__':
????import?doctest
????doctest.testmod()
????main()
更复杂的:如果是比较大的文件,建议采用多进程,详情百度:多进程读取大文件并统计词频 jaket5219999