Chinese Processing#
Loading data#
Load the fiction “Blessing” written by Lu Xun
!wget -N https://raw.githubusercontent.com/P4CSS/PSS/master/data/blessing.txt
!ls
zsh:1: command not found: wget
TM00.ipynb TM08_doc_classification_pipeline.ipynb
TM01_tokenization(chi).ipynb TM09_BERTopic.ipynb
TM01_tokenization.ipynb TM09_re.ipynb
TM02_collocation.ipynb TM0X Using CKIPtagger.ipynb
TM03_2_pos_sentiment_chi.ipynb TM10_Using_Open_AI.ipynb
TM03_POS Tagging.ipynb blessing.txt
TM04_IR_search.ipynb data
TM05_sentiment.ipynb hindu.txt
TM06_Clustering.ipynb img
TM07_1_embeddings.ipynb lib
TM07_2_doc2vec.ipynb stopwords_zh-tw.txt
TM07_3_get_wordEmbeddings.ipynb test.html
TM07_embedding_clustering.ipynb userdict.txt
TM08_doc_classification.ipynb
with open("blessing.txt", encoding="utf8") as fin:
text = fin.read()
print(type(fin))
print(type(text))
print("Number of characters: %d" % len(text))
print(text[:int(len(text)/10)])
<class '_io.TextIOWrapper'>
<class 'str'>
Number of characters: 9618
舊曆的年底畢竟最像年底,村鎮上不必說,就在天空中也顯出將到新年的氣象來。灰白色的沉重的晚雲中間時時發出閃光,接著一聲鈍響,是送竈的爆竹;近處燃放的可就更強烈了,震耳的大音還沒有息,空氣裏已經散滿了幽微的火藥香。我是正在這一夜回到我的故鄉魯鎮的。雖說故鄉,然而已沒有家,所以只得暫寓在魯四老爺的宅子裏。他是我的本家,比我長一輩,應該稱之曰「四叔」,是一個講理學的老監生。他比先前並沒有甚麽大改變,單是老了些,但也還未留鬍子,一見面是寒暄,寒暄之後說我「胖了」,說我「胖了」之後即大罵其新黨。但我知道,這並非借題在罵我:因為他所罵的還是康有為。但是,談話是總不投機的了,於是不多久,我便一個人剩在書房裏。
第二天我起得很遲,午飯之後,出去看了幾個本家和朋友;第三天也照樣。他們也都沒有甚麽大改變,單是老了些;家中卻一律忙,都在準備著「祝福」。這是魯鎮年終的大典,致敬盡禮,迎接福神,拜求來年一年中的好運氣的。殺雞,宰鵝,買豬肉,用心細細的洗,女人的臂膊都在水裏浸得通紅,有的還帶著絞絲銀鐲子。煮熟之後,橫七豎八的插些筷子在這類東西上,可就稱為「福禮」了,五更天陳列起來,並且點上香燭,恭請福神們來享用,拜的卻只限於男人,拜完自然仍然是放爆竹。年年如此,家家如此,——只要買得起福禮和爆竹之類的——今年自然也如此。天色愈陰暗了,下午竟下起雪來,雪花大的有梅花那麽大,滿天飛舞,夾著煙靄和忙碌的氣色,將魯鎮亂成一團糟。我回到四叔的書房裏時,瓦楞上已經雪白,房裏也映得較光明,極分明的顯出壁上掛著的朱拓的大「壽」字,陳摶老祖寫的,一邊的對聯已經脫落,鬆鬆的卷了放在長桌上,一邊的還在,道是「事理通達心氣和平」。我又無聊賴的到窗下的案頭去一翻,只見一堆似乎未必完全的《康熙字典》,一部《近思錄集註》和一部《四書襯》。無論如何、我明天決計要走了。
況且,一直到昨天遇見祥林嫂的事,也就使我不能安住。那是下午,我到鎮的東頭訪過一個朋友,走出來,就在河邊遇見她;而且見她瞪著的眼睛的視線,就知道明明是向我走來的。我這回在魯鎮所見的人們中,改變之大,可以說無過於她的了:五年前的花白的頭髮,即今已經全白,會不像四十上下的人;臉上瘦削不堪,黃中帶黑,而且消盡了先前悲哀的神色,仿佛是木刻似的;只有那眼珠間或一輪,還可以表示她是一
Setence segment#
After Removing the fullspace and newline symbols
text_refined = text.replace(" ", "").replace("\n", "")
sentences = text_refined.split("。")
print(sentences[:20])
print("Number of sentences: %d" % len(sentences))
['舊曆的年底畢竟最像年底,村鎮上不必說,就在天空中也顯出將到新年的氣象來', '灰白色的沉重的晚雲中間時時發出閃光,接著一聲鈍響,是送竈的爆竹;近處燃放的可就更強烈了,震耳的大音還沒有息,空氣裏已經散滿了幽微的火藥香', '我是正在這一夜回到我的故鄉魯鎮的', '雖說故鄉,然而已沒有家,所以只得暫寓在魯四老爺的宅子裏', '他是我的本家,比我長一輩,應該稱之曰「四叔」,是一個講理學的老監生', '他比先前並沒有甚麽大改變,單是老了些,但也還未留鬍子,一見面是寒暄,寒暄之後說我「胖了」,說我「胖了」之後即大罵其新黨', '但我知道,這並非借題在罵我:因為他所罵的還是康有為', '但是,談話是總不投機的了,於是不多久,我便一個人剩在書房裏', '第二天我起得很遲,午飯之後,出去看了幾個本家和朋友;第三天也照樣', '他們也都沒有甚麽大改變,單是老了些;家中卻一律忙,都在準備著「祝福」', '這是魯鎮年終的大典,致敬盡禮,迎接福神,拜求來年一年中的好運氣的', '殺雞,宰鵝,買豬肉,用心細細的洗,女人的臂膊都在水裏浸得通紅,有的還帶著絞絲銀鐲子', '煮熟之後,橫七豎八的插些筷子在這類東西上,可就稱為「福禮」了,五更天陳列起來,並且點上香燭,恭請福神們來享用,拜的卻只限於男人,拜完自然仍然是放爆竹', '年年如此,家家如此,——只要買得起福禮和爆竹之類的——今年自然也如此', '天色愈陰暗了,下午竟下起雪來,雪花大的有梅花那麽大,滿天飛舞,夾著煙靄和忙碌的氣色,將魯鎮亂成一團糟', '我回到四叔的書房裏時,瓦楞上已經雪白,房裏也映得較光明,極分明的顯出壁上掛著的朱拓的大「壽」字,陳摶老祖寫的,一邊的對聯已經脫落,鬆鬆的卷了放在長桌上,一邊的還在,道是「事理通達心氣和平」', '我又無聊賴的到窗下的案頭去一翻,只見一堆似乎未必完全的《康熙字典》,一部《近思錄集註》和一部《四書襯》', '無論如何、我明天決計要走了', '況且,一直到昨天遇見祥林嫂的事,也就使我不能安住', '那是下午,我到鎮的東頭訪過一個朋友,走出來,就在河邊遇見她;而且見她瞪著的眼睛的視線,就知道明明是向我走來的']
Number of sentences: 273
Chinese word Segmentation#
# !pip install jieba
import jieba
print(sentences[0])
print(jieba.cut(sentences[0]))
print(list(jieba.cut(sentences[0])))
Building prefix dict from the default dictionary ...
Loading model from cache /var/folders/4m/shks9p8j0dnbv51nf7cyysfc0000gn/T/jieba.cache
舊曆的年底畢竟最像年底,村鎮上不必說,就在天空中也顯出將到新年的氣象來
<generator object Tokenizer.cut at 0x106618e40>
Loading model cost 0.285 seconds.
Prefix dict has been built successfully.
['舊', '曆', '的', '年底', '畢竟', '最', '像', '年底', ',', '村鎮', '上', '不必', '說', ',', '就', '在', '天空', '中', '也', '顯出', '將到', '新年', '的', '氣象', '來']
import jieba
print(" / ".join(jieba.cut(sentences[0])))
print(" / ".join(jieba.cut("台北市長柯文哲")))
舊 / 曆 / 的 / 年底 / 畢竟 / 最 / 像 / 年底 / , / 村鎮 / 上 / 不必 / 說 / , / 就 / 在 / 天空 / 中 / 也 / 顯出 / 將到 / 新年 / 的 / 氣象 / 來
台北市 / 長 / 柯文 / 哲
Comparing Simlified and Traditional Chinese Word Segmentation#
Converstion between Simplified and Traditional Chinese#
!pip install hanziconv
from hanziconv import HanziConv
sim = HanziConv.toSimplified('臺北市長柯文哲')
print(sim)
tra = HanziConv.toTraditional(sim)
print(tra)
Requirement already satisfied: hanziconv in /Users/jirlong/anaconda3/lib/python3.10/site-packages (0.3.2)
DEPRECATION: textract 1.6.5 has a non-standard dependency specifier extract-msg<=0.29.*. pip 24.0 will enforce this behaviour change. A possible replacement is to upgrade to a newer version of textract or contact the author to suggest that they release a version with a conforming dependency specifiers. Discussion can be found at https://github.com/pypa/pip/issues/12063
台北市长柯文哲
颱北市長柯文哲
sim = HanziConv.toSimplified('第二天我起得很遲,午飯之後,出去看了幾個本家和朋友')
print(sim)
tra = HanziConv.toTraditional(sim)
print(tra)
第二天我起得很迟,午饭之后,出去看了几个本家和朋友
第二天我起得很遲,午飯之後,齣去看瞭幾個本傢和朋友
Segmentation comparision between traditional and simplified Chinese#
tra = '台北市長柯文哲'
sim = HanziConv.toSimplified(tra)
print(" / ".join(jieba.cut(tra)))
print(" / ".join(jieba.cut(sim)))
台北市 / 長 / 柯文 / 哲
台北 / 市长 / 柯文 / 哲
sim = HanziConv.toSimplified(sentences[0])
sim_cutted = list(jieba.cut(sim))
sim_cutted_to_tra = [HanziConv.toTraditional(term) for term in sim_cutted]
print(" / ".join(sim_cutted_to_tra))
print(" / ".join(jieba.cut(sim)))
舊曆 / 的 / 年底 / 畢竟 / 最像 / 年底 / , / 村鎮 / 上 / 不必 / 說 / , / 就 / 在 / 天空 / 中 / 也 / 顯齣 / 將 / 到 / 新年 / 的 / 氣象 / 來
旧历 / 的 / 年底 / 毕竟 / 最像 / 年底 / , / 村镇 / 上 / 不必 / 说 / , / 就 / 在 / 天空 / 中 / 也 / 显出 / 将 / 到 / 新年 / 的 / 气象 / 来
tra = "國民黨高雄市長候選人韓國瑜今天晚上開直播,針對最近引起爭議的一些事說明,強調他並沒有消費愛心菜販陳樹菊,全力支持「館長」做公益,所謂高雄三鳳宮靈籤可能是「新型態選舉詐騙」;至於為強調招商引資說出「陪睡」遭批,他以後不會說這麼有張力的用語,畢竟是市長候選人。"
sim = HanziConv.toSimplified(tra)
sim_cutted = list(jieba.cut(sim))
sim_cutted_tra = [HanziConv.toTraditional(term) for term in sim_cutted]
print(" / ".join(jieba.cut(tra)))
print(" / ".join(sim_cutted_tra))
print(" / ".join(jieba.cut(sim)))
國民黨 / 高雄市 / 長 / 候選人 / 韓國瑜 / 今天 / 晚上 / 開 / 直播 / , / 針對 / 最近 / 引起 / 爭議 / 的 / 一些 / 事 / 說明 / , / 強調 / 他 / 並沒有 / 消費 / 愛心 / 菜 / 販陳樹菊 / , / 全力支持 / 「 / 館長 / 」 / 做 / 公益 / , / 所謂 / 高雄 / 三鳳 / 宮靈 / 籤 / 可能 / 是 / 「 / 新型 / 態選舉 / 詐騙 / 」 / ; / 至於 / 為 / 強調 / 招商 / 引資 / 說 / 出 / 「 / 陪 / 睡 / 」 / 遭批 / , / 他 / 以後不會 / 說 / 這麼 / 有 / 張力 / 的 / 用語 / , / 畢 / 竟是 / 市長 / 候選人 / 。
國民黨 / 高雄市 / 長 / 候選人 / 韓國 / 瑜 / 今天 / 晚上 / 開 / 直播 / , / 針對 / 最近 / 引起爭議 / 的 / 一些 / 事 / 說明 / , / 強調 / 他 / 並 / 沒有 / 消費 / 愛心 / 菜販 / 陳樹菊 / , / 全力支持 / 「 / 館長 / 」 / 做 / 公益 / , / 所謂 / 高雄 / 三鳳宮 / 靈簽 / 可能 / 是 / 「 / 新型 / 態 / 選舉 / 詐騙 / 」 / ; / 至於 / 為 / 強調 / 招商引資 / 說齣 / 「 / 陪 / 睡 / 」 / 遭批 / , / 他 / 以後 / 不會 / 說 / 這麼 / 有 / 張力 / 的 / 用語 / , / 畢竟 / 是 / 市長 / 候選人 / 。
国民党 / 高雄市 / 长 / 候选人 / 韩国 / 瑜 / 今天 / 晚上 / 开 / 直播 / , / 针对 / 最近 / 引起争议 / 的 / 一些 / 事 / 说明 / , / 强调 / 他 / 并 / 没有 / 消费 / 爱心 / 菜贩 / 陈树菊 / , / 全力支持 / 「 / 馆长 / 」 / 做 / 公益 / , / 所谓 / 高雄 / 三凤宫 / 灵签 / 可能 / 是 / 「 / 新型 / 态 / 选举 / 诈骗 / 」 / ; / 至于 / 为 / 强调 / 招商引资 / 说出 / 「 / 陪 / 睡 / 」 / 遭批 / , / 他 / 以后 / 不会 / 说 / 这么 / 有 / 张力 / 的 / 用语 / , / 毕竟 / 是 / 市长 / 候选人 / 。
Solution 1: Traditional cutted by Simplified index#
import numpy
numpy.cumsum([1, 2, 3, 4, 5])
array([ 1, 3, 6, 10, 15])
import numpy
print(sentences[0])
def tra_cutted_by_sim(tra):
sim_cutted = jieba.cut(HanziConv.toSimplified(tra))
term_len = [len(w) for w in list(sim_cutted)]
term_index = [0] + list(numpy.cumsum(term_len)[:-1])
term_dict = {k:v for k, v, in zip(term_index, term_len)}
tra_cutted = [tra[k:k+v] for k, v in term_dict.items()]
return tra_cutted
print(tra_cutted_by_sim(sentences[0]))
sim_cutted = jieba.cut(HanziConv.toSimplified(sentences[0]))
sim_cutted_to_tra = [HanziConv.toTraditional(term) for term in sim_cutted]
print(sim_cutted_to_tra)
舊曆的年底畢竟最像年底,村鎮上不必說,就在天空中也顯出將到新年的氣象來
['舊曆', '的', '年底', '畢竟', '最像', '年底', ',', '村鎮', '上', '不必', '說', ',', '就', '在', '天空', '中', '也', '顯出', '將', '到', '新年', '的', '氣象', '來']
['舊曆', '的', '年底', '畢竟', '最像', '年底', ',', '村鎮', '上', '不必', '說', ',', '就', '在', '天空', '中', '也', '顯齣', '將', '到', '新年', '的', '氣象', '來']
Solution 2: traditional by simplified index#
def restore(text, toks):
results = []
offset = 0
for tok in toks:
results.append(text[offset:offset + len(tok)])
offset += len(tok)
return results
print(restore(tra, list(jieba.cut(HanziConv.toSimplified(tra)))))
['國民黨', '高雄市', '長', '候選人', '韓國', '瑜', '今天', '晚上', '開', '直播', ',', '針對', '最近', '引起爭議', '的', '一些', '事', '說明', ',', '強調', '他', '並', '沒有', '消費', '愛心', '菜販', '陳樹菊', ',', '全力支持', '「', '館長', '」', '做', '公益', ',', '所謂', '高雄', '三鳳宮', '靈籤', '可能', '是', '「', '新型', '態', '選舉', '詐騙', '」', ';', '至於', '為', '強調', '招商引資', '說出', '「', '陪', '睡', '」', '遭批', ',', '他', '以後', '不會', '說', '這麼', '有', '張力', '的', '用語', ',', '畢竟', '是', '市長', '候選人', '。']
Handle OOV with an external dictionary
# Segmenting traditional Chinese directly
sample = "國民黨高雄市長候選人韓國瑜今天晚上開直播,針對最近引起爭議的一些事說明,強調他並沒有消費愛心菜販陳樹菊,全力支持「館長」做公益,所謂高雄三鳳宮靈籤可能是「新型態選舉詐騙」;至於為強調招商引資說出「陪睡」遭批,他以後不會說這麼有張力的用語,畢竟是市長候選人。"
print(" / ".join(jieba.cut(sample)))
國民黨 / 高雄市 / 長 / 候選人 / 韓國瑜 / 今天 / 晚上 / 開 / 直播 / , / 針對 / 最近 / 引起 / 爭議 / 的 / 一些 / 事 / 說明 / , / 強調 / 他 / 並沒有 / 消費 / 愛心 / 菜 / 販陳樹菊 / , / 全力支持 / 「 / 館長 / 」 / 做 / 公益 / , / 所謂 / 高雄 / 三鳳 / 宮靈 / 籤 / 可能 / 是 / 「 / 新型 / 態選舉 / 詐騙 / 」 / ; / 至於 / 為 / 強調 / 招商 / 引資 / 說 / 出 / 「 / 陪 / 睡 / 」 / 遭批 / , / 他 / 以後不會 / 說 / 這麼 / 有 / 張力 / 的 / 用語 / , / 畢 / 竟是 / 市長 / 候選人 / 。
# cutting traditional-to-simplified Chinese
print(" / ".join(jieba.cut(HanziConv.toSimplified(sample))))
国民党 / 高雄市 / 长 / 候选人 / 韩国 / 瑜 / 今天 / 晚上 / 开 / 直播 / , / 针对 / 最近 / 引起争议 / 的 / 一些 / 事 / 说明 / , / 强调 / 他 / 并 / 没有 / 消费 / 爱心 / 菜贩 / 陈树菊 / , / 全力支持 / 「 / 馆长 / 」 / 做 / 公益 / , / 所谓 / 高雄 / 三凤宫 / 灵签 / 可能 / 是 / 「 / 新型 / 态 / 选举 / 诈骗 / 」 / ; / 至于 / 为 / 强调 / 招商引资 / 说出 / 「 / 陪 / 睡 / 」 / 遭批 / , / 他 / 以后 / 不会 / 说 / 这么 / 有 / 张力 / 的 / 用语 / , / 毕竟 / 是 / 市长 / 候选人 / 。
# Segmenting traditional Chinese directly
sample = "國民黨高雄市長候選人韓國瑜今天晚上開直播,針對最近引起爭議的一些事說明,強調他並沒有消費愛心菜販陳樹菊,全力支持「館長」做公益,所謂高雄三鳳宮靈籤可能是「新型態選舉詐騙」;至於為強調招商引資說出「陪睡」遭批,他以後不會說這麼有張力的用語,畢竟是市長候選人。"
print(" / ".join(jieba.cut(sample)))
# Segmenting traditional Chinese by cutted simplified index
print("/ ".join(restore(sample, list(jieba.cut(HanziConv.toSimplified(sample))))))
國民黨 / 高雄市 / 長 / 候選人 / 韓國瑜 / 今天 / 晚上 / 開 / 直播 / , / 針對 / 最近 / 引起 / 爭議 / 的 / 一些 / 事 / 說明 / , / 強調 / 他 / 並沒有 / 消費 / 愛心 / 菜 / 販陳樹菊 / , / 全力支持 / 「 / 館長 / 」 / 做 / 公益 / , / 所謂 / 高雄 / 三鳳 / 宮靈 / 籤 / 可能 / 是 / 「 / 新型 / 態選舉 / 詐騙 / 」 / ; / 至於 / 為 / 強調 / 招商 / 引資 / 說 / 出 / 「 / 陪 / 睡 / 」 / 遭批 / , / 他 / 以後不會 / 說 / 這麼 / 有 / 張力 / 的 / 用語 / , / 畢 / 竟是 / 市長 / 候選人 / 。
國民黨/ 高雄市/ 長/ 候選人/ 韓國/ 瑜/ 今天/ 晚上/ 開/ 直播/ ,/ 針對/ 最近/ 引起爭議/ 的/ 一些/ 事/ 說明/ ,/ 強調/ 他/ 並/ 沒有/ 消費/ 愛心/ 菜販/ 陳樹菊/ ,/ 全力支持/ 「/ 館長/ 」/ 做/ 公益/ ,/ 所謂/ 高雄/ 三鳳宮/ 靈籤/ 可能/ 是/ 「/ 新型/ 態/ 選舉/ 詐騙/ 」/ ;/ 至於/ 為/ 強調/ 招商引資/ 說出/ 「/ 陪/ 睡/ 」/ 遭批/ ,/ 他/ 以後/ 不會/ 說/ 這麼/ 有/ 張力/ 的/ 用語/ ,/ 畢竟/ 是/ 市長/ 候選人/ 。
(Tool) Comparing Traditional cutted by simplfied Chinese#
tra_cutted = list(jieba.cut(sample))
cut_by_sim = tra_cutted_by_sim(sample)
i, j = 0, 0
print("Cutted tra directly:", tra_cutted)
print("Cutted by sim:", cut_by_sim)
print(len(tra_cutted), len(cut_by_sim))
while i < len(tra_cutted) and j < len(cut_by_sim):
if tra_cutted[i] == cut_by_sim[j]:
print("[%d]%s\t[%d]%s" % (i, tra_cutted[i], j, cut_by_sim[j]))
i += 1
j += 1
else:
ei, ej = 1, 1
listi, listj = [], []
listi.append(tra_cutted[i])
listj.append(cut_by_sim[j])
while "".join(listi) != "".join(listj):
if(len("".join(listi)) < len("".join(listj))):
listi.append(tra_cutted[i+ei])
ei += 1
else:
listj.append(cut_by_sim[j+ej])
ej += 1
print("\t[%d_%d]%s\t[%d_%d]%s" % (i, ei, listi, j, ej, listj))
i += ei
j += ej
Cutted tra directly: ['國民黨', '高雄市', '長', '候選人', '韓國瑜', '今天', '晚上', '開', '直播', ',', '針對', '最近', '引起', '爭議', '的', '一些', '事', '說明', ',', '強調', '他', '並沒有', '消費', '愛心', '菜', '販陳樹菊', ',', '全力支持', '「', '館長', '」', '做', '公益', ',', '所謂', '高雄', '三鳳', '宮靈', '籤', '可能', '是', '「', '新型', '態選舉', '詐騙', '」', ';', '至於', '為', '強調', '招商', '引資', '說', '出', '「', '陪', '睡', '」', '遭批', ',', '他', '以後不會', '說', '這麼', '有', '張力', '的', '用語', ',', '畢', '竟是', '市長', '候選人', '。']
Cutted by sim: ['國民黨', '高雄市', '長', '候選人', '韓國', '瑜', '今天', '晚上', '開', '直播', ',', '針對', '最近', '引起爭議', '的', '一些', '事', '說明', ',', '強調', '他', '並', '沒有', '消費', '愛心', '菜販', '陳樹菊', ',', '全力支持', '「', '館長', '」', '做', '公益', ',', '所謂', '高雄', '三鳳宮', '靈籤', '可能', '是', '「', '新型', '態', '選舉', '詐騙', '」', ';', '至於', '為', '強調', '招商引資', '說出', '「', '陪', '睡', '」', '遭批', ',', '他', '以後', '不會', '說', '這麼', '有', '張力', '的', '用語', ',', '畢竟', '是', '市長', '候選人', '。']
74 74
[0]國民黨 [0]國民黨
[1]高雄市 [1]高雄市
[2]長 [2]長
[3]候選人 [3]候選人
[4_1]['韓國瑜'] [4_2]['韓國', '瑜']
[5]今天 [6]今天
[6]晚上 [7]晚上
[7]開 [8]開
[8]直播 [9]直播
[9], [10],
[10]針對 [11]針對
[11]最近 [12]最近
[12_2]['引起', '爭議'] [13_1]['引起爭議']
[14]的 [14]的
[15]一些 [15]一些
[16]事 [16]事
[17]說明 [17]說明
[18], [18],
[19]強調 [19]強調
[20]他 [20]他
[21_1]['並沒有'] [21_2]['並', '沒有']
[22]消費 [23]消費
[23]愛心 [24]愛心
[24_2]['菜', '販陳樹菊'] [25_2]['菜販', '陳樹菊']
[26], [27],
[27]全力支持 [28]全力支持
[28]「 [29]「
[29]館長 [30]館長
[30]」 [31]」
[31]做 [32]做
[32]公益 [33]公益
[33], [34],
[34]所謂 [35]所謂
[35]高雄 [36]高雄
[36_3]['三鳳', '宮靈', '籤'] [37_2]['三鳳宮', '靈籤']
[39]可能 [39]可能
[40]是 [40]是
[41]「 [41]「
[42]新型 [42]新型
[43_1]['態選舉'] [43_2]['態', '選舉']
[44]詐騙 [45]詐騙
[45]」 [46]」
[46]; [47];
[47]至於 [48]至於
[48]為 [49]為
[49]強調 [50]強調
[50_2]['招商', '引資'] [51_1]['招商引資']
[52_2]['說', '出'] [52_1]['說出']
[54]「 [53]「
[55]陪 [54]陪
[56]睡 [55]睡
[57]」 [56]」
[58]遭批 [57]遭批
[59], [58],
[60]他 [59]他
[61_1]['以後不會'] [60_2]['以後', '不會']
[62]說 [62]說
[63]這麼 [63]這麼
[64]有 [64]有
[65]張力 [65]張力
[66]的 [66]的
[67]用語 [67]用語
[68], [68],
[69_2]['畢', '竟是'] [69_2]['畢竟', '是']
[71]市長 [71]市長
[72]候選人 [72]候選人
[73]。 [73]。
Loading userdict#
!wget -N https://raw.githubusercontent.com/P4CSS/PSS/master/data/userdict.txt
!ls
jieba.load_userdict("userdict.txt")
print(" / ".join(jieba.cut(sentences[0])))
zsh:1: command not found: wget
TM00.ipynb TM08_doc_classification_pipeline.ipynb
TM01_tokenization(chi).ipynb TM09_BERTopic.ipynb
TM01_tokenization.ipynb TM09_re.ipynb
TM02_collocation.ipynb TM0X Using CKIPtagger.ipynb
TM03_2_pos_sentiment_chi.ipynb TM10_Using_Open_AI.ipynb
TM03_POS Tagging.ipynb blessing.txt
TM04_IR_search.ipynb data
TM05_sentiment.ipynb hindu.txt
TM06_Clustering.ipynb img
TM07_1_embeddings.ipynb lib
TM07_2_doc2vec.ipynb stopwords_zh-tw.txt
TM07_3_get_wordEmbeddings.ipynb test.html
TM07_embedding_clustering.ipynb userdict.txt
TM08_doc_classification.ipynb
舊曆 / 的 / 年底 / 畢竟 / 最 / 像 / 年底 / , / 村鎮 / 上 / 不必 / 說 / , / 就 / 在 / 天空 / 中 / 也 / 顯出 / 將到 / 新年 / 的 / 氣象 / 來
print(" / ".join(jieba.cut(sample)))
國民黨 / 高雄市 / 長 / 候選人 / 韓國瑜 / 今天 / 晚上 / 開 / 直播 / , / 針對 / 最近 / 引起 / 爭議 / 的 / 一些 / 事 / 說明 / , / 強調 / 他 / 並沒有 / 消費 / 愛心 / 菜販 / 陳樹菊 / , / 全力支持 / 「 / 館長 / 」 / 做 / 公益 / , / 所謂 / 高雄 / 三鳳宮 / 靈籤 / 可能 / 是 / 「 / 新型 / 態選舉 / 詐騙 / 」 / ; / 至於 / 為 / 強調 / 招商 / 引資 / 說 / 出 / 「 / 陪 / 睡 / 」 / 遭批 / , / 他 / 以後不會 / 說 / 這麼 / 有 / 張力 / 的 / 用語 / , / 畢 / 竟是 / 市長 / 候選人 / 。
POS Tagging with Jieba#
import jieba.posseg
print(list((jieba.posseg.cut(sample))))
[pair('國民黨', 'nt'), pair('高雄市', 'ns'), pair('長候', 'n'), pair('選人', 'n'), pair('韓國瑜', 'x'), pair('今天', 't'), pair('晚上', 't'), pair('開', 'zg'), pair('直播', 'vn'), pair(',', 'x'), pair('針對', 'p'), pair('最近', 'f'), pair('引起', 'v'), pair('爭議', 'n'), pair('的', 'uj'), pair('一些', 'm'), pair('事', 'n'), pair('說', 'v'), pair('明', 't'), pair(',', 'x'), pair('強調', 'v'), pair('他', 'r'), pair('並', 'c'), pair('沒有', 'v'), pair('消費', 'vn'), pair('愛心', 'n'), pair('菜販', 'n'), pair('陳樹菊', 'x'), pair(',', 'x'), pair('全力支持', 'n'), pair('「', 'x'), pair('館長', 'n'), pair('」', 'x'), pair('做', 'v'), pair('公益', 'n'), pair(',', 'x'), pair('所謂', 'b'), pair('高雄', 'n'), pair('三鳳宮', 'x'), pair('靈籤', 'x'), pair('可能', 'v'), pair('是', 'v'), pair('「', 'x'), pair('新型', 'b'), pair('態', 'n'), pair('選舉', 'v'), pair('詐騙', 'vn'), pair('」', 'x'), pair(';', 'x'), pair('至於', 'i'), pair('為', 'p'), pair('強調', 'v'), pair('招商', 'n'), pair('引資說', 'l'), pair('出', 'v'), pair('「', 'x'), pair('陪', 'v'), pair('睡', 'v'), pair('」', 'x'), pair('遭批', 'v'), pair(',', 'x'), pair('他', 'r'), pair('以', 'p'), pair('後', 'nr'), pair('不', 'd'), pair('會', 'v'), pair('說', 'v'), pair('這麼', 'r'), pair('有', 'v'), pair('張力', 'nr'), pair('的', 'uj'), pair('用語', 'n'), pair(',', 'x'), pair('畢', 'zg'), pair('竟是', 'd'), pair('市長候', 'n'), pair('選人', 'n'), pair('。', 'x')]
for word, pos in jieba.posseg.cut(sample):
print("%s\t%s" % (word, pos))
國民黨 nt
高雄市 ns
長候 n
選人 n
韓國瑜 x
今天 t
晚上 t
開 zg
直播 vn
, x
針對 p
最近 f
引起 v
爭議 n
的 uj
一些 m
事 n
說 v
明 t
, x
強調 v
他 r
並 c
沒有 v
消費 vn
愛心 n
菜販 n
陳樹菊 x
, x
全力支持 n
「 x
館長 n
」 x
做 v
公益 n
, x
所謂 b
高雄 n
三鳳宮 x
靈籤 x
可能 v
是 v
「 x
新型 b
態 n
選舉 v
詐騙 vn
」 x
; x
至於 i
為 p
強調 v
招商 n
引資說 l
出 v
「 x
陪 v
睡 v
」 x
遭批 v
, x
他 r
以 p
後 nr
不 d
會 v
說 v
這麼 r
有 v
張力 nr
的 uj
用語 n
, x
畢 zg
竟是 d
市長候 n
選人 n
。 x
Top Words Mining#
from collections import Counter
word_counts = Counter()
for sentence in sentences:
for word in jieba.cut(sentence):
word_counts[word] += 1
print(word_counts.most_common(20))
[(',', 693), ('的', 345), ('了', 197), ('她', 155), ('我', 88), ('是', 86), ('「', 83), ('」', 83), ('也', 77), ('說', 65), ('在', 61), ('來', 57), ('就', 56), ('裏', 54), ('…', 50), ('?', 47), ('有', 46), ('麽', 45), ('不', 37), ('祥林嫂', 35)]
from collections import Counter
word_counts = Counter()
for sentence in sentences:
for word in jieba.cut(sentence):
if len(word) > 1:
word_counts[word] += 1
print(word_counts.most_common(20))
[('祥林嫂', 35), ('一個', 33), ('知道', 26), ('四叔', 21), ('自己', 18), ('然而', 17), ('時候', 17), ('已經', 16), ('起來', 15), ('大家', 15), ('所以', 13), ('他們', 12), ('四嬸', 12), ('女人', 11), ('男人', 11), ('似乎', 11), ('先前', 10), ('人們', 10), ('阿毛', 10), ('出去', 9)]
import unicodedata
chars = "『「,。、標點符號"
print([unicodedata.category(ch) for ch in chars])
['Ps', 'Ps', 'Po', 'Po', 'Po', 'Lo', 'Lo', 'Lo', 'Lo']
import unicodedata
from collections import Counter
word_counts = Counter()
for sentence in sentences:
for word in jieba.cut(sentence):
if len(word) > 1 or not unicodedata.category(word).startswith('P'):
word_counts[word] += 1
print(word_counts.most_common(20))
[('的', 345), ('了', 197), ('她', 155), ('我', 88), ('是', 86), ('也', 77), ('說', 65), ('在', 61), ('來', 57), ('就', 56), ('裏', 54), ('有', 46), ('麽', 45), ('不', 37), ('祥林嫂', 35), ('又', 34), ('一個', 33), ('你', 33), ('去', 32), ('他', 28)]
Stop word removal#
Manipulate a Chinese stopword list.
What is “U+FEFF”?
The Unicode character U+FEFF is the byte order mark, or BOM, and is used to tell the difference between big- and little-endian UTF-16 encoding. If you decode the web page using the right codec, Python will remove it for you. Examples:
stopwords = ["的", "了", "是", "也", "在"]
!wget -N https://raw.githubusercontent.com/P4CSS/PSS/master/data/stopwords_zh-tw.txt
with open("stopwords_zh-tw.txt", encoding="utf-8") as fin:
stopwords = fin.read().split("\n")[1:]
print(stopwords)
print(len(stopwords))
zsh:1: command not found: wget
['?', '、', '。', '“', '”', '《', '》', '!', ',', ':', ';', '?', '人民', '末##末', '啊', '阿', '哎', '哎呀', '哎喲', '唉', '我', '我們', '按', '按照', '依照', '吧', '吧噠', '把', '罷了', '被', '本', '本著', '比', '比方', '比如', '鄙人', '彼', '彼此', '邊', '別', '別的', '別說', '並', '並且', '不比', '不成', '不單', '不但', '不獨', '不管', '不光', '不過', '不僅', '不拘', '不論', '不怕', '不然', '不如', '不特', '不惟', '不問', '不只', '朝', '朝著', '趁', '趁著', '乘', '沖', '除', '除此之外', '除非', '除了', '此', '此間', '此外', '從', '從而', '打', '待', '但', '但是', '當', '當著', '到', '得', '的', '的話', '等', '等等', '地', '第', '叮咚', '對', '對於', '多', '多少', '而', '而況', '而且', '而是', '而外', '而言', '而已', '爾後', '反過來', '反過來說', '反之', '非但', '非徒', '否則', '嘎', '嘎登', '該', '趕', '個', '各', '各個', '各位', '各種', '各自', '給', '根據', '跟', '故', '故此', '固然', '關於', '管', '歸', '果然', '果真', '過', '哈', '哈哈', '呵', '和', '何', '何處', '何況', '何時', '嘿', '哼', '哼唷', '呼哧', '乎', '嘩', '還是', '還有', '換句話說', '換言之', '或', '或是', '或者', '極了', '及', '及其', '及至', '即', '即便', '即或', '即令', '即若', '即使', '幾', '幾時', '己', '既', '既然', '既是', '繼而', '加之', '假如', '假若', '假使', '鑒於', '將', '較', '較之', '叫', '接著', '結果', '借', '緊接著', '進而', '盡', '儘管', '經', '經過', '就', '就是', '就是說', '據', '具體地說', '具體說來', '開始', '開外', '靠', '咳', '可', '可見', '可是', '可以', '況且', '啦', '來', '來著', '離', '例如', '哩', '連', '連同', '兩者', '了', '臨', '另', '另外', '另一方面', '論', '嘛', '嗎', '慢說', '漫說', '冒', '麼', '每', '每當', '們', '莫若', '某', '某個', '某些', '拿', '哪', '哪邊', '哪兒', '哪個', '哪裏', '哪年', '哪怕', '哪天', '哪些', '哪樣', '那', '那邊', '那兒', '那個', '那會兒', '那裏', '那麼', '那麼些', '那麼樣', '那時', '那些', '那樣', '乃', '乃至', '呢', '能', '你', '你們', '您', '寧', '寧可', '寧肯', '寧願', '哦', '嘔', '啪達', '旁人', '呸', '憑', '憑藉', '其', '其次', '其二', '其他', '其它', '其一', '其餘', '其中', '起', '起見', '豈但', '恰恰相反', '前後', '前者', '且', '然而', '然後', '然則', '讓', '人家', '任', '任何', '任憑', '如', '如此', '如果', '如何', '如其', '如若', '如上所述', '若', '若非', '若是', '啥', '上下', '尚且', '設若', '設使', '甚而', '甚麼', '甚至', '省得', '時候', '什麼', '什麼樣', '使得', '是', '是的', '首先', '誰', '誰知', '順', '順著', '似的', '雖', '雖然', '雖說', '雖則', '隨', '隨著', '所', '所以', '他', '他們', '他人', '它', '它們', '她', '她們', '倘', '倘或', '倘然', '倘若', '倘使', '騰', '替', '通過', '同', '同時', '哇', '萬一', '往', '望', '為', '為何', '為了', '為什麼', '為著', '餵', '嗡嗡', '我', '我們', '嗚', '嗚呼', '烏乎', '無論', '無寧', '毋寧', '嘻', '嚇', '相對而言', '像', '向', '向著', '噓', '呀', '焉', '沿', '沿著', '要', '要不', '要不然', '要不是', '要麼', '要是', '也', '也罷', '也好', '一', '一般', '一旦', '一方面', '一來', '一切', '一樣', '一則', '依', '依照', '矣', '以', '以便', '以及', '以免', '以至', '以至於', '以致', '抑或', '因', '因此', '因而', '因為', '喲', '用', '由', '由此可見', '由於', '有', '有的', '有關', '有些', '又', '於', '於是', '於是乎', '與', '與此同時', '與否', '與其', '越是', '雲雲', '哉', '再說', '再者', '在', '在下', '咱', '咱們', '則', '怎', '怎麼', '怎麼辦', '怎麼樣', '怎樣', '咋', '照', '照著', '者', '這', '這邊', '這兒', '這個', '這會兒', '這就是說', '這裏', '這麼', '這麼點兒', '這麼些', '這麼樣', '這時', '這些', '這樣', '正如', '吱', '之', '之類', '之所以', '之一', '只是', '只限', '只要', '只有', '至', '至於', '諸位', '著', '著呢', '自', '自從', '自個兒', '自各兒', '自己', '自家', '自身', '綜上所述', '總的來看', '總的來說', '總的說來', '總而言之', '總之', '縱', '縱令', '縱然', '縱使', '遵照', '作為', '兮', '呃', '唄', '咚', '咦', '喏', '啐', '喔唷', '嗬', '嗯', '噯', '~', '!', '.', ':', '"', "'", '(', ')', '*', 'A', '白', '社會主義', '--', '..', '>>', ' [', ' ]', '', '<', '>', '/', '\\', '|', '-', '_', '+', '=', '&', '^', '%', '#', '@', '`', ';', '$', '(', ')', '——', '—', '¥', '·', '...', '‘', '’', '〉', '〈', '…', '\u3000', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '二', '三', '四', '五', '六', '七', '八', '九', '零', '>', '<', '@', '#', '$', '%', '︿', '&', '*', '+', '~', '|', '[', ']', '{', '}', '啊哈', '啊呀', '啊喲', '挨次', '挨個', '挨家挨戶', '挨門挨戶', '挨門逐戶', '挨著', '按理', '按期', '按時', '按說', '暗地裏', '暗中', '暗自', '昂然', '八成', '白白', '半', '梆', '保管', '保險', '飽', '背地裏', '背靠背', '倍感', '倍加', '本人', '本身', '甭', '比起', '比如說', '比照', '畢竟', '必', '必定', '必將', '必須', '便', '別人', '並非', '並肩', '並沒', '並沒有', '併排', '並無', '勃然', '不', '不必', '不常', '不大', '不但...而且', '不得', '不得不', '不得了', '不得已', '不迭', '不定', '不對', '不妨', '不管怎樣', '不會', '不僅...而且', '不僅僅', '不僅僅是', '不經意', '不可開交', '不可抗拒', '不力', '不了', '不料', '不滿', '不免', '不能不', '不起', '不巧', '不然的話', '不日', '不少', '不勝', '不時', '不是', '不同', '不能', '不要', '不外', '不外乎', '不下', '不限', '不消', '不已', '不亦樂乎', '不由得', '不再', '不擇手段', '不怎麼', '不曾', '不知不覺', '不止', '不止一次', '不至於', '才', '才能', '策略地', '差不多', '差一點', '常', '常常', '常言道', '常言說', '常言說得好', '長此下去', '長話短說', '長期以來', '長線', '敞開兒', '徹夜', '陳年', '趁便', '趁機', '趁熱', '趁勢', '趁早', '成年', '成年累月', '成心', '乘機', '乘勝', '乘勢', '乘隙', '乘虛', '誠然', '遲早', '充分', '充其極', '充其量', '抽冷子', '臭', '初', '出', '出來', '出去', '除此', '除此而外', '除此以外', '除開', '除去', '除卻', '除外', '處處', '川流不息', '傳', '傳說', '傳聞', '串列', '純', '純粹', '此後', '此中', '次第', '匆匆', '從不', '從此', '從此以後', '從古到今', '從古至今', '從今以後', '從寬', '從來', '從輕', '從速', '從頭', '從未', '從無到有', '從小', '從新', '從嚴', '從優', '從早到晚', '從中', '從重', '湊巧', '粗', '存心', '達旦', '打從', '打開天窗說亮話', '大', '大不了', '大大', '大抵', '大都', '大多', '大凡', '大概', '大家', '大舉', '大略', '大面兒上', '大事', '大體', '大體上', '大約', '大張旗鼓', '大致', '呆呆地', '帶', '殆', '待到', '單', '單純', '單單', '但願', '彈指之間', '當場', '當兒', '當即', '當口兒', '當然', '當庭', '當頭', '當下', '當真', '當中', '倒不如', '倒不如說', '倒是', '到處', '到底', '到了兒', '到目前為止', '到頭', '到頭來', '得起', '得天獨厚', '的確', '等到', '叮噹', '頂多', '定', '動不動', '動輒', '陡然', '都', '獨', '獨自', '斷然', '頓時', '多次', '多多', '多多少少', '多多益善', '多虧', '多年來', '多年前', '而後', '而論', '而又', '爾等', '二話不說', '二話沒說', '反倒', '反倒是', '反而', '反手', '反之亦然', '反之則', '方', '方才', '方能', '放量', '非常', '非得', '分期', '分期分批', '分頭', '奮勇', '憤然', '風雨無阻', '逢', '弗', '甫', '嘎嘎', '該當', '概', '趕快', '趕早不趕晚', '敢', '敢情', '敢於', '剛', '剛才', '剛好', '剛巧', '高低', '格外', '隔日', '隔夜', '個人', '各式', '更', '更加', '更進一步', '更為', '公然', '共', '共總', '夠瞧的', '姑且', '古來', '故而', '故意', '固', '怪', '怪不得', '慣常', '光', '光是', '歸根到底', '歸根結底', '過於', '毫不', '毫無', '毫無保留地', '毫無例外', '好在', '何必', '何嘗', '何妨', '何苦', '何樂而不為', '何須', '何止', '很', '很多', '很少', '轟然', '後來', '呼啦', '忽地', '忽然', '互', '互相', '嘩啦', '話說', '還', '恍然', '會', '豁然', '活', '夥同', '或多或少', '或許', '基本', '基本上', '基於', '極', '極大', '極度', '極端', '極力', '極其', '極為', '急匆匆', '即將', '即刻', '即是說', '幾度', '幾番', '幾乎', '幾經', '既...又', '繼之', '加上', '加以', '間或', '簡而言之', '簡言之', '簡直', '見', '將才', '將近', '將要', '交口', '較比', '較為', '接連不斷', '接下來', '皆可', '截然', '截至', '藉以', '藉此', '藉以', '屆時', '僅', '僅僅', '謹', '進來', '進去', '近', '近幾年來', '近來', '近年來', '儘管如此', '儘可能', '儘快', '儘量', '盡然', '盡如人意', '盡心竭力', '盡心盡力', '儘早', '精光', '經常', '竟', '竟然', '究竟', '就此', '就地', '就算', '居然', '局外', '舉凡', '據稱', '據此', '據實', '據說', '據我所知', '據悉', '具體來說', '決不', '決非', '絕', '絕不', '絕頂', '絕對', '絕非', '均', '喀', '看', '看來', '看起來', '看上去', '看樣子', '可好', '可能', '恐怕', '快', '快要', '來不及', '來得及', '來講', '來看', '攔腰', '牢牢', '老', '老大', '老老實實', '老是', '累次', '累年', '理當', '理該', '理應', '歷', '立', '立地', '立刻', '立馬', '立時', '聯袂', '連連', '連日', '連日來', '連聲', '連袂', '臨到', '另方面', '另行', '另一個', '路經', '屢', '屢次', '屢次三番', '屢屢', '縷縷', '率爾', '率然', '略', '略加', '略微', '略為', '論說', '馬上', '蠻', '滿', '沒', '沒有', '每逢', '每每', '每時每刻', '猛然', '猛然間', '莫', '莫不', '莫非', '莫如', '默默地', '默然', '吶', '那末', '奈', '難道', '難得', '難怪', '難說', '內', '年覆一年', '凝神', '偶而', '偶爾', '怕', '砰', '碰巧', '譬如', '偏偏', '乒', '平素', '頗', '迫於', '撲通', '其後', '其實', '奇', '齊', '起初', '起來', '起首', '起頭', '起先', '豈', '豈非', '豈止', '迄', '恰逢', '恰好', '恰恰', '恰巧', '恰如', '恰似', '千', '千萬', '千萬千萬', '切', '切不可', '切莫', '切切', '切勿', '竊', '親口', '親身', '親手', '親眼', '親自', '頃', '頃刻', '頃刻間', '頃刻之間', '請勿', '窮年累月', '取道', '去', '權時', '全都', '全力', '全年', '全然', '全身心', '然', '人人', '仍', '仍舊', '仍然', '日覆一日', '日見', '日漸', '日益', '日臻', '如常', '如此等等', '如次', '如今', '如期', '如前所述', '如上', '如下', '汝', '三番兩次', '三番五次', '三天兩頭', '瑟瑟', '沙沙', '上', '上來', '上去']
1208
import unicodedata
from collections import Counter
word_counts = Counter()
for sentence in sentences:
for word in jieba.cut(sentence):
if word in stopwords:
continue
if len(word) > 1 or not unicodedata.category(word).startswith('P'):
word_counts[word] += 1
print(word_counts.most_common(20))
print(len(word_counts))
[('說', 65), ('裏', 54), ('麽', 45), ('祥林嫂', 35), ('一個', 33), ('知道', 26), ('甚', 23), ('人', 23), ('話', 22), ('四叔', 21), ('後', 21), ('聽', 18), ('已經', 16), ('卻', 15), ('走', 14), ('事', 14), ('想', 13), ('喫', 12), ('四嬸', 12), ('女人', 11)]
1576