漢語言處理工具pyhanlp的拼音轉換與字元正則化

adnb34g發表於2019-03-29

漢字轉拼音

HanLP中的漢字轉拼音功能也十分的強大。

說明

HanLP不僅支援基礎的漢字轉拼音,還支援聲母、韻母、音調、音標和輸入法首字母首聲母功能。

HanLP能夠識別多音字,也能給繁體中文注拼音。

最重要的是, HanLP採用的模式匹配升級到AhoCorasickDoubleArrayTrie,效能大幅提升,能夠提供毫秒級的響應速度!

演算法詳解

《漢字轉拼音與簡繁轉換的 Java實現》

1.  # 漢字轉拼音

2.  Pinyin = JClass("com.hankcs.hanlp.dictionary.py.Pinyin")

3.  text = "過載不是重任!"

4.  pinyin_list = HanLP.convertToPinyinList(text)

 

5.  print("原文,", end=" ")

6.  print(text)

7.  print("拼音(數字音調),", end=" ")

8.  print(pinyin_list)

9.  print("拼音(符號音調),", end=" ")

10.  for pinyin in pinyin_list:

11.  print("%s," % pinyin.getPinyinWithToneMark(), end=" ")

12.  print("\n拼音(無音調),", end=" ")

13.  for pinyin in pinyin_list:

14.  print("%s," % pinyin.getPinyinWithoutTone(), end=" ")

15.  print("\n聲調,", end=" ")

16.  for pinyin in pinyin_list:

17.  print("%s," % pinyin.getTone(), end=" ")

18.  print("\n聲母,", end=" ")

19.  for pinyin in pinyin_list:

20.  print("%s," % pinyin.getShengmu(), end=" ")

21.  print("\n韻母,", end=" ")

22.  for pinyin in pinyin_list:

23.  print("%s," % pinyin.getYunmu(), end=" ")

24.  print("\n輸入法頭,", end=" ")

25.  for pinyin in pinyin_list:

26.  print("%s," % pinyin.getHead(), end=" ")

 

27.  print()

28.  # 拼音轉換可選保留無拼音的原字元

29.  print(HanLP.convertToPinyinString("截至2012年,", " ", True))

30.  print(HanLP.convertToPinyinString("截至2012年,", " ", False))

 

1. 原文, 過載不是重任!

2. 拼音(數字音調), [chong2, zai3, bu2, shi4, zhong4, ren4, none5]

3. 拼音(符號音調), chóng, zǎi, bú, shì, zhòng, rèn, none,

4. 拼音(無音調), chong, zai, bu, shi, zhong, ren, none,

5. 聲調, 2, 3, 2, 4, 4, 4, 5,

6. 聲母, ch, z, b, sh, zh, r, none,

7. 韻母, ong, ai, u, i, ong, en, none,

8. 輸入法頭, ch, z, b, sh, zh, r, none,

9. jie zhi none none none none nian none

10. jie zhi 2 0 1 2 nian ,

拼音轉中文

HanLP中的資料結構和介面是靈活的,組合這些介面,可以自己創造新功能,我們可以使用AhoCorasickDoubleArrayTrie實現的最長分詞器,需要使用者呼叫setTrie()提供一個AhoCorasickDoubleArrayTrie

 

1. StringDictionary = JClass(

2. "com.hankcs.hanlp.corpus.dictionary.StringDictionary")

3. CommonAhoCorasickDoubleArrayTrieSegment = JClass(

4. "com.hankcs.hanlp.seg.Other.CommonAhoCorasickDoubleArrayTrieSegment")

5. Config = JClass("com.hankcs.hanlp.HanLP$Config")

6.

7. TreeMap = JClass("java.util.TreeMap")

8. TreeSet = JClass("java.util.TreeSet")

9.

10. dictionary = StringDictionary()

11. dictionary.load(Config.PinyinDictionaryPath)

12. entry = {}

13. m_map = TreeMap()

14. for entry in dictionary.entrySet():

