}

最近有用一个中科院的中文分词系统,感觉蛮颇爽。

NLPIR汉语分词系统(又名ICTCLAS2013),主要功能包括中文分词;词性标注;命名实体识别;用户词典功能;支持GBK编码、UTF8编码、BIG5编码(此处是个坑,我的txt文件都是默认ASC编码,不转码的话就会出现乱码。上万个文件,目前尚没有找到满意的解决方案)。新增微博分词、新词发现与关键词提取;张华平博士先后倾力打造十余年,内核升级10次。

全球用户突破20万,先后获得了2010年钱伟长中文信息处理科学技术奖一等奖,2003年国际SIGHAN分词大赛综合第一名,2002年国内973评测综合第一名。

下载传送门http://ictclas.nlpir.org/。

文件包介绍

bin: 里面有文档语义抽取系统和分词系统。还有win下的可视化操作界面,可以演示用,interesting~

Data:系统核心词库(很重要!),另还包含文英文处理的支持知识库,如果不需要英文处理的功能,可以不加载。

doc:相关文档支持

include:系统头文件

lib:不同环境下的支撑库,包括c/c++/Java

sample:NLPIR2014示例程序(我用的是Java,直接从这里面导入包),看到2015的文件,已经有对Python的支持了。我下的是14所以没有。

test: NLPIR2014测试文档集合

调试使用

首先在全世界最好用的Java IDE –IDEA导入sample里面的  JnaTest_NLPIR  项目。并且需要将上一级目录的Data文件夹copy过来。导入成功之后的文件结构如下(注意 NLPIR.dll这个动态模块库文件, 需要在.\ lib\win64里面copy过来如果你用的是32位,那就在win里面):

创建应用的接口 CLibrary 继承Library,这里面提供了可用java实现的具体方法。

package code;/*** Created by Administrator on 2016/11/21.*/
import com.sun.jna.Library;public interface CLibrary extends Library{//初始化public int NLPIR_Init(String sDataPath, int encoding, String sLicenceCode);//对字符串进行分词public String NLPIR_ParagraphProcess(String sSrc, int bPOSTagged);//对TXT文件内容进行分词public double NLPIR_FileProcess(String sSourceFilename,String sResultFilename, int bPOStagged);//从字符串中提取关键词public String NLPIR_GetKeyWords(String sLine, int nMaxKeyLimit,boolean bWeightOut);//从TXT文件中提取关键词public String NLPIR_GetFileKeyWords(String sLine, int nMaxKeyLimit,boolean bWeightOut);//添加单条用户词典public int NLPIR_AddUserWord(String sWord);//删除单条用户词典public int NLPIR_DelUsrWord(String sWord);//从TXT文件中导入用户词典public int NLPIR_ImportUserDict(String sFilename);//将用户词典保存至硬盘public int NLPIR_SaveTheUsrDic();//从字符串中获取新词public String NLPIR_GetNewWords(String sLine, int nMaxKeyLimit, boolean bWeightOut);//从TXT文件中获取新词public String NLPIR_GetFileNewWords(String sTextFile,int nMaxKeyLimit, boolean bWeightOut);//获取一个字符串的指纹值public long NLPIR_FingerPrint(String sLine);//设置要使用的POS mappublic int NLPIR_SetPOSmap(int nPOSmap);//获取报错日志public String NLPIR_GetLastErrorMsg();//退出public void NLPIR_Exit();

然后创建一个类去实现以上的接口

package code;import java.io.*;
import java.util.Arrays;import utils.SystemParas;import com.sun.jna.Library;
import com.sun.jna.Native;public class NlpirTest {// 定义接口CLibrary,继承自com.sun.jna.Librarypublic interface CLibrary extends Library {// 定义并初始化接口的静态变量CLibrary Instance = (CLibrary) Native.loadLibrary("F:\\ICTCLAS\\sample\\JnaTest_NLPIR\\src\\code\\NLPIR", CLibrary.class);// printf函数声明public int NLPIR_Init(byte[] sDataPath, int encoding,byte[] sLicenceCode);//对字符串进行分词public String NLPIR_ParagraphProcess(String sSrc, int bPOSTagged);//对TXT文件内容进行分词public double NLPIR_FileProcess(String sSourceFilename,String sResultFilename, int bPOStagged);public String NLPIR_GetKeyWords(String sLine, int nMaxKeyLimit,boolean bWeightOut);//从TXT文件中提取关键词public String NLPIR_GetFileKeyWords(String sLine, int nMaxKeyLimit,boolean bWeightOut);public void NLPIR_Exit();}public static String transString(String aidString, String ori_encoding,String new_encoding) {try {return new String(aidString.getBytes(ori_encoding), new_encoding);} catch (UnsupportedEncodingException e) {e.printStackTrace();}return null;}//读取文件/** @dic 文件集存在的目录* @currentPage 类似于分页* @return* */public  static File[] readTxt(String dir ){//创建File对象File file = new File(dir);//获取该目录下的所有文件
//      String[] files = file.list();//        for (String f : files){
//          System.out.println(f);
//      }//listFiles是获取该目录下所有文件和目录的绝对路径File[] fs = file.listFiles();for (File f : fs){System.out.println(f);}return  fs;}public static void main(String[] args) throws Exception {String argu = "F:\\ICTCLAS";// String system_charset = "GBK";//GBK----0String system_charset = "utf-8";int charset_type = 1;// int charset_type = 0;// 调用printf打印信息int init_flag = CLibrary.Instance.NLPIR_Init(argu.getBytes(system_charset), charset_type, "0".getBytes(system_charset));if (0 == init_flag) {System.err.println("初始化失败!");return;}//读取txt文件File[] fs=readTxt("F:\\作业\\homework2\\Training Dataset\\testtxt16");String sInput=null;for(File temp:fs){String in=null;String s =new String();try {BufferedReader input=new BufferedReader(new InputStreamReader(new FileInputStream(temp),"GBK"));while((s = input.readLine())!=null){in = in + s;}sInput = sInput + in;input.close();}catch (Exception e){System.out.println("读取文件失败!");}}String nativeBytes = null;try {nativeBytes = CLibrary.Instance.NLPIR_ParagraphProcess(sInput, 0);// String nativeStr = new String(nativeBytes, 0,// nativeBytes.length,"utf-8");System.out.println("分词结果为: " + nativeBytes);// System.out.println("分词结果为: "// + transString(nativeBytes, system_charset, "UTF-8"));//// System.out.println("分词结果为: "// + transString(nativeBytes, "gb2312", "utf-8"));int nCountKey = 0;String nativeByte = CLibrary.Instance.NLPIR_GetKeyWords(sInput, 20,false);String fInput ="F:\\11.TXT";String fOut ="F:\\rs.TXT";double d =CLibrary.Instance.NLPIR_FileProcess(fInput,fOut,0);String dd =CLibrary.Instance.NLPIR_GetFileKeyWords(fInput,10,false);System.out.println(dd);System.out.print("关键词提取结果是:" + nativeByte);//           int nativeElementSize = 4 * 6 +8;//size of result_t in native
//          code
//          int nElement = nativeByte.length / nativeElementSize;
//          ByteArrayInputStream(nativeByte));
//
//          nativeByte = new byte[nativeByte.length];
//          nCountKey = testNLPIR30.NLPIR_KeyWord(nativeByte, nElement);
//
//          Result[] resultArr = new Result[nCountKey];
//          DataInputStream dis = new DataInputStream(new
//          ByteArrayInputStream(nativeByte));
//          for (int i = 0; i < nCountKey; i++)
//          {
//          resultArr[i] = new Result();
//          resultArr[i].start = Integer.reverseBytes(dis.readInt());
//          resultArr[i].length = Integer.reverseBytes(dis.readInt());
//          dis.skipBytes(8);
//          resultArr[i].posId = Integer.reverseBytes(dis.readInt());
//          resultArr[i].wordId = Integer.reverseBytes(dis.readInt());
//          resultArr[i].word_type = Integer.reverseBytes(dis.readInt());
//          resultArr[i].weight = Integer.reverseBytes(dis.readInt());
//          }
//          dis.close();
//
//          for (int i = 0; i < resultArr.length; i++)
//          {
//          System.out.println("start=" + resultArr[i].start + ",length=" +
//          resultArr[i].length + "pos=" + resultArr[i].posId + "word=" +
//          resultArr[i].wordId + "  weight=" + resultArr[i].weight);
//          }CLibrary.Instance.NLPIR_Exit();} catch (Exception ex) {// TODO Auto-generated catch blockex.printStackTrace();}}
}

分词的结果:

关键词提取结果:

有大神对NLPIR系统的接口函数说明进行了简单的翻译(http://blog.csdn.net/yusewuhen/article/details/49337125),如下所示:

1. NLPIR_Init

初始化分析器,并根据配置文件为NLPIR准备数据。

函数形式:

boolNLPIR_Init(const char* sInitDirPath=0, int encoding=GBK_CODE,

const char*sLicenceCode=0)

需要的头文件:<NLPIR.h>

返回值:

如果初始化成功,返回successed,否则返回false。

参数:

char* sInitDirPath:指定存放配置文件Configure.xml和Data文件的路径,默认值为0,表明路径为当前工作目录。

int encoding:编码格式标识符,默认为GBK_CODE ,也可以设置为UTF8_CODE和BIG5_CODE。

char*  sLicenceCode:商业用户需要使用的许可证编码,免费用户无需使用该参数。

说明:

使用NLPIR时必须先执行NLPIR_Init函数(只需执行一次)。系统关闭时还应执行NLPIR_Exit函数来销毁缓存数据。

NLPIR_Init执行失败通常有两个原因:1. 需要的数据文件格式不兼容或丢失;2.配置文件丢失或存在非法参数。还可以通过日志文件来了解更多信息,日志文件存放在默认路径中。

2. NLPIR_Exit

退出程序并释放所有资源和NLPIR使用的缓存数据。

函数形式:

boolNLPIR_Exit();

需要的头文件:<NLPIR.h>

返回值:

执行成功返回successed,否则返回false。

参数:

说明:

该函数必须在关闭系统时执行,若需重启NLPIR,再次执行NLPIR_Init函数即可。

3.NLPIR_ImportUserDict

从文件中导入用户自定义的词典。

函数形式:

unsigned intNLPIR_ImportUserDict(const char * sFilename);

需要的头文件:<NLPIR.h>

返回值:

导入的词汇数量。

参数:

char* sFilename: 要导入的用户词典文件所在路径。

说明:

该函数只有在NLPIR_Init函数执行成功后才能使用。词典文件的格式请参见相关示例。

你只需在更改了用户词典或第一次使用某个词典时执行该函数,当配置文件中的UserDict参数为on时,NLPIR将会(把该词典添加到配置文件中)并在启动时自动加载该词典。当将UserDict置为off时,用户自定义词典文件将不再自动导入。

4.NLPIR_ParagraphProcess

处理一个段落文字,返回运行结果缓存的指针。

函数形式:

const char *NLPIR_ParagraphProcess(const char * sParagraph, int bPOStagged=1);

需要的头文件:<NLPIR.h>

返回值:

运行结果缓存的指针。

参数:

char* sParagraph: 输入段落的源

int bPOStagged: 判断是否需要位置标记,0:无标记;1:有标记。默认值为1。

说明:

该函数只有在NLPIR_Init函数执行成功后才能使用

5.NLPIR_ParagraphProcessA

函数形式:

result_t *NLPIR_ParagraphProcessA(

const char *sParagraph, int * pResultCount, bool bUserDict=true)

需要的头文件:<NLPIR.h>

返回值:

运行结果向量的指针,该指针由系统进行管理,用户无法对它进行分配和释放。

其结构如下:

struct result_t{

int start;//start position,词语在输入句子中的开始位置

int length;//length,词语的长度

charsPOS[POS_SIZE];//word type,词性ID值,可以快速的获取词性表

int iPOS;//词性

int word_ID; //如果是未登录词,设成或者-1

int word_type;//区分用户词典;1,是用户词典中的词;,非用户词典中的词

int weight;//word weight

};

参数:

char* sParagraph: 输入段落的源

int* pResultCount: 结果向量的大小

bool bUserDict:是否使用用户词典

说明:

该函数只有在NLPIR_Init函数执行成功后才能使用

6.NLPIR_FileProcess

处理一个TXT文件。

函数形式:

DoubleNLPIR_FileProcess(const char * sSourceFilename,

const char *sResultFilename, int bPOStagged=1);

需要的头文件:<NLPIR.h>

返回值:

如果执行成功,返回处理速度值,否则返回false。

参数:

char *sSourceFilename: 要处理的源文件名称;

char *sResultFilename: 存储处理结果的文件名称;

intbPOStagged:  判断是否需要位置标记,0:无标记;1:有标记。默认值为1。说明:

该函数只有在NLPIR_Init函数执行成功后才能使用

处理结果的输出格式可在配置文件中进行设置。

7.NLPIR_GetParagraphProcessAWordCount

NLPIR_ParagraphProcessA函数的C#实现API。

函数形式:

int NLPIR_GetParagraphProcessAWordCount(constchar *sParagraph);

需要的头文件:<NLPIR.h>

返回值:

返回输入段落的词汇数量。

参数:

char* sParagraph: 输入段落的源

说明:

该函数只有在NLPIR_Init函数执行成功后才能使用

处理结果的输出格式可在配置文件中进行设置。

8. NLPIR_ParagraphProcessAW

NLPIR_ParagraphProcessA函数的C#实现API。

函数形式:

voidNLPIR_ParagraphProcessAW(int nCount,result_t * result);

需要的头文件:<NLPIR.h>

返回值:

无。

参数:

nCount: 输入段落的词汇数量;

result: 处理结果的结构体指针;

说明:

该函数只有在NLPIR_Init函数执行成功后才能使用

处理结果的输出格式可在配置文件中进行设置。

9.NLPIR_AddUserWord

向用户词典添加一个词汇。

函数形式:

intNLPIR_AddUserWord(const char * sWord);

需要的头文件:<NLPIR.h>

返回值:

如果添加成功,返回successed,否则返回false。

参数:

char* sWord:要添加的词汇。

说明:

该函数只有在NLPIR_Init函数执行成功后才能使用

10.NLPIR_SaveTheUsrDic

将用户词典保存至硬盘。

函数形式:

intNLPIR_SaveTheUsrDic();

需要的头文件:<NLPIR.h>

返回值:

如果执行成功返回1,否则返回0。

参数:

说明:

该函数只有在NLPIR_Init函数执行成功后才能使用

11.NLPIR_DelUsrWord

从用户词典中删除一个词汇。

函数形式:

intNLPIR_DelUsrWord(const char * sWord);

需要的头文件:<NLPIR.h>

返回值:

如果要删除的词汇不存在,则返回-1;如果删除成功,则返回该词汇的句柄。

参数:

char* sWord:要删除的词汇。

说明:

该函数只有在NLPIR_Init函数执行成功后才能使用

12.NLPIR_GetKeyWords

从输入的段落中提取关键词。

函数形式:

const char *NLPIR_GetKeyWords(const char * sLine,int nMaxKeyLimit=50,

boolbWeightOut=false);

需要的头文件:<NLPIR.h>

返回值:

如果执行成功,返回执行结果列表。如果执行失败,返回NULL。

格式如下:

"科学发展观 宏观经济 "

或者

"科学发展观 23.80 宏观经济 12.20" (带有权值)

参数:

char* sLine:输入的段落;

int nMaxKeyLimit:关键词最大数量;

bool bWeightOut:是否输出权值;

说明:

无。

13.NLPIR_GetFileKeyWords

从TXT文件中提取关键词。

函数形式:

const char *NLPIR_GetFileKeyWords(const char * sTextFile,

intnMaxKeyLimit=50, bool bWeightOut=false);

需要的头文件:<NLPIR.h>

返回值:

如果执行成功,返回执行结果列表。如果执行失败,返回NULL。格式同上。

参数:

char* sTextFile:输入文件的名称;

int nMaxKeyLimit:关键词最大数量;

bool bWeightOut:是否输出权值;

说明:

14.NLPIR_GetNewWords

从段落中提取新词。

函数形式:

const char *NLPIR_GetNewWords(const char * sLine, int nMaxKeyLimit=50,

boolbWeightOut=false);

需要的头文件:<NLPIR.h>

返回值:

如果执行成功,返回提取到的新词列表,否则返回NULL。格式同上

参数:

char* sLine:输入的段落;

int nMaxKeyLimit:关键词最大数量;

bool bWeightOut:是否输出权值;

说明:

15.NLPIR_GetFileNewWords

从TXT文件中提取新词。

函数形式:

const char *NLPIR_GetFileNewWords(const char * sTextFile,

intnMaxKeyLimit=50, bool bWeightOut=false);

需要的头文件:<NLPIR.h>

返回值:

如果执行成功,返回提取到的新词列表,否则返回NULL。格式同上

参数:

char* sTextFile:输入文件的名称;

int nMaxKeyLimit:关键词最大数量;

bool bWeightOut:是否输出权值;

说明:

16.NLPIR_FingerPrint

提取段落的一个指纹。

函数形式:

unsigned longNLPIR_FingerPrint(const char * sLine);

需要的头文件:<NLPIR.h>

返回值:

如果执行成功,返回指纹值,否则返回0。

参数:

char* sLine:输入的段落;

说明:

无。

17.NLPIR_SetPOSmap

设置使用的POS map。

函数形式:

intNLPIR_SetPOSmap(int nPOSmap);

需要的头文件:<NLPIR.h>

返回值:

如果执行成功,返回1,否则返回0。

参数:

int nPOSmap :

ICT_POS_MAP_FIRST 计算所一级标注集

ICT_POS_MAP_SECOND 计算所二级标注集

PKU_POS_MAP_SECOND 北大二级标注集

PKU_POS_MAP_FIRST   北大一级标注集

说明:

该函数只有在NLPIR_Init函数执行成功后才能使用

18.NLPIR_GetLastErrorMsg

获取最近一条报错信息。

函数形式:

const char *NLPIR_GetLastErrorMsg();

需要的头文件:<NLPIR.h>

返回值:

获取最近一条报错信息的指针。

参数:

无。

说明:

无。

以下为新词识别函数,建议脱机使用。

1. NLPIR_NWI_Start

启动新词识别。

函数形式:

boolNLPIR_NWI_Start();

需要的头文件:<NLPIR.h>

返回值:

如果执行成功,返回successed,否则返回false。

参数:

2.NLPIR_NWI_AddFile

往新词识别系统中添加待识别新词的文本文件,需要在运行 NLPIR_NWI_Start()之后,才有效。

函数形式:

IntNLPIR_NWI_AddFile(const char * sFilename);

需要的头文件:<NLPIR.h>

返回值:

如果执行成功,返回true,否则返回false。

参数:

char *sFilename:输入的文件名;

3.NLPIR_NWI_AddMem

往新词识别系统中添加一段待识别新词的内存,需要在运行 NLPIR_NWI_Start()之后,才有效。

函数形式:

boolNLPIR_NWI_AddMem(const char *sText);

需要的头文件:<NLPIR.h>

返回值:

如果执行成功,返回true,否则返回false。

参数:

char *sFilename:文件名

4. NLPIR_NWI_Complete

新词识别添加内容结束,需要在运行 NLPIR_NWI_Start()之后,才有效。

函数形式:

boolNLPIR_NWI_Complete();

需要的头文件:<NLPIR.h>

返回值:

如果执行成功,返回true,否则返回false。

参数:

无。

说明:

5.NLPIR_NWI_GetResult

获取新词识别的结果。

函数形式:

const char *NLPIR_NWI_GetResult(bool bWeightOut=false);

需要的头文件:<NLPIR.h>

返回值:

执行结果的列表。

参数:

bool bWeightOut:是否输出权重值。

6.NLPIR_NWI_Result2UserDict

将新词识别结果导入到用户词典中,需要在运行 NLPIR_NWI_Complete()之后,才有效,如果需要将新词结果永久保存,建议在执行NLPIR_SaveTheUsrDic函数。

函数形式:

unsigned intNLPIR_NWI_Result2UserDict()

需要的头文件:<NLPIR.h>

返回值:

如果执行成功,返回true,否则返回false。

参数:

无。

【11月22日】听说下雪了!--ICATCLAS分词系统使用初探相关推荐

  1. 11月22日弹性计算跟您在广州不见不散

    11月22日,广州云栖大会,弹性计算针对广州专场诚邀各位嘉宾亲临 时间:2017年11月22日,13:30 地点:广州香格里拉酒店三层满江红厅 弹性计算与网络专场特意申请20张云栖大会电子商务票针对企 ...

  2. 11月22日北京.net俱乐部活动ppt下载以及11月19日微软西格玛IE8开发讲座ppt下载

    11月22日北京.net俱乐部活动ppt下载以及11月19日微软西格玛IE8开发讲座ppt下载 请点击下面的连接下载 [url]http://cid-b10793e754ad25f7.skydrive ...

  3. B站哔哩哔哩:11 月 22 日上午九时正起恢复在香港联交所买卖

    IT之家 11 月 19 日消息,哔哩哔哩今日晚间发布公告称,本公司已向香港联交所申请本公司的 Z 类普通股于 2021 年 11 月 22 日上午九时正起恢复在香港联交所买卖. 哔哩哔哩今日发布公告 ...

  4. 分享Silverlight/WPF/Windows Phone一周学习导读(11月22日-28日)

    分享Silverlight, WPF, Windows Phone 7一周学习导读系列,11月22日-11月28日. 本周Silverlight学习资源更新: Silverlight中的TextBox ...

  5. 倩女幽魂手游服务器维护多久,倩女幽魂手游11月22日在线维护公告

    亲爱的玩家: <倩女幽魂>手游将于本周四上午进行在线更新,更新期间无需停服,玩家可照常进行游戏.欢迎您届时体验本周放出的全新内容,祝全体玩家游戏愉快! 本周四在线更新内容如下: 服务器调整 ...

  6. 珠穆朗玛币王:11月22日是谁丢了136亿美元

    珠穆朗玛币王:11月22日是谁丢了136亿美元 昨天,一篇名为"上百亿美元比特币已永久丢失"的微博,在短时间内登上热搜榜. 这篇文章的根源,是区块链数据分析服务提供商Coin Me ...

  7. 古剑奇谭二服务器维护,《古剑奇谭二》11月22日例行维护更新公告

    为不断丰富游戏内容,给各位偃师大人提供良好的游戏环境,我们将于2018年11月22日08:00进行版本更新,此次更新为停服更新,预计维护时间为2个小时.请各位大人注意调整游戏时间,并相互转告.如果预定 ...

  8. 吃鸡服务器修改测试服,绝地求生测试服更新内容_绝地求生测试服11月22日更新了什么_52pk单机游戏...

    第二个测试服务器时间表 第一次发布 - > 11月22日11:00-11月24日16:00 第二次发布 - > 11月28日11:00-11月30日17:00 注:但不一定是可以实际游玩的 ...

  9. 失业日记 11月22日

    11月22日 晴 周日 早上起来吃完早餐,50多的Miss Z 发消息来说今天我们一家出去玩吗?想跟我们出去玩一次.本来我们是打算在家里休息一天的,毕竟现在疫情期间,周边都玩遍了,其他城市又封锁去不了 ...

  10. 王者服务器维护11月,王者荣耀11月22日更新维护公告 王者荣耀更新内容汇总

    王者荣耀的正式服即将在11月22日进行一次新版本的更新,此次的更新内容跟之前曝光的11月19日的抢先服的更新内容一致,很多玩家还不知道更新了什么,下面就来为大家详细的介绍一下. [更新内容] 一.英雄 ...

最新文章

  1. linux终端密码星星,如何在Ubuntu终端中显示密码星号
  2. 获得jar包存放路径的方法
  3. 结课作业:云计算在物联网中的应用发展
  4. 武汉网络推广教大家如何编辑出更高质量的文章TDK?
  5. IDEA中创建类时,自动在文件头中添加作者以及创建时间
  6. mysql中find_in_set()函数的使用及in()用法详解
  7. Chrome用户不喜新版:宁用其他浏览器也不要用旧版本
  8. SpringCloud 阶段总结
  9. 链表——【线性表(二)】
  10. GenerateResource”任务意外失败的解决方法
  11. SpringAOP和AspectJ
  12. 点击头像上传文件的效果
  13. 微信支付 第一次成功,其他无法调起,返回-1(Android eclipse 微信支付之大坑 签名工具问题)
  14. Js 模式对话框(转)
  15. java的字符串的加密_Java加密解密字符串
  16. c语言编程题-输出素数
  17. 产学研2.0:麦可思大学生就业据、企业创新调查年鉴(含产学研部分)、RD相关数据等
  18. 智能安防 | 太阳能低功耗视频监控解决方案
  19. 小布老师_Oracle11g SQL基础入门系列培训(视频教学)
  20. 虚拟机ubuntu左侧和上方工具栏消失

热门文章

  1. 创新创业2020答案---【快捷查询】
  2. 【5G NR】无线承载SRB和DRB
  3. 360无线升级服务器密码,360路由器P3管理密码是多少?
  4. 华为手机文件存放目录
  5. 【计算机图形学】三维图形投影和消隐(正等轴测投影图 消隐图构造)
  6. 解决SVN中合并过的代码不能重新合并的问题
  7. 困于二手电商打转,转转拿什么“拯救世界”?
  8. Vue3快速搭建后台管理系统
  9. 气传导蓝牙耳机哪个品牌好、音质最好的气传导耳机推荐
  10. 欧奈尔行业排名天天更新