1. 程式人生 > >(初學者)用Python進行自然語言處理筆記一

(初學者)用Python進行自然語言處理筆記一

Python程式設計

連結串列list

在Python中連結串列的表示為:[](這是一個空連結串列),或者[‘A’,’B’].list中的元素是允許重複的!

##########有關列表的基本操作##############
#定義一個空連結串列
list1=[]
list1.appen(1)#在連結串列中中追加內容
#list1:[1]
list.append(2)
#list1:[1,2]
list1.append('A')
#list1:[1,2,'A']
print list1[1]#根據索引取資料
# 2,注意索引是從0開始的
print list1[0]#取出列表中的第一個元素
# 1 print list1[-1]#取出列表中的倒數第一個元素 # 'A' print len(list1)#求列表的長度 # 3 del list1[0]#刪除列表中的第一個元素 #此時的list1變為:[2,'A'] #列表之間的操作 list1=[1,2,3] list2=[4,5,6] list3=list1+list2 # +表示組合列表 #list3:[1,2,3,4,5,6] list1=[1,2] list2=list1*4 # *表示重複列表 #list2=[1,2,1,2,1,2,1,2] #判斷某一元素是否在連結串列中: if 2 in [1,2,3]: print
True else: print False # 結果為:True #迭代(迴圈列表) for x in [1,2,3]: print x ''' 輸出結果為: 1 2 3 ''' #列表的擷取或者切片 list1=['A','B','C','D'] list2=list1[1:]#從第二個元素開始擷取列表 #list2:['B','C','D'] list3=[:-1]#擷取列表截止到倒數第一個之前 #list3:['A','B','C'] list4=[:3]#擷取列表截止到第四個元素之前 #list4:['A','B','C'] #列表函式和方法 cmp(list1,list2) ''' 如果比較的元素是同類型的,則比較其值,返回結果。 如果兩個元素不是同一種類型,則檢查它們是否是數字。 如果是數字,執行必要的數字強制型別轉換,然後比較。 如果有一方的元素是數字,則另一方的元素"大"(數字是"最小的") 否則,通過型別名字的字母順序進行比較。 如果有一個列表首先到達末尾,則另一個長一點的列表"大"。 如果我們用盡了兩個列表的元素而且所 有元素都是相等的,那麼結果就是個平局,就是說返回一個 0。 '''
#!/usr/bin/python list1, list2 = [123, 'xyz'], [456, 'abc'] print cmp(list1, list2); print cmp(list2, list1); list3 = list2 + [786]; print cmp(list2, list3) 以上例項輸出結果如下: -1 1 -1 #求最大最小 list1=[1,2,3,4] print max(list) # 4 test=['A','B','C','D',1,3] print max(test) # 'D' 注意在左右的字元中,數字是最小的 print min(list1)#求最小 # 1 list1=[1,2,2,2,3,4,4,5] print list1.count(2) # 3 統計元素‘2’出現的次數 print list1.index(2)#從列表中找出某個值第一個匹配項的索引位置 list1.insert(2,'A')#在索引2處插入元素‘A’ #list1:[1,2,'A',2,2,3,4,4,5] print list1.pop()#移除列表中的最後一個元素,並返回值 #此時的list1變為:[1,2,'A',2,2,3,4,4] print list1.pop(3)#移除索引3處的元素,並返回此處的值 list1.remove(4)#移除第一個元素4的匹配項,注意remove不返回值 #此時的list1變為[1,2,'A',2,2,3,4] list1.reverse()#反向列表中的元素,也不能返回任何東西 print list1 #[4,3,2,2,'A',2,1] list1.sort()#原表進行排序,按照升序排序 #[1, 2, 2, 2, 3, 4, 'A']

集合set

在Python中集合用()來表表示,例如()表示一個空集合。set中的元素是不允許重複的!

##################有關集合的基本操作#############
#定義一個空集合
a=set()
#或者
a=('boy')
print a
#set(['y', 'b', 'o'])

#python集合的新增有兩種常用的方法,分別是add和update。
集合add方法:是把要傳入的元素作為一個整體新增到集合中,例如“
”
>>> a = set('boy')
>>> a.add('python')
>>> a
set(['y', 'python', 'b', 'o'])

集合update方法:是把要傳入的元素拆分,做為個體傳入到集合中,例如:
>>> a = set('boy')
>>> a.update('python')
>>> a
set(['b', 'h', 'o', 'n', 'p', 't', 'y'])

集合刪除操作方法:remove
set(['y', 'python', 'b', 'o'])
>>> a.remove('python')
>>> a
set(['y', 'b', 'o'])

集合的交集、合集(並集)、差集,瞭解python集合set與列表list的這些非常好用的功能前,要先了解一些集合操作符號:

