前景提示
- 一個朋友參加面試,在成都面的一家,問我如何給一篇沒有標題的文章取個標題,是根據內容分析內容,然後獲取標題,寫個程序讓程序分析內容,提煉出一個最適合的標題.
- 提示:先找出高頻率的關鍵詞,然後再根據段首段尾段中的不同權重結合同一個關鍵詞出現的頻率來綜合判斷,最後取一個權重最高,重複最多的詞作爲標題.
思考
- 這種題目一般屬於大數據人工智能詞語分析功能,就根據這個去百度算法.
- 但是,算法用的是python方式實現的,但是,這邊都是Java開發,那麼Java開發如何實現呢?最簡單的方式就是Java調用python腳本,因爲Java不擅長做這種計算的工作.
企業級處理方案流程圖
- 企業級也是調用第三方, 因爲Java本身很耗內存,如果是幾百萬,上億的文檔效率會直線下降,所以,就使用Java調用計算能力更好的Python來做.
Python 實現的方式
pip install jieba
import jieba.analyse
sentence = "人工智能(Artificial Intelligence),英文縮寫爲AI。它是研究、開發用於模擬、延伸和擴展人的智能的理論、方法、技術及應用系統的一門新的技術科學。人工智能是計算機科學的一個分支,它企圖瞭解智能的實質,並生產出一種新的能以人類智能相似的方式做出反應的智能機器,該領域的研究包括機器人、語言識別、圖像識別、自然語言處理和專家系統等。人工智能從誕生以來,理論和技術日益成熟,應用領域也不斷擴大,可以設想,未來人工智能帶來的科技產品,將會是人類智慧的“容器”。人工智能可以對人的意識、思維的信息過程的模擬。人工智能不是人的智能,但能像人那樣思考、也可能超過人的智能。人工智能是一門極富挑戰性的科學,從事這項工作的人必須懂得計算機知識,心理學和哲學。人工智能是包括十分廣泛的科學,它由不同的領域組成,如機器學習,計算機視覺等等,總的說來,人工智能研究的一個主要目標是使機器能夠勝任一些通常需要人類智能才能完成的複雜工作。但不同的時代、不同的人對這種“複雜工作”的理解是不同的。2017年12月,人工智能入選“2017年度中國媒體十大流行語”。"
keywords = " ".join(jieba.analyse.extract_tags(sentence , topK=20, withWeight=False, allowPOS=()))
print(keywords)
Java實現
導入Maven包
<dependencies>
<dependency>
<groupId>org.python</groupId>
<artifactId>jython-standalone</artifactId>
<!--python版本是2.x還是3.x在這裏指定-->
<version>2.7.0</version>
</dependency>
</dependencies>
書寫代碼
public class App {
public static void main(String[] args) {
try {
String a = "人工智能(Artificial Intelligence),英文縮寫爲AI。它是研究、開發用於模擬、延伸和擴展人的智能的理論、方法、技術及應用系統的一門新的技術科學。人工智能是計算機科學的一個分支,它企圖瞭解智能的實質,並生產出一種新的能以人類智能相似的方式做出反應的智能機器,該領域的研究包括機器人、語言識別、圖像識別、自然語言處理和專家系統等。人工智能從誕生以來,理論和技術日益成熟,應用領域也不斷擴大,可以設想,未來人工智能帶來的科技產品,將會是人類智慧的“容器”。人工智能可以對人的意識、思維的信息過程的模擬。人工智能不是人的智能,但能像人那樣思考、也可能超過人的智能。人工智能是一門極富挑戰性的科學,從事這項工作的人必須懂得計算機知識,心理學和哲學。人工智能是包括十分廣泛的科學,它由不同的領域組成,如機器學習,計算機視覺等等,總的說來,人工智能研究的一個主要目標是使機器能夠勝任一些通常需要人類智能才能完成的複雜工作。但不同的時代、不同的人對這種“複雜工作”的理解是不同的。2017年12月,人工智能入選“2017年度中國媒體十大流行語”。";
System.out.println(".................start.................");
//設置命令行傳入參數
String[] str = new String[]{"python", "D:/workspace____java/anlysistSentence/src/main/resources/helloworld3.py",a};
Process pr = Runtime.getRuntime().exec(str);
BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream(),"gb2312"));
System.out.println();
String line;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
in.close();
pr.waitFor();
System.out.println();
System.out.println("..............end.................");
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
最終版本
# coding=utf-8
import jieba.analyse
import sys
jieba.setLogLevel(jieba.logging.INFO)
if __name__ == '__main__':
for i in range(1, len(sys.argv)):
sentence = sys.argv[i]
keywords = " ".join(jieba.analyse.extract_tags(
sentence,
topK=20,
withWeight=False,
allowPOS=()
))
print(keywords)
public class App {
public static void main(String[] args) {
try {
String a = "人工智能(Artificial Intelligence),英文縮寫爲AI。它是研究、開發用於模擬、延伸和擴展人的智能的理論、方法、技術及應用系統的一門新的技術科學。人工智能是計算機科學的一個分支,它企圖瞭解智能的實質,並生產出一種新的能以人類智能相似的方式做出反應的智能機器,該領域的研究包括機器人、語言識別、圖像識別、自然語言處理和專家系統等。人工智能從誕生以來,理論和技術日益成熟,應用領域也不斷擴大,可以設想,未來人工智能帶來的科技產品,將會是人類智慧的“容器”。人工智能可以對人的意識、思維的信息過程的模擬。人工智能不是人的智能,但能像人那樣思考、也可能超過人的智能。人工智能是一門極富挑戰性的科學,從事這項工作的人必須懂得計算機知識,心理學和哲學。人工智能是包括十分廣泛的科學,它由不同的領域組成,如機器學習,計算機視覺等等,總的說來,人工智能研究的一個主要目標是使機器能夠勝任一些通常需要人類智能才能完成的複雜工作。但不同的時代、不同的人對這種“複雜工作”的理解是不同的。2017年12月,人工智能入選“2017年度中國媒體十大流行語”。";
System.out.println(".................start.................");
//設置命令行傳入參數
String[] str = new String[]{"python", "D:/workspace____java/anlysistSentence/src/main/resources/helloworld3.py",a};
System.out.println(str);
Process pr = Runtime.getRuntime().exec(str);
BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream(),"gb2312"));
System.out.println();
String line;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
in.close();
pr.waitFor();
System.out.println();
System.out.println("..............end.................");
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
遺留問題:
-
1.jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())這個方法是寫死的,這裏的參數,都應該是外部傳遞進來控制的
-
2.現在的python腳本只是做print打印分析結果,應該是以return的方式返回結果.
-
- java接收到的python的返回結果如何處理,才能確定最終的標題選取
遇到問題
1.無法解析.
Exception in thread "main" SyntaxError: ("mismatched input ':' expecting NEWLINE", ('<string>', 1, 1, 'D:\\workspace____java\\anlysistSentence\\src\\main\\resources\\helloworld2.py\n'))
- 無法解析腳本的路徑.剛開始採用的是如下的帶碼方式,但是,這個只能解析簡單的語句,導入第三方包和執行腳本都會報錯,
public static void main(String[] args) {
//首先調用python的解釋器 ----------- 只能實現簡單的調用,調用的腳本中不能有第三方庫
PythonInterpreter interpreter = new PythonInterpreter();
//選擇執行的的Python語句
interpreter.exec("print ('hello')");
// 這裏就是無法解析
// interpreter.exec("D:\\workspace____java\\anlysistSentence\\src\\main\\resources\\helloworld2.py");
}
2.模塊找不到.
Traceback (most recent call last):
File "D:\workspace____java\anlysistSentence\src\main\resources\helloworld3.py", line 3, in <module>
import jieba.analyse
ModuleNotFoundError: No module named 'jieba'
- 解決方式就是用pip install jieba.
3.亂碼處理
- 首先要知道python的編碼格式是什麼.在代碼里加入如紅框代碼,然後,查看輸出.('cp936' 就是"gb2312")
- 因此要去除python腳本里的所有中文,無論註釋不註釋,在如下代碼里加入設置.
BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream(),"gb2312"));
版本
序號 |
描述 |
日期 |
1 |
第一版 |
2023-07-16 |
2 |
第二版 |
2023-07-24 |
繼續死命問
- 往死問:如果段首段尾的權重一樣,現在有不同的關鍵詞,重複的次數也一樣,那該取哪一個?
- 往死問:假設已經提出來一堆關鍵詞了,現在我要怎麼結合段落的權重來決定取哪一個做爲標題.
- 未完待續 .......