15. pinyins = entry.getValue().replace("[\\d,]", "")

16. words = m_map.get(pinyins)

17. if words is None:

18. words = TreeSet()

19. m_map.put(pinyins, words)

20. words.add(entry.getKey())

21. words = TreeSet()

22. words.add("綠色")

23. words.add("濾色")

24. m_map.put("lvse", words)

25.

26. segment = CommonAhoCorasickDoubleArrayTrieSegment(m_map)

27. print(segment.segment("renmenrenweiyalujiangbujianlvse"))

28. print(segment.segment("lvsehaihaodajiadongxidayinji"))

 

1. [renmenrenweiyalujiangbujian/null, lvse/[濾色, 綠色]]

2. [lvse/[濾色, 綠色], haihaodajiadongxidayinji/null]

 

字元正則化

演示正規化字元配置項的效果(繁體 ->簡體,全形->半形,大寫->小寫)。

該配置項位於 hanlp.properties中,透過Normalization=true來開啟(現在直接透過HanLP.Config.Normalization開啟即可)。

 

切換配置後必須刪除 CustomDictionary.txt.bin快取,否則隻影響動態插入的新詞。

在我動筆前一個星期,已經有同學新增了,新增自定義詞典之後,自動刪除快取的功能。地址請 參閱 github.com/hankcs/HanLP/pull/954,現在只需要開啟正則化即可

 

1. CustomDictionary =JClass("com.hankcs.hanlp.dictionary.CustomDictionary")

2. print("HanLP.Config.Normalization = False\n")

3. HanLP.Config.Normalization = False

4. CustomDictionary.insert("愛聽4G", "nz 1000")

5. print(HanLP.segment("愛聽4g"))

6. print(HanLP.segment("愛聽4G"))

7. print(HanLP.segment("愛聽4G"))

8. print(HanLP.segment("愛聽4G"))

9. print(HanLP.segment("愛聽4G"))

10.

11. print(HanLP.segment("喜歡4G"))

12. print(HanLP.segment("hankcs在臺灣寫程式碼"))

 

13.

14. print("\nHanLP.Config.Normalization = True\n")

15. HanLP.Config.Normalization = True

16. print(HanLP.segment("愛聽4g"))

17. print(HanLP.segment("愛聽4G"))

18. print(HanLP.segment("愛聽4G"))

19. print(HanLP.segment("愛聽4G"))

20. print(HanLP.segment("愛聽4G"))

21.

22. print(HanLP.segment("喜歡4G"))

23. print(HanLP.segment("hankcs在臺灣寫程式碼"))

24.

25. HanLP.Config.ShowTermNature = False

27. text = HanLP.s2tw("現在的HanLP已經新增了新增自定義詞典之後,自動刪除快取的功能,現在只需要開啟正則化即可")

28. print(text)

29. print(HanLP.segment(text))

30. HanLP.Config.ShowTermNature = False

 

1. HanLP.Config.Normalization = False

2.

3. [愛聽4g]

4. [愛聽4G]

5. [愛, 聽, 4, G]

6. [愛, 聽, 4, G]

7. [愛, 聽, 4, G]

8. [喜歡, 4, G]

9. [hankcs, 在, 臺, 灣寫, 代, 碼]

10.

11. HanLP.Config.Normalization = True

12.

13. [愛聽4g]

14. [愛聽4g]

15. [愛聽4g]

16. [愛聽4g]

17. [愛聽4g]

18. [喜歡, 4, g]

19. [hankcs, 在, 臺灣, 寫, 程式碼]

20. 現在的 HanLP已經新增了新增自定義詞典之後,自動刪除快取的功能,現在只需要開啟正則化即可

21. [現在, 的, hanlp, 已經, 新增, 了, 新增, 自定義, 詞典, 之後, ,, 自動, 刪除, 快, 取, 的

---------------------

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31524777/viewspace-2639721/,如需轉載,請註明出處,否則將追究法律責任。

相關文章