windows下使用LTP分詞,安裝pyltp


1.LTP介紹

ltp是哈工大出品的自然語言處理工具箱, 提供包括中文分詞、詞性標注、命名實體識別、依存句法分析、語義角色標注等豐富、 高效、精准的自然語言處理技術。pyltp是python下對ltp(c++)的封裝. 在linux下我們很容易的安裝pyltp, 因為各種編譯工具比較方便. 但是在windows下需要安裝vs並且還得做一些配置,但是經過本人查閱資料總結了一種不需要安裝c++的方法。

2.windows下安裝pyltp

想使用LTP進行nlp的任務,第一步就是要需要安裝一個pyltp的包,如果直接pip insatll pyltp的話,很大概率時會報錯的,所以本人使用另一種方法安裝,那就是安裝輪子文件(whl文件):

第一步:創建python3.6或者3.5

檢查自己的電腦上是否有python3.6或(3.5)環境(python3.8不支持這種安裝),如果沒有python3.6(3.5)環境的話,需要先安裝python3.6(3.6),最簡便快捷的方法就是使用anaconda來安裝,在你的電腦安裝了anaconda的前提下,打開win+r輸入cmd進入命令窗,輸入

conda create --name python36 python=3.6  #這樣你就創建了一個新的python3.6環境

注意,在創建的時候會出現創建失敗的問題,具體問題有一堆如下的解釋:

UnavailableInvalidChannel: The channel is not accessible or is invalid.
      channel name: anaconda/pkgs/free
      channel url: https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
      error code: 404

這是因為清華園關閉了anaconda的服務,此時你需要輸入以下指令恢復設置:

conda config --remove-key channels

回復完畢以后,繼續上面的創建指令,就可以完成python環境的創建了。

在創建的時候會出現一個選擇,直接輸入 y 就好了。這樣你的python環境就創建完畢了,你可以進入你的anaconda安裝目錄下,進入scripts文件就可以看到你的新環境了。

第二步:下載whl文件

python3.5:pyltp-0.2.1-cp35-cp35m-win_amd64.whl
python3.6:pyltp-0.2.1-cp36-cp36m-win_amd64.whl

根據上一步創建的python環境選擇相應的whl文件,最好是單獨創建一個文件夾來存放這些whl文件。

第三步:安裝whl文件

這一步需要先進入到你創建的環境中去:

輸入

conda env list

檢查你的環境列表,然后輸入

activate XXX(你的環境名字)

進行激活,在進入到你的環境之后需要轉到你上一步存放whl文件的目錄,進行安裝:

使用:

cd /d E:\輪子文件

直接進入到你存放whl的文件夾,然后使用pip install 進行安裝。注意!!安裝的時候,一定要加whl后綴,不然會報錯

pip install pyltp-0.2.1-cp36-cp36m-win_amd64.whl

至此,whl安裝完畢

第四步:下載模型

模型地址:哈工大語言雲,我下載的是3.4版本的模型,下載好的模型解壓到自己創建的一個文件夾里面。

這里我為了方便使用,單獨建了一個專門用於存放網上下載的模型的文件夾CoModel,然后將下載下來的ltp模型ltp_data_v3.4.0解壓后拿出來,然后放到新建的一個叫做LTP的文件夾里面,可以看到里面有多個模型:

文件名 模型
cws.model 分句模型
ner.model 命名實體識別模型
parser.model 依存句法分析模型
pisrl.model 語義角色標注模型
pos.model 詞性標注模型

接下來,你就可以在你的程序里面調用這個模型了~~

注意!

本人使用的是pycharm,在pycharm中選擇解釋器的時候一定要選擇你第一步的環境(也就是你所安裝pyltp的環境),我沒用創建虛環境而是直接使用的python36環境,如果你想使用虛環境,在第一步的時候就要創建為虛環境:

conda create -n venvname python=3.6

最后附上自己分詞和詞頻統計的程序

# -*- coding: utf-8 -*-
from pyltp import Segmentor
import json
import re

def clean(path):  # 定義數據清理函數
    with open(path, encoding='UTF-8') as f:
        strs = ''
        for line in f.readlines():  # 讀取每一行,並將所有行存到一個strs里
            dict = json.loads(line)
            str = json.dumps(dict, ensure_ascii=False)
            strs += str
        strs_clean1 = strs.replace(' ', '')  # 去掉文本中的空格
        pattern = re.compile("[A-Z0-9元年月日\"\"{}::;,,、。.%%¥()《》—]")
        # pattern = re.compile("^\d{1,9}$")
        strs_clean2 = re.sub(pattern, '', strs_clean1)  # 去掉文本中的數字和字母、符號等
        return strs_clean2

def stopwordslist(filepath):    # 定義函數創建停用詞列表
    stopword = [line.strip() for line in open(filepath, 'r',encoding='utf-8').readlines()] # 以行的形式讀取停用詞表,同時轉換為列表
    return stopword

def word_splitter(sentence):  # 分詞
    segmentor = Segmentor()  # 初始化實例
    segmentor.load('./LTP/cws.model')  # 加載模型
    words = segmentor.segment(sentence)  # 分詞
    words_list = list(words)
    segmentor.release()  # 釋放模型
    return words_list

def get_TF(wordslist):
    TF_dic={}
    for word in wordslist:
        TF_dic[word] =TF_dic.get(word,0)+1
        # 在字典中查找word的值,該list中的值都為none,找到了就加1,第二次找到就為2...最終返還的是一堆鍵的值
        # print(TF_dic) # 打印鍵值
    return sorted(TF_dic.items(),key=lambda x:x[1],reverse=True) # True:降序
    #將字典定義為迭代器,[('word1',value1),('word2',value2)....]然后按照元組的[1]的值(value)來排序

data = clean('DataSet/testsp.json')
print('清洗后的數據:')
print(data)
words_list = word_splitter(data)  # 分詞后的結果
stopwords = stopwordslist('./DataSet/中文停用詞表.txt')
words_clean =[word for word in words_list if word not in stopwords]  # 去除停用詞
print('去除停用詞后的分詞:')
print(words_clean)
result = str(get_TF(words_clean))
print(result)

運行結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM