NLTK實現分詞

2021-10-24 14:11:30 字數 4252 閱讀 2858

本篇主要記錄在用python寫nltk分詞操作專案主要出現的錯誤以及改進的方法。

本文利用nltk,從資料庫中獲取文字並進行去停用詞處理,並將處理結果放入資料庫。

natural language toolkit,自然語言處理工具包,在nlp領域中,最常使用的乙個python庫。

nltk是乙個開源的專案,包含:python模組,資料集和教程,用於nlp的研究和開發 [1] 。

nltk由steven bird和edward loper在賓夕法尼亞大學計算機和資訊科學系開發。

nltk包括圖形演示和示例資料。其提供的教程解釋了工具包支援的語言處理任務背後的基本概念

在本文中主要用來對文字進行去停用詞處理

主要用到nltk包和pandas,可以通過以下命令 進行安裝:

pip install nltkpip install pandas

import pymysql

import re

import pandas as pd

from nltk.corpus import stopwords

from nltk.tokenize import word_tokenize

con=pymysql.connect(

host=

'localhost'

, port=

3306

, user=

'root'

, passwd=

'123'

, db=

'nce'

, charset=

'utf8',)

definsert

(con,frequent,l)

: cue = con.cursor(

)# print("mysql conneted")

try:

print

(str

(frequent)

)print

(l) cue.execute(

"update article set frequent=(%s) where a_id=(%s)",[

str(frequent)

,l])

print

("insert success"

)except exception as e:

print

('insert error:'

, e)

con.rollback(

)else

: con.commit(

) cue.close(

)def

read()

: cue = con.cursor(

) query =

"""select text

from article

"""stop_words =

set(stopwords.words(

'english'))

cue.execute(query)

result = cue.fetchall(

) df_resulet = pd.dataframe(

list

(result)

)for l in df_resulet.index:

text =

str(df_resulet.loc[l]

.values)

word_tokens = word_tokenize(text[1:

-1])

filtered_sentence =

[w for w in word_tokens if

not w in stop_words]

# print(filtered_sentence[1:-1])

insert(con,filtered_sentence[1:

-1],l+1)

read (

)con.close(

)

df_resulet = pd.dataframe(

list

(result)

)for l in df_resulet.index:

text = df_resulet.loc[l]

.values

報錯**如下:

typeerror: cannot use a string pattern on a bytes

-like object

改進方法: 就直接強轉成string型別就行

text =

str(df_resulet.loc[l]

.values)

一:**如下(示例):

def

insert

(con,frequent,l)

: cue = con.cursor(

)# print("mysql conneted")

try:

# print(frequent)

cue.execute(

"insert into article (frequent) values(%s)"

,[frequent]

)print

("insert success"

)except exception as e:

print

('insert error:'

, e)

con.rollback(

)else

: con.commit(

)

insert error:

(1241

,'operand should contain 1 column(s)'

)

這裡的錯誤是說:插入的資料應該包含一列,也就是說我插入的資料不止一列。

解決辦法:

首先,我傳入的是在def read()中強轉str0的變數,拿到sql語句中,就變成了陣列,所以是有多少個字元,就有多少個列,這樣當然插入不進,只要在語句中再強轉一次就行。

修改後**如下:

cue.execute(

"insert into article (frequent) values(%s)"

,str

(frequent)

)

try

: cue.execute(

"update article set frequent=(%s) where a_id=(%s)",[

str(frequent)

,l])

print

("insert success"

)

lock wait timeout exceeded;

try restarting transaction

原因:

因為sql的update查詢語句是很耗時的,在查詢過程導致鎖了,每次更新操作等了50秒還是失敗,解決辦法也很簡單,

檢視有沒耗時特別長的,再去檢視innodb的事務表innodb_trx,看下裡面是否有正在鎖定的事務執行緒,看看id是否在show full processlist裡面的sleep執行緒中,如果是,就證明這個sleep的執行緒事務一直沒有commit或者rollback而是卡住了,直接kill掉。

由於我已經kill掉了,這裡就沒有顯示了,有的話直接根據trx_mysql_thread_id下的值

kill ******

NLTK的分詞器

最近在做nlp的任務,經常會用到分詞。有個問題 nltk的word tokenizer和直接使用split 感覺效果是類似的,而且還會出現can t這類的詞被word tokenizer切分成ca n t。這樣看來,以後分詞就直接使用split 更加高效和正確麼?2021自己更新 現有分詞工具 1....

02 NLTK 分句 分詞 詞幹提取 詞型還原

nltk 分句 分詞 詞幹提取 詞型還原 print 案例1 分句 分詞 import nltk.tokenize as tk doc are you curious about tokenization?let s see how it works we need to analyze a cou...

NLTK在去停用詞 分詞 分句以及詞性標註的使用

因為實習的緣故,所以有機會接觸到了自然語言處理的一些方面。這裡主要總結一下在python環境下進行自然語言處理的相關包和可能會出現的相關錯誤,目前接觸的都比較 low,但是還是想要記錄下來。nltk是 python 下處理語言的主要工具包,可以實現去除停用詞 詞性標註以及分詞和分句等。安裝nltk,...