1. 程式人生 > >Python進行文字預處理(文字分詞,過濾停用詞,詞頻統計,特徵選擇,文字表示)

Python進行文字預處理(文字分詞,過濾停用詞,詞頻統計,特徵選擇,文字表示)

系統:win7 32位

分詞軟體:PyNLPIR

整合開發環境(IDE):Pycharm

功能:實現多級文字預處理全過程,包括文字分詞,過濾停用詞,詞頻統計,特徵選擇,文字表示,並將結果匯出為WEKA能夠處理的.arff格式。

直接上程式碼:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
功能:PyNLPIR文字預處理
過程:文字分詞,過濾停用詞,詞頻統計,特徵選擇,文字表示
時間:2016年8月25日10:52:43
"""

import pynlpir
import codecs
import math

pynlpir.open()

#文字分詞
typelist = [u"財經",u"IT",u"健康",u"體育",u"旅遊",u"教育",u"招聘",u"文化",u"軍事"]

typetxt = codecs.open('C:\\Users\\Administrator\\Desktop\\txttype.txt', 'a', encoding='utf-8')
wordseg_result = codecs.open('C:\\Users\\Administrator\\Desktop\\wordseg_result.txt', 'a',encoding='utf-8')

allresult = []
for j in range(1,10):
    for i in range(10,510):
        typetxt.write(typelist[j-1] + "\n")

        s = ""
        singletext_result = []
        print  (u'正在對第 %s 個資料夾的第 %s 個文字進行分詞處理.....'%(j,i))
        f = codecs.open('C:\\Users\\Administrator\\Desktop\\textmining_experiment2\\Word Segment\\traintxt500\\%d\\%d.txt' % (j,i),'r',"gb18030")
        for line in f:
            s += line.strip().encode('utf-8')

        for item in pynlpir.segment(s):
            singletext_result.append(item[0])
        allresult.append(singletext_result)

typetxt.close()
print (u'文字類別析出完畢!結果已輸出到desktop的txttype.txt!')
#直接打印出結果
#for singletext_result in allresult:
#    for item in singletext_result:
#       print item

#所有結果寫入一個txt,一行一個文字
for singletext_result in allresult:
    for item in singletext_result:
        wordseg_result.write(item+'\t')
    wordseg_result.write('\n')
wordseg_result.close()
print (u'分詞完畢!分詞結果已輸出到desktop的wordseg_result.txt!'+'\n')


#過濾停用詞
stopwords = []
delstopwords_alltxt = []

st = codecs.open('C:\\Users\\Administrator\\PycharmProjects\\Newtextmining\\File\\stopwords.txt', 'rb',encoding='utf-8')
delstopwords_result = codecs.open('C:\\Users\\Administrator\\Desktop\\delstopwords_result.txt' , 'a',encoding='utf-8')

for line in st:
    line = line.strip()
    stopwords.append(line)

print (u'正在過濾停用詞......')

for singletext_result in allresult:
    delstopwords_singletxt = []
    for word in singletext_result:
        word = word.strip()
        if word not in stopwords:
            if word >= u'\u4e00' and word <= u'\u9fa5':#判斷是否是漢字
                delstopwords_singletxt.append(word)
    delstopwords_alltxt.append(delstopwords_singletxt)

for delstopwords_singletxt in delstopwords_alltxt:
    for everyword in delstopwords_singletxt:
        delstopwords_result.write(everyword + '\t')
    delstopwords_result.write('\n')
delstopwords_result.close()
print (u'停用詞過濾完畢!已將結果輸出到desktop的delstopwords_result.txt!'+'\n')


#統計絕對詞頻統計TF
getTF_alltxt_dic = {}
getTF_result =  codecs.open('C:\\Users\\Administrator\\Desktop\\getTF_result.txt' , 'a',encoding='utf-8')

print (u'正在統計TF......')

for delstopwords_singletxt in delstopwords_alltxt:
    getTF_singletxt_dic = {}
    for everyword in delstopwords_singletxt:
        everyword = everyword.strip()
        if everyword in getTF_singletxt_dic:
            getTF_singletxt_dic[everyword] += 1
        else:
            getTF_singletxt_dic[everyword] = 1

    getTF_singletxt_dic = sorted(getTF_singletxt_dic.items(), key=lambda d: d[1], reverse=1)


    for a, b in getTF_singletxt_dic:
        if b > 0:
            getTF_result.write(a + '\t' + str(b) + '\t')
    getTF_result.write('\n')

getTF_result.close()
print (u'TF值統計完畢!已將結果輸出到desktop的getTF_result.txt!'+'\n')


#特徵選擇
#計算所有類別DF
alltext = []
allwords = []

delstopwords_result =  codecs.open('C:\\Users\\Administrator\\Desktop\\delstopwords_result.txt' , 'rb',encoding='utf-8')

wordlist = []
for line in delstopwords_result:
    alltext.append(line)
    words = line.strip('\n').split('\t')
    for word in words:
        if word:
            wordlist.append(word)

print u"原始文字詞彙總數:", len(wordlist)
print u"文字個數:", len(alltext)
print u"詞彙種數:", len(set(wordlist))

print ('\n'+u'正在計算所有類別DF......')
word_df = []
for word in set(wordlist):
    count = 0
    for words in alltext:
        if word in words:
            count += 1
    word_df.append([word, str(count)])  # 儲存形式[word,DF]

# 輸出
word_df.sort(key=lambda x: int(x[1]),reverse=True)  # 詞頻從大到小排序
b = codecs.open('C:\\Users\\Administrator\\Desktop\\DF_allclass_result.txt', "a", encoding="utf-8")
b.truncate()
for item in word_df:
    for word in item:
        b.write(word+ '\t')
    b.write( '\n')
b.close()

b = codecs.open('C:\\Users\\Administrator\\Desktop\\DF_allclass_result.txt', "rb", encoding="utf-8")
for line in b:
    line = line.split('\t')
    if len(line[0])>1:
        c  = codecs.open('C:\\Users\\Administrator\\Desktop\\DF_allclass_result1.txt', "a", encoding="utf-8")
        c.write(line[0]+'\t'+line[1])
        c.write('\n')
c.close()

print (u'所有類別DF值統計完畢!已將結果輸出到desktop的DF_allclass_result1.txt!'+'\n')

#特徵選擇
#計算單一類別DF

print (u'正在計算單一類別DF......')

word_df2 = []
d  = codecs.open('C:\\Users\\Administrator\\Desktop\\DF_allclass_result1.txt', "rb", encoding="utf-8")

for line in d:
    line = line.split()
    word = line[0]

    count_1 = 0
    count_2 = 0
    count_3 = 0
    count_4 = 0
    count_5 = 0
    count_6 = 0
    count_7 = 0
    count_8 = 0
    count_9 = 0

    for words in alltext[0:500]:
        if word in words:
            count_1 += 1

    for words in alltext[500:1000]:
        if word in words:
            count_2 += 1

    for words in alltext[1000:1500]:
        if word in words:
            count_3 += 1

    for words in alltext[1500:2000]:
        if word in words:
            count_4 += 1

    for words in alltext[2000:2500]:
        if word in words:
            count_5 += 1

    for words in alltext[2500:3000]:
        if word in words:
            count_6 += 1

    for words in alltext[3000:3500]:
        if word in words:
            count_7 += 1

    for words in alltext[3500:4000]:
        if line[0] in words:
            count_8 += 1

    for words in alltext[4000:4500]:
        if word in words:
            count_9 += 1

    word_df2.append([word,str(count_1),str(count_2),str(count_3),str(count_4),str(count_5),str(count_6),str(count_7),str(count_8),str(count_9)])  # 儲存形式[word,DF]

d.close()

# 輸出
e = codecs.open('C:\\Users\\Administrator\\Desktop\\DF_singleclass_result.txt', "a", encoding="utf-8")
for item in word_df2:
    for term in item:
        e.write(term+'\t')
    e.write( '\n')
e.close()

print (u'單一類別DF值統計完畢!已將結果輸出到desktop的DF_singleclass_result.txt!'+'\n')

#計算特徵項資訊熵
print (u'正在計算資訊熵......')

IG = []
g  = codecs.open('C:\\Users\\Administrator\\Desktop\\DF_allclass_result1.txt', "rb", encoding="utf-8")
for line in g:
    line = line.split()
    word = line[0]
    word2 = float(line[1])
    PC = float(500)/float(4500)
    PC_1 = float(PC) * 9
    Entropy = -(float(PC_1)*float(math.log(PC_1,2)))
    PT = float(word2)/float(len(alltext))
    PT_1 = float(1) - PT

    h = codecs.open('C:\\Users\\Administrator\\Desktop\\DF_singleclass_result.txt', "rb", encoding="utf-8")
    lines = h.readline()
    line = lines[:-1]
    line = line.split()
    PCT_evenplus = ( float(line[1]) + float(line[2]) + float(line[3]) + float(line[4]) + float(line[5]) + float(line[6]) + float(line[7]) + float(line[8]) )/float(word2)
    PCT_evenplus_ = float(1) - float(PCT_evenplus)
    E1 = - (float(PCT_evenplus) * float(math.log(PCT_evenplus, 2)))
    E2 = -(float(PCT_evenplus_) * float(math.log(float(PCT_evenplus),2)))
    exEtropy =float(PT) * float(E1) + float(PT_1) * float(E2)

    IG_value = float(Entropy) - float(exEtropy)
    IG.append([word, str(IG_value)])  # 儲存形式[word,IG_value]

IG.sort(key=lambda x: float(x[1]), reverse=True)  # 詞頻從大到小排序
i = codecs.open('C:\\Users\\Administrator\\Desktop\\IG_value.txt', "a", encoding="utf-8")
i.truncate()
for item in IG:
    for word in item:
        i.write(word + '\t')
    i.write('\n')
i.close()

h.close()
g.close()
print (u'資訊增益值統計完畢!已將結果輸出到desktop的IG_value.txt!'+'\n')

print (u'正在選擇特徵詞......')
j = codecs.open('C:\\Users\\Administrator\\Desktop\\IG_value.txt', "rb", encoding="utf-8")
for line in j:
    line = line.split()
    if float(line[1])> -float(10):
        k = codecs.open('C:\\Users\\Administrator\\Desktop\\FeatureWords.txt', "a", encoding="utf-8")
        k.write(line[0])
        k.write('\n')
k.close()
j.close()
print (u'特徵詞選擇完畢!已將結果輸出到desktop的FeatureWords.txt!'+'\n')

f1 = codecs.open('C:\\Users\\Administrator\\Desktop\\DF_allclass_result1.txt', "rb", encoding="utf-8")
f2 = codecs.open('C:\\Users\\Administrator\\Desktop\\FeatureWords.txt', "rb", encoding="utf-8")
FeatureWords_value = codecs.open('C:\\Users\\Administrator\\Desktop\\FeatureWords_value.txt', "a", encoding="utf-8")

dic = {}
for line in f1:
    line =line.strip('\n').split('\t')
    dic[line[0]]=line[1]
f1.close()

for word in f2:
    if word in dic:
        FeatureWords_value.write(dic[word]+'\t'+dic[word]+'\n')
f2.close()
FeatureWords_value.close()


#文件向量化
print (u'正在進行文字向量化處理......')

f1 = codecs.open('C:\\Users\\Administrator\\Desktop\\DF_allclass_result1.txt', "rb", encoding="utf-8")
f2 = codecs.open('C:\\Users\\Administrator\\Desktop\\FeatureWords.txt', "rb", encoding="utf-8")
FeatureWords_value = codecs.open('C:\\Users\\Administrator\\Desktop\\FeatureWords_value.txt', "a", encoding="utf-8")

allfw=[]
for line in f1:
    dic = {}
    line =line.strip('\n').split('\t')
    dic[line[0]]=line[1]
    allfw.append(dic)
f1.close()

#for dic in allfw:
#   for k,v in dic.iteritems():
#       print k,v

fw=[]
for line in f2:
    line=line.strip('\n').split('\t')
    fw.append(line[0])
f2.close()

#for word in fw:
#   print word

for dic in allfw:
    for word in fw:
        if word in dic:
            for k, v in dic.iteritems():
                FeatureWords_value.write(k+'\t'+v+'\n')
FeatureWords_value.close()


feture_word = []
feture_word_dic = {}
feture_word_dic2 = {}

FeatureWords_value = codecs.open('C:\\Users\\Administrator\\Desktop\\FeatureWords_value.txt', "rb", encoding="utf-8")
for line in FeatureWords_value:
    line = line.split()
    IDF = math.log(4500/float(line[1]),10)
    feture_word.append(line[0])
    feture_word_dic[line[0]] = line[1]
    feture_word_dic2[line[0]] = IDF
FeatureWords_value.close()

getTF_result = codecs.open('C:\\Users\\Administrator\\Desktop\\getTF_result.txt', "rb", encoding="utf-8")
all=[]
for line in getTF_result:
    line = line.strip('\n').split('\t')
    single=[]
    for words in line:
        single.append(words)
    all.append(single)

#for single in all:
    #print single
  #  for word in single:
   #    print word

FeatureWords_value = codecs.open('C:\\Users\\Administrator\\Desktop\\FeatureWords_value.txt', "rb", encoding="utf-8")
alltext_vector = []
for single in all:

#    print tmax
    vector = []
    for word in feture_word:
        if word in single:
            tmax = single[1]
            inde=single.index(word)
            t = single[inde+1]
        else:
            t = 0
#        print t
        tf_idf = (float(t)/float(tmax))*float(feture_word_dic2[word])
        vector.append(tf_idf)
    alltext_vector.append(vector)

for vector in alltext_vector[0:500]:
    vector.append('Economy')
for vector in alltext_vector[500:1000]:
    vector.append('IT')
for vector in alltext_vector[1000:1500]:
    vector.append( 'Health')
for vector in alltext_vector[1500:2000]:
    vector.append('PE')
for vector in alltext_vector[2000:2500]:
    vector.append('Travel')
for vector in alltext_vector[2500:3000]:
    vector.append( 'Education')
for vector in alltext_vector[3000:3500]:
    vector.append('Enployment')
for vector in alltext_vector[3500:4000]:
    vector.append('Culture')
for vector in alltext_vector[4000:4500]:
    vector.append('Military')

#for vector in alltext_vector:
#  print vector
#    for value in vector:
#       print value

data = codecs.open('C:\\Users\\Administrator\\Desktop\\data.arff', "a", encoding="utf-8")
data.truncate()

data.write(u'@relation'+' '+u'sougoucorpus'+'\n\n')
for everyword in feture_word:
    data.write(u'@attribute'+ ' '+ everyword +' '+u'numeric\n')
data.write(u'@attribute type {Economy,IT,Health,PE,Travel,Educaiton,Enployment,Culture,Military}\n\
[email protected]
\n') for vector in alltext_vector: for value in vector[:-1]: data = codecs.open('C:\\Users\\Administrator\\Desktop\\data.arff', "a", encoding="utf-8") data.write(str(value) + ',') data.write(str(vector[-1]) + '\n') data.close() print (u'文字向量化處理完畢!已將結果輸出到desktop的data.arff!'+'\n') print (u'文字預處理結束!'+'\n')


相關推薦

Python進行文字處理文字過濾詞頻統計特徵選擇文字表示

系統:win7 32位 分詞軟體:PyNLPIR 整合開發環境(IDE):Pycharm 功能:實現多級文字預處理全過程,包括文字分詞,過濾停用詞,詞頻統計,特徵選擇,文字表示,並將結果匯出為WEKA能夠處理的.arff格式。 直接上程式碼: #!/usr/bin/

Python】中文過濾

中文分詞並過濾停用詞,python程式碼如下。 #coding=utf-8 import jieba input_path='../data/train_pos_100.txt' output_path='../data/train_pos_100_seg.txt' st

python進行資料處理過濾特殊符號英文和數字。適用於中文

要進行中文分詞,必須要求資料格式全部都是中文,需求過濾掉特殊符號、標點、英文、數字等。當然了使用者可以根據自己的要求過濾自定義字元。 實驗環境:python、mysql 實驗目的:從資料庫讀取資料,

OpenCV在字符提取中進行處理

的人 lease pos extract .net avg 圖像 rar 識別 OCR簡介熟悉OCR的人都了解,OCR大致分為兩個部分: -文字提取text extractor -文字識別text recognition 其中,第一部分是屬於圖像處理部分,涉及到圖像分割的知

《使用Python進行自然語言處理Nltk》2

import nltk from nltk.corpus import * '''1、古騰堡語料庫''' gutenberg.fileids() #所有古騰堡語料庫中的文字 emma = nltk.corpus.gutenberg.words('austen-e

python使用jieba實現中文文檔和去

分享圖片 lac lena idt center cut inpu span code 分詞工具的選擇:   現在對於中文分詞,分詞工具有很多種,比如說:jieba分詞、thulac、SnowNLP等。在這篇文檔中,筆者使用的jieba分詞,並且基於python3環境,選擇

改進的中科院系統NLPIR程式碼加入使用者詞典檔案讀寫+情感分析字典包+工具包+論文包

NLPIR分詞,加入使用者詞典,去停用詞,檔案讀寫等 原始碼下載地址 優化的分詞系統程式碼 原始碼下載地址 NLPIR分詞系統 優化的分詞系統程式碼 以下是核心程式碼 完整程式碼可以直接執行分詞,點我跳轉 public cl

使用jieba並去除流程程式

準備工作 ① 構建未分詞檔案、已分詞檔案兩個資料夾,將未分詞資料夾按類目定義檔名,各個類目的資料夾下可放置多個需要分詞的檔案。 ② 準備一份停用詞(jieba自身應該是沒有停用詞的) ③ 根據業務需要自定義詞典(此處使用jieba自帶字典) 分詞去停詞.py

使用IKAnalyzer實現中文&去除中文

1、簡介:IKAnalyzer是一個開源的,基於java語言開發的輕量級的中文分詞工具包。這裡使用的是IKAnalyzer2012。 2、IK Analyzer 2012特性: (1)採用了特有的“正向迭代最細粒度切分演算法“,支援細粒度和智慧分詞兩種切分模式; (2)在

使用結巴jieba對自然語言進行特徵處理Python、Java 實現

一、前言 之前使用基於 Python 語言的 Spark 進行機器學習,程式設計起來是十分簡單。 ① 但是演算法部署到雲伺服器上,是一個障礙。 ② 得藉助 Flask/Django 等 Python W

Python進行自然語言處理》程式碼筆記:第七章:從文字提取資訊

#!/usr/bin/env python # -*- coding: utf-8 -*- # @Author : Peidong # @Site : # @File : eg7.py # @Software: PyCharm """ 從文字提取資訊 """

Python正則表示式做文字處理去掉特殊符號

在進行文字訓練和處理之前難免要進行下預處理,過濾掉沒有用的符號等,簡單用python 的正則表示式過濾一下。 #!/usr/bin/python # encoding: UTF-8 import re # make English text clean def clean_en_text(te

sklearn庫:分類、迴歸、聚類、降維、模型優化、文字處理實現趕緊收藏

分類演算法 # knn演算法 from sklearn.neighbors import KNeighborsClassifier knn = KNeighborsClassifier() ''' __init__函式 def __init__(self, n_neighbors=5,

python與自然語言處理:中文文字

之前一直想要做一個文字的視覺化:詞雲,然後在網上搜到的一些製作詞雲的工具,有些是線上的就沒有使用,今天偶然看到python提供的wordcloud庫,可以方便製作詞雲,中英文皆可,趕緊試試,做個筆記,

python與自然語言處理:中文文字轉影象

最近使用word2vec對文字進行向量化表示,然後模仿基於CNN的影象分類實現文字分類。既然是模仿影象,那就應該可以將文字用影象視覺化一下,看看量化後的文字是什麼樣子。python處理影象的基本模組是Image庫,由於實驗中使用的是python3,需要安裝的影象處理庫為Pil

深度學習課程之文字處理袋模型、word2vec、語言模型1.9

詞向量和語言模型 深度學習其實最成功的應用是在影象上,有了 CNN 可以很好地提取影象上的特徵,這些特徵經過幾層的神經網路結構可以很好地組合成比較抽象的特徵。 NLP 常見任務 自動摘要:媒體需要的頭條通過 NLP 自動提取 機器翻譯 主題識別 文字分類

文字處理到TF-IDF權重計算

前言最近在看些自然語言處理的知識,這裡分享下語言處理的過程。一般而言,自然語言預處理包含分詞、去停用詞、權重計算等。0x01 nltk庫安裝這裡以nltk庫為例。nltk的全稱是natural language toolkit,是一套基於python的自然語言處理工具集。安裝

數據處理Python scikit-learn

距離度量 sklearn 神經網絡 效果 binary load roc maxscale 可能 在機器學習任務中,經常會對數據進行預處理.如尺度變換,標準化,二值化,正規化.至於采用哪種方法更有效,則與數據分布和采用算法有關.不同算法對數據的假設不同,可能需要不同的變換,

利用java實現對文字的去除以及處理

功能: 對txt文件進行分詞處理,並去除停用詞。 工具: IDEA,java,hankcs.hanlp.seg.common.Term等庫。 程式: import java.util.*; import java.io.*; import java.lang.String; imp

資料科學和人工智慧技術筆記 五、文字處理

五、文字預處理 作者:Chris Albon 譯者:飛龍 協議:CC BY-NC-SA 4.0 詞袋 # 載入庫 import numpy as np from sklearn.feature_extraction.text import Coun