統計詞頻 呼叫nltk模組中的FreqDist

#呼叫FreqDist統計詞頻
from nltk import FreqDist
import jieba

words=jieba.cut(test_str)
fdis1=FreqDist(words)
print fdis1
print fdis1.N()
for key in fdis1.keys():
    print key,fdis1[key]
print len(fdis1.keys())
print len(set(fdis1.keys()))

雙詞搭配 呼叫nltk 中的bigrams

from nltk import bigrams
bi=bigrams(['我','們','祖','國'])
for w in bi:
    print w[0],w[1]
print fdis1.max()
print fdis1[u',']

自動理解自然語言

詞意消歧

 在詞意消歧中,我們要算出特定上下文中的詞被賦予的是哪個意思。漢語博大精深,存在一詞多義的情況,這個時候我們就要根據詞的上下文,賦予其真正的含義。換句話說,自動消除歧義需要使用上下文,利用相鄰詞彙有相近含義(相鄰詞所表示的含義肯定是同領域,同語境和意境下的)這樣一個簡單的事實。

指代消解

一種跟深刻的語言理解是解決“誰對誰做了什麼”,即檢測主語和動詞的賓語都是誰。
 處理這個問題的計算技術包括:
 指代消解(anaphora resolution)-----確定代詞或者名詞短語指的是什麼。
 語義角色標註(Semantic role labeling)----確定名詞短語如何與動詞相關。

自動生成語言

如果我們能夠解決自動語言理解等問題,我們將能夠繼續那些包含自動生成語言的任務,如自動問答和機器翻譯等。在這些任務重,計算機主要需要弄清楚詞的含義、動作的主語以及代詞的先行詞是理解句子含義的步驟,也是我們希望語言理解系統能夠做到的事情。

機器翻譯

       長久以來,機器翻譯(MT)都是語言理解的聖盃,人們希望能夠找到從根本上提供高質量的符合語言習慣的任意兩種語言之間的解釋。
       機器翻譯是困難的,因為一個給定的詞可能有幾種不同的解釋(取決於它的意思),也因為必須改變詞序才能與目標語言的語法結構保持一致。

人機對話系統

    在人工智慧的歷史,主要的智慧測試一個語言學測試,叫做圖靈測試。
    圖靈測試:一個響應使用者文字輸入的對話系統能夠表現的自然到我們無法區分它是人還是計算機。
    對話系統給我們一個機會來說說一般認為的NLP 流程。下圖顯示了一個簡單的對話系統架構。沿圖的頂部從左向右是一些語言理解元件的“管道”。這些元件從語音輸入經過文法分析到某種意義的重現。圖的中間,從右向左是這些元件的逆向流程,將概念轉換為語音。這些元件構成了系統的動態方面。在圖的底部是一些有代表性的靜態資訊:語言相關的資料倉庫,這些用於處理的元件在其上運作。  
這裡寫圖片描述

文字的含義

近年來,一個叫做文字含義識別(Recognizing Textual Entailment 簡稱RTE)的公開的“共享任務”使語言理解所面臨的挑戰成為關注焦點。基本情形很簡單:假設你想找到證據來支援一個假設:Sandra Goudie 被Max Purnell 擊敗了。而你有一段簡短的文字似乎是有關的,例如:Sandra Goudie 在2002 年國會選舉首次當選,通過擊敗工黨候選人Max Purnell 將現任綠黨下院議員Jeanette Fitzsimons 推到第三位,以微弱優勢贏得了Coromandel 席位。文字是否為你接受假說提供了足夠的證據呢?在這種特殊情況下,答案是“否”。你可以很容易得出這樣的結論,但使用自動方法做出正確決策是困難的。RTE 挑戰為競賽者開發他們的系統提供資料,但這些資料對“蠻力”機器學習技術(我們將在第6 章講述這一主題)來說是不夠的。因此,一些語言學分析是至關重要的。在前面的例子中,很重要的一點是讓系統知道Sandra Goudie 是假設中被擊敗的人,而不是文字中擊敗別人的人。

NLP的侷限性

儘管在很多如RTE 這樣的任務中研究取得了進展,但在現實世界的應用中已經部署的語言理解系統仍然不能進行常識推理或以一種一般的可靠的方式描繪這個世界的知識。我們在等待這些困難的人工智慧問題得到解決的同時,接受一些在推理和知識能力上存在嚴重限制的自然語言系統是有必要的。因此,從一開始,自然語言處理研究的一個重要目標一直是使用淺顯但強大的技術代替無邊無際的知識和推理能力,促進構建“語言理解”技術的艱鉅任務的不斷取得進展。

《本節完》

            所謂的不平凡就是平凡的N次冪。
                                        ------By Ada