使用Pinyin4j进行拼音分词的方法

2025-05-29 0 28

使用maven引入相关的jar

?

1

2

3

4

5
<dependency>

<groupId>com.belerweb</groupId>

<artifactId>pinyin4j</artifactId>

<version>2.5.1</version>

</dependency>

创建Pinyin4jUtil

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182
package com.os.core.util.solr;

import net.sourceforge.pinyin4j.PinyinHelper;

import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;

import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;

import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;

import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

import java.util.ArrayList;

import java.util.Hashtable;

import java.util.List;

import java.util.Map;

/**

* 汉语拼音工具类

* Created by PengSongHe on 2017/2/9 0009.

*/

public class Pinyin4jUtil {

public static void main(String[] args) {

String str = "测试";

String pinyin = Pinyin4jUtil.converterToSpell(str);

System.out.println(str + " pin yin :" + pinyin);

pinyin = Pinyin4jUtil.converterToFirstSpell(str);

System.out.println(str + " short pin yin :" + pinyin);

}

/**

* 汉字转换位汉语拼音首字母,英文字符不变,特殊字符丢失 支持多音字,生成方式如(长沙市长:cssc,zssz,zssc,cssz)

*

* @param chines 汉字

* @return 拼音

*/

public static String converterToFirstSpell(String chines) {

StringBuffer pinyinName = new StringBuffer();

char[] nameChar = chines.toCharArray();

HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();

defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);

defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);

for (int i = 0; i < nameChar.length; i++) {

if (nameChar[i] > 128) {

try {

// 取得当前汉字的所有全拼

String[] strs = PinyinHelper.toHanyuPinyinStringArray(

nameChar[i], defaultFormat);

if (strs != null) {

for (int j = 0; j < strs.length; j++) {

// 取首字母

pinyinName.append(strs[j].charAt(0));

if (j != strs.length - 1) {

pinyinName.append(",");

}

}

}

// else {

// pinyinName.append(nameChar[i]);

// }

} catch (BadHanyuPinyinOutputFormatCombination e) {

e.printStackTrace();

}

} else {

pinyinName.append(nameChar[i]);

}

pinyinName.append(" ");

}

// return pinyinName.toString();

return parseTheChineseByObject(discountTheChinese(pinyinName.toString()));

}

/**

* 汉字转换位汉语全拼,英文字符不变,特殊字符丢失

* 支持多音字,生成方式如(重当参:zhongdangcen,zhongdangcan,chongdangcen

* ,chongdangshen,zhongdangshen,chongdangcan)

*

* @param chines 汉字

* @return 拼音

*/

public static String converterToSpell(String chines) {

StringBuffer pinyinName = new StringBuffer();

char[] nameChar = chines.toCharArray();

HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();

defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);

defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);

for (int i = 0; i < nameChar.length; i++) {

if (nameChar[i] > 128) {

try {

// 取得当前汉字的所有全拼

String[] strs = PinyinHelper.toHanyuPinyinStringArray(

nameChar[i], defaultFormat);

if (strs != null) {

for (int j = 0; j < strs.length; j++) {

pinyinName.append(strs[j]);

if (j != strs.length - 1) {

pinyinName.append(",");

}

}

}

} catch (BadHanyuPinyinOutputFormatCombination e) {

e.printStackTrace();

}

} else {

pinyinName.append(nameChar[i]);

}

pinyinName.append(" ");

}

// return pinyinName.toString();

return parseTheChineseByObject(discountTheChinese(pinyinName.toString()));

}

/**

* 去除多音字重复数据

*

* @param theStr

* @return

*/

private static List<Map<String, Integer>> discountTheChinese(String theStr) {

// 去除重复拼音后的拼音列表

List<Map<String, Integer>> mapList = new ArrayList<Map<String, Integer>>();

// 用于处理每个字的多音字,去掉重复

Map<String, Integer> onlyOne = null;

String[] firsts = theStr.split(" ");

// 读出每个汉字的拼音

for (String str : firsts) {

onlyOne = new Hashtable<String, Integer>();

String[] china = str.split(",");

// 多音字处理

for (String s : china) {

Integer count = onlyOne.get(s);

if (count == null) {

onlyOne.put(s, new Integer(1));

} else {

onlyOne.remove(s);

count++;

onlyOne.put(s, count);

}

}

mapList.add(onlyOne);

}

return mapList;

}

/**

* 解析并组合拼音,对象合并方案(推荐使用)

*

* @return

*/

private static String parseTheChineseByObject(

List<Map<String, Integer>> list) {

Map<String, Integer> first = null; // 用于统计每一次,集合组合数据

// 遍历每一组集合

for (int i = 0; i < list.size(); i++) {

// 每一组集合与上一次组合的Map

Map<String, Integer> temp = new Hashtable<String, Integer>();

// 第一次循环,first为空

if (first != null) {

// 取出上次组合与此次集合的字符,并保存

for (String s : first.keySet()) {

for (String s1 : list.get(i).keySet()) {

String str = s + s1;

temp.put(str, 1);

}

}

// 清理上一次组合数据

if (temp != null && temp.size() > 0) {

first.clear();

}

} else {

for (String s : list.get(i).keySet()) {

String str = s;

temp.put(str, 1);

}

}

// 保存组合数据以便下次循环使用

if (temp != null && temp.size() > 0) {

first = temp;

}

}

String returnStr = "";

if (first != null) {

// 遍历取出组合字符串

for (String str : first.keySet()) {

returnStr += (str + ",");

}

}

if (returnStr.length() > 0) {

returnStr = returnStr.substring(0, returnStr.length() - 1);

}

return returnStr;

}

}

以上这篇使用Pinyin4j进行拼音分词的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持快网idc。

原文链接:http://blog.csdn.net/psh18513234633/article/details/78839078

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 使用Pinyin4j进行拼音分词的方法 https://www.kuaiidc.com/113110.html

相关文章

发表评论
暂无评论