Julia与R/Python/MATLAB比较及Julia中的Text Analysis模块
生活随笔
收集整理的這篇文章主要介紹了
Julia与R/Python/MATLAB比较及Julia中的Text Analysis模块
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
http://site.douban.com/146782/widget/notes/15468638/note/356127615/
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
????????上午等著R跑數,R是出了名的慢,特別是處理文本時。無聊中,刷了一遍微博,驚現R界的掃地僧(謝益輝語)宮雨放出了RJulia。GitHub地址在此,https://github.com/armgong/RJulia,各位看官可以觀賞了。
????????很欣賞Julia以及維護Julia的那幫同志們,但用者實在過少,包也少得可憐,不過現在總算看到一點希望。
????????講這么多,Julia到底是干嘛的,首先Julia是一門編程語言,偏數學的編程語言。大家看我把Julia、python、R、matlab的圖標放一起;以及如果大家查看其官方wiki時,看到它與其他三種比較時,你就知道這貨是干什么用的。
????????對于Julia本身我就不多作介紹,有興趣的自然會去了解(恐怕有興趣的不會多),我這里貼一個《程序員》對Julia四位發明者的訪談?http://www.csdn.net/article/2014-03-12/2818732/1
????????還是簡單說一下,交待一下背景,Julia脫胎于MATLAB,類似于R脫胎于S-PLUS,語言風格集成了C、python、ruby、perl,當然少不了MATLAB(是不是挺像編程語言界的五仁月餅,跟swift有得一比),我自己感覺確實挺簡單易用。Julia的發明者都是資深的MATLAB使用者,所以,你知道。。。。。。
????????Julia最大的賣點就是處理速度,作為一門動態語言,它幾乎具備跟靜態語言,如C語言一般的效率,在這一點上它甩出R得有N條街,下圖是官網貼出的測試結果:
????????好像說到這里我還沒說Julia是干嘛的,科學計算,這是它的第一任務;與winpython平臺類似。
好了,到這了也該真正比較以下這幾個平臺(比較內容非原創)
與 MATLAB 的區別
Julia 的語法和 MATLAB 很像。但 Julia 不是簡單地復制 MATLAB ,它們有很多句法和功能上的區別。以下是一些值得注意的區別:
????數組用方括號來索引, A[i,j]
????數組是用引用來賦值的。在 A=B 之后,對 B 賦值也會修改 A
????使用引用來傳遞和賦值。如果一個函數修改了數組,調用函數會發現值也變了
????Matlab combines allocation and assignment into single statements, e.g., a(4) = 3.2 creates the array a = [0 0 0 3.2] and a(5) = 7 grows it. Julia separates allocation and assignment: if a is of length 4, a[5] = 7 yields an error. Julia has a push! function which grows Vectors much more efficiently than Matlab’s a(end+1) = val.
????虛數單位 sqrt(-1) 用 im 來表示
????多返回值和多重賦值需要使用圓括號,如 return (a, b) 和 (a, b) = f(x)
????Julia 有一維數組。列向量的長度為 N ,而不是 Nx1 。例如, rand(N) 生成的是一維數組
????使用語法 [x,y,z] 來連接標量或數組,連接發生在第一維度(“垂直”)上。對于第二維度(“水平”)上的連接,需要使用空格,如 [x y z] 。 要想構造塊矩陣,盡量使用語法 [a b; c d]
????a:b 和 a:b:c 中的冒號,用來構造 Range 對象。使用 linspace 構造一個滿向量,或者通過使用方括號來“連接”范圍,如 [a:b]
????函數返回須使用 return 關鍵字,而不是把它們列在函數定義中(詳見 return 關鍵字 )
????一個文件可以包含多個函數,文件被載入時,所有的函數定義都是外部可見的
????sum, prod, max 等約簡操作,如果被調用時參數只有一個,作用域是數組的所有元素,如 sum(A)
????sort 等函數,默認按列方向操作。( sort(A) 等價于 sort(A,1) )。要想排序 1xN 的矩陣,使用 sort(A,2)
????即使是無參數的函數,也要使用圓括號,如 tic() 和 toc()
????表達式結尾不要使用分號。表達式的結果不會自動顯示(除非在交互式提示符下)。 println 函數可以用來打印值并換行
????若 A 和 B 是數組, A == B 并不返回布爾值數組。應該使用 A .== B 。其它布爾值運算符可以類比, <, >, != 等
????The operators &, |, and $ perform the bitwise operations and, or, and xor, respectively, and have precedence similar to Python’s bitwise operators (not like C). They can operate on scalars or elementwise across arrays and can be used to combine logical arrays, but note the difference in order of operations—parentheses may be required (e.g., to select elements of A equal to 1 or 2 use (A .== 1) | (A .== 2)).
????可以用 ... 把集合中的元素作為參數傳遞給函數,如 xs=[1,2]; f(xs...)
????Julia 中 svd 返回的奇異值是向量而不是完整的對角矩陣
????Julia 中 ... 不用來將一行代碼拆成多行
????變量 ans 是交互式會話中執行的最后一條表達式的值;以其它方式執行的表達式的值,不會賦值給它
????The closest analog to Julia’s types are Matlab’s classes. Matlab’s structs behave somewhere between Julia’s types and Dicts; in particular, if you need to be able to add fields to a struct on-the-fly, use a Dict rather than a type.
與 R 的區別
Julia 也想成為數據分析和統計編程的高效語言。與 R 的區別:
????使用 = 賦值,不提供 <- 或 <<- 等箭頭式運算符
????用方括號構造向量。Julia 中 [1, 2, 3] 等價于 R 中的 c(1, 2, 3)
????Julia 的矩陣運算比 R 更接近傳統數學語言。如果 A 和 B 是矩陣,那么矩陣乘法在 Julia 中為 A * B , R 中為 A %*% B 。在 R 中,第一個語句表示的是逐元素的 Hadamard 乘法。要進行逐元素點乘,Julia 中為 A .* B
????使用 ' 運算符做矩陣轉置。 Julia 中 A' 等價于 R 中 t(A)
????寫 if 語句或 for 循環時不需要寫圓括號:應寫 for i in [1, 2, 3] 而不是 for (i in c(1, 2, 3)) ;應寫 if i == 1 而不是 if (i == 1)
????0 和 1 不是布爾值。不能寫 if (1) ,因為 if 語句僅接受布爾值作為參數。應寫成 if true
????不提供 nrow 和 ncol 。應該使用 size(M, 1) 替代 nrow(M) ;使用 size(M, 2) 替代 ncol(M)
????Julia 的 SVD 默認為非 thinned ,與 R 不同。要得到與 R 一樣的結果,應該對矩陣 X 調用 svd(X, true)
????Julia 區分標量、向量和矩陣。在 R 中, 1 和 c(1) 是一樣的。在 Julia 中,它們完全不同。例如若 x 和 y 為向量,則 x' * y 是一個單元素向量,而不是標量。要得到標量,應使用 dot(x, y)
????Julia 中的 diag() 和 diagm() 與 R 中的不同
????Julia 不能在賦值語句左側調用函數:不能寫 diag(M) = ones(n)
????Julia 不贊成把 main 命名空間塞滿函數。大多數統計學函數可以在 擴展包 中找到,比如 DataFrames 和 Distributions 包:
????????????Distributions 包 提供了概率分布函數
????????????DataFrames 包 提供了數據框架
????????????GLM 公式必須要轉義:使用 :(y ~ x) ,而不是 y ~ x
????Julia 提供了多元組和哈希表,但不提供 R 的列表。當返回多項時,應該使用多元組:不要使用 list(a = 1, b = 2) ,應該使用 (1, 2)
????鼓勵自定義類型。Julia 的類型比 R 中的 S3 或 S4 對象簡單。Julia 的重載系統使 table(x::TypeA) 和 table(x::TypeB) 等價于 R 中的 table.TypeA(x) 和 table.TypeB(x)
????在 Julia 中,傳遞值和賦值是靠引用。如果一個函數修改了數組,調用函數會發現值也變了。這與 R 非常不同,這使得在大數據結構上進行新函數操作非常高效
????使用 hcat 和 vcat 來連接向量和矩陣,而不是 c, rbind 和 cbind
????Julia 的范圍對象如 a:b 與 R 中的定義向量的符號不同。它是一個特殊的對象,用于低內存開銷的迭代。要把范圍對象轉換為向量,應該用方括號把范圍對象括起來 [a:b]
????Julia 有許多函數可以修改它們的參數。例如, sort(v) 和 sort!(v) 函數中,帶感嘆號的可以修改 v
????colMeans() 和 rowMeans(), size(m, 1) 和 size(m, 2)
????在 R 中,需要向量化代碼來提高性能。在 Julia 中與之相反:使用非向量化的循環通常效率最高
????與 R 不同,Julia 中沒有延時求值
????不提供 NULL 類型
????Julia 中沒有與 R 的 assign 或 get 所等價的語句
與 Python 的區別
????對數組、字符串等索引。Julia 索引的下標是從 1 開始,而不是從 0 開始
????索引列表和數組的最后一個元素時,Julia 使用 end ,Python 使用 -1
????Julia 中的 Comprehensions (還)沒有條件 if 語句
????for, if, while, 等塊的結尾需要 end ;不強制要求縮進排版
????Julia 沒有代碼分行的語法:如果在一行的結尾,輸入已經是個完整的表達式,就直接執行;否則就繼續等待輸入。強迫 Julia 的表達式分行的方法是用圓括號括起來
????Julia 總是以列為主序的(類似 Fortran ),而 numpy 數組默認是以行為主序的(類似 C )。如果想優化遍歷數組的性能,從 numpy 到 Julia 時應改變遍歷的順序。
????????下面又要回到我自己說的話了。Julia對文本處理的能力應該不被質疑的,但擴展包少得可憐,拿得出手的也就是TextAnalysis模塊了,以下是該包的outline:
????Installation
????Getting Started
????Creating Documents
????????StringDocument
????????FileDocument
????????TokenDocument
????????NGramDocument
????Basic Functions for Working with Documents
????????text
????????tokens
????????ngrams
????Document Metadata
????????language
????????name
????????author
????????timestamp
????Preprocessing Documents
????????Removing Corrupt UTF8
????????Removing Punctuation
????????Removing Case Distinctions
????????Removing Words
????????????Stop Words
????????????Articles
????????????Indefinite Articles
????????????Definite Articles
????????????Prepositions
????????????Pronouns
????????Stemming
????????Removing Rare Words
????????Removing Sparse Words
????Creating a Corpus
????Processing a Corpus
????Corpus Statistics
????????Lexicon
????????Inverse Index
????Creating a Document Term Matrix
????Creating Individual Rows of a Document Term Matrix
????The Hash Trick
????????Hashed DTV's
????????Hashed DTM's
????TF-IDF
????LSA: Latent Semantic Analysis
????LDA: Latent Dirichlet Allocation
????Extended Usage Example: Analyzing the State of the Union Addresses
????????基本上傳統的NLP功能都有囊括,不過相對于python的nltk來說,那就是小巫見大巫了。不過我現在能做的事情也就是看好了。吃螃蟹的代價太大,在時間成本還不是很高的情況下,python和R還是首選。對了,該包的GitHub地址是https://github.com/johnmyleswhite/TextAnalysis.jl
| ? |
????????上午等著R跑數,R是出了名的慢,特別是處理文本時。無聊中,刷了一遍微博,驚現R界的掃地僧(謝益輝語)宮雨放出了RJulia。GitHub地址在此,https://github.com/armgong/RJulia,各位看官可以觀賞了。
????????很欣賞Julia以及維護Julia的那幫同志們,但用者實在過少,包也少得可憐,不過現在總算看到一點希望。
????????講這么多,Julia到底是干嘛的,首先Julia是一門編程語言,偏數學的編程語言。大家看我把Julia、python、R、matlab的圖標放一起;以及如果大家查看其官方wiki時,看到它與其他三種比較時,你就知道這貨是干什么用的。
????????對于Julia本身我就不多作介紹,有興趣的自然會去了解(恐怕有興趣的不會多),我這里貼一個《程序員》對Julia四位發明者的訪談?http://www.csdn.net/article/2014-03-12/2818732/1
????????還是簡單說一下,交待一下背景,Julia脫胎于MATLAB,類似于R脫胎于S-PLUS,語言風格集成了C、python、ruby、perl,當然少不了MATLAB(是不是挺像編程語言界的五仁月餅,跟swift有得一比),我自己感覺確實挺簡單易用。Julia的發明者都是資深的MATLAB使用者,所以,你知道。。。。。。
????????Julia最大的賣點就是處理速度,作為一門動態語言,它幾乎具備跟靜態語言,如C語言一般的效率,在這一點上它甩出R得有N條街,下圖是官網貼出的測試結果:
| ? |
????????好像說到這里我還沒說Julia是干嘛的,科學計算,這是它的第一任務;與winpython平臺類似。
好了,到這了也該真正比較以下這幾個平臺(比較內容非原創)
與 MATLAB 的區別
Julia 的語法和 MATLAB 很像。但 Julia 不是簡單地復制 MATLAB ,它們有很多句法和功能上的區別。以下是一些值得注意的區別:
????數組用方括號來索引, A[i,j]
????數組是用引用來賦值的。在 A=B 之后,對 B 賦值也會修改 A
????使用引用來傳遞和賦值。如果一個函數修改了數組,調用函數會發現值也變了
????Matlab combines allocation and assignment into single statements, e.g., a(4) = 3.2 creates the array a = [0 0 0 3.2] and a(5) = 7 grows it. Julia separates allocation and assignment: if a is of length 4, a[5] = 7 yields an error. Julia has a push! function which grows Vectors much more efficiently than Matlab’s a(end+1) = val.
????虛數單位 sqrt(-1) 用 im 來表示
????多返回值和多重賦值需要使用圓括號,如 return (a, b) 和 (a, b) = f(x)
????Julia 有一維數組。列向量的長度為 N ,而不是 Nx1 。例如, rand(N) 生成的是一維數組
????使用語法 [x,y,z] 來連接標量或數組,連接發生在第一維度(“垂直”)上。對于第二維度(“水平”)上的連接,需要使用空格,如 [x y z] 。 要想構造塊矩陣,盡量使用語法 [a b; c d]
????a:b 和 a:b:c 中的冒號,用來構造 Range 對象。使用 linspace 構造一個滿向量,或者通過使用方括號來“連接”范圍,如 [a:b]
????函數返回須使用 return 關鍵字,而不是把它們列在函數定義中(詳見 return 關鍵字 )
????一個文件可以包含多個函數,文件被載入時,所有的函數定義都是外部可見的
????sum, prod, max 等約簡操作,如果被調用時參數只有一個,作用域是數組的所有元素,如 sum(A)
????sort 等函數,默認按列方向操作。( sort(A) 等價于 sort(A,1) )。要想排序 1xN 的矩陣,使用 sort(A,2)
????即使是無參數的函數,也要使用圓括號,如 tic() 和 toc()
????表達式結尾不要使用分號。表達式的結果不會自動顯示(除非在交互式提示符下)。 println 函數可以用來打印值并換行
????若 A 和 B 是數組, A == B 并不返回布爾值數組。應該使用 A .== B 。其它布爾值運算符可以類比, <, >, != 等
????The operators &, |, and $ perform the bitwise operations and, or, and xor, respectively, and have precedence similar to Python’s bitwise operators (not like C). They can operate on scalars or elementwise across arrays and can be used to combine logical arrays, but note the difference in order of operations—parentheses may be required (e.g., to select elements of A equal to 1 or 2 use (A .== 1) | (A .== 2)).
????可以用 ... 把集合中的元素作為參數傳遞給函數,如 xs=[1,2]; f(xs...)
????Julia 中 svd 返回的奇異值是向量而不是完整的對角矩陣
????Julia 中 ... 不用來將一行代碼拆成多行
????變量 ans 是交互式會話中執行的最后一條表達式的值;以其它方式執行的表達式的值,不會賦值給它
????The closest analog to Julia’s types are Matlab’s classes. Matlab’s structs behave somewhere between Julia’s types and Dicts; in particular, if you need to be able to add fields to a struct on-the-fly, use a Dict rather than a type.
與 R 的區別
Julia 也想成為數據分析和統計編程的高效語言。與 R 的區別:
????使用 = 賦值,不提供 <- 或 <<- 等箭頭式運算符
????用方括號構造向量。Julia 中 [1, 2, 3] 等價于 R 中的 c(1, 2, 3)
????Julia 的矩陣運算比 R 更接近傳統數學語言。如果 A 和 B 是矩陣,那么矩陣乘法在 Julia 中為 A * B , R 中為 A %*% B 。在 R 中,第一個語句表示的是逐元素的 Hadamard 乘法。要進行逐元素點乘,Julia 中為 A .* B
????使用 ' 運算符做矩陣轉置。 Julia 中 A' 等價于 R 中 t(A)
????寫 if 語句或 for 循環時不需要寫圓括號:應寫 for i in [1, 2, 3] 而不是 for (i in c(1, 2, 3)) ;應寫 if i == 1 而不是 if (i == 1)
????0 和 1 不是布爾值。不能寫 if (1) ,因為 if 語句僅接受布爾值作為參數。應寫成 if true
????不提供 nrow 和 ncol 。應該使用 size(M, 1) 替代 nrow(M) ;使用 size(M, 2) 替代 ncol(M)
????Julia 的 SVD 默認為非 thinned ,與 R 不同。要得到與 R 一樣的結果,應該對矩陣 X 調用 svd(X, true)
????Julia 區分標量、向量和矩陣。在 R 中, 1 和 c(1) 是一樣的。在 Julia 中,它們完全不同。例如若 x 和 y 為向量,則 x' * y 是一個單元素向量,而不是標量。要得到標量,應使用 dot(x, y)
????Julia 中的 diag() 和 diagm() 與 R 中的不同
????Julia 不能在賦值語句左側調用函數:不能寫 diag(M) = ones(n)
????Julia 不贊成把 main 命名空間塞滿函數。大多數統計學函數可以在 擴展包 中找到,比如 DataFrames 和 Distributions 包:
????????????Distributions 包 提供了概率分布函數
????????????DataFrames 包 提供了數據框架
????????????GLM 公式必須要轉義:使用 :(y ~ x) ,而不是 y ~ x
????Julia 提供了多元組和哈希表,但不提供 R 的列表。當返回多項時,應該使用多元組:不要使用 list(a = 1, b = 2) ,應該使用 (1, 2)
????鼓勵自定義類型。Julia 的類型比 R 中的 S3 或 S4 對象簡單。Julia 的重載系統使 table(x::TypeA) 和 table(x::TypeB) 等價于 R 中的 table.TypeA(x) 和 table.TypeB(x)
????在 Julia 中,傳遞值和賦值是靠引用。如果一個函數修改了數組,調用函數會發現值也變了。這與 R 非常不同,這使得在大數據結構上進行新函數操作非常高效
????使用 hcat 和 vcat 來連接向量和矩陣,而不是 c, rbind 和 cbind
????Julia 的范圍對象如 a:b 與 R 中的定義向量的符號不同。它是一個特殊的對象,用于低內存開銷的迭代。要把范圍對象轉換為向量,應該用方括號把范圍對象括起來 [a:b]
????Julia 有許多函數可以修改它們的參數。例如, sort(v) 和 sort!(v) 函數中,帶感嘆號的可以修改 v
????colMeans() 和 rowMeans(), size(m, 1) 和 size(m, 2)
????在 R 中,需要向量化代碼來提高性能。在 Julia 中與之相反:使用非向量化的循環通常效率最高
????與 R 不同,Julia 中沒有延時求值
????不提供 NULL 類型
????Julia 中沒有與 R 的 assign 或 get 所等價的語句
與 Python 的區別
????對數組、字符串等索引。Julia 索引的下標是從 1 開始,而不是從 0 開始
????索引列表和數組的最后一個元素時,Julia 使用 end ,Python 使用 -1
????Julia 中的 Comprehensions (還)沒有條件 if 語句
????for, if, while, 等塊的結尾需要 end ;不強制要求縮進排版
????Julia 沒有代碼分行的語法:如果在一行的結尾,輸入已經是個完整的表達式,就直接執行;否則就繼續等待輸入。強迫 Julia 的表達式分行的方法是用圓括號括起來
????Julia 總是以列為主序的(類似 Fortran ),而 numpy 數組默認是以行為主序的(類似 C )。如果想優化遍歷數組的性能,從 numpy 到 Julia 時應改變遍歷的順序。
????????下面又要回到我自己說的話了。Julia對文本處理的能力應該不被質疑的,但擴展包少得可憐,拿得出手的也就是TextAnalysis模塊了,以下是該包的outline:
????Installation
????Getting Started
????Creating Documents
????????StringDocument
????????FileDocument
????????TokenDocument
????????NGramDocument
????Basic Functions for Working with Documents
????????text
????????tokens
????????ngrams
????Document Metadata
????????language
????????name
????????author
????????timestamp
????Preprocessing Documents
????????Removing Corrupt UTF8
????????Removing Punctuation
????????Removing Case Distinctions
????????Removing Words
????????????Stop Words
????????????Articles
????????????Indefinite Articles
????????????Definite Articles
????????????Prepositions
????????????Pronouns
????????Stemming
????????Removing Rare Words
????????Removing Sparse Words
????Creating a Corpus
????Processing a Corpus
????Corpus Statistics
????????Lexicon
????????Inverse Index
????Creating a Document Term Matrix
????Creating Individual Rows of a Document Term Matrix
????The Hash Trick
????????Hashed DTV's
????????Hashed DTM's
????TF-IDF
????LSA: Latent Semantic Analysis
????LDA: Latent Dirichlet Allocation
????Extended Usage Example: Analyzing the State of the Union Addresses
????????基本上傳統的NLP功能都有囊括,不過相對于python的nltk來說,那就是小巫見大巫了。不過我現在能做的事情也就是看好了。吃螃蟹的代價太大,在時間成本還不是很高的情況下,python和R還是首選。對了,該包的GitHub地址是https://github.com/johnmyleswhite/TextAnalysis.jl
總結
以上是生活随笔為你收集整理的Julia与R/Python/MATLAB比较及Julia中的Text Analysis模块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSS 3 学习——transform
- 下一篇: wav封装